-
반정규화로 많이 사용되는 추출속성, 중복속성이란(feat. 성능개선)IT/DataModeling 2026. 3. 15. 15:25
안녕하세요, Archix 입니다!
반정규화 기법 중 실무에서 꽤 자주 보이는 추출속성과 중복속성을 정리했습니다. 이름만 들으면 낯설 수 있는데, 예시로 보면 바로 이해가 되실거에요.
📌 추출속성 / 중복속성이란?

한 문장으로 정리하면 이렇습니다.
이미 존재하는 속성으로 만들어낼 수 있는 속성
즉, 원래는 없어도 되는 속성인데 성능이나 편의를 위해 추가한 거예요.✅ 장점 : 조회 성능 향상 / SELECT 쿼리 개발이 쉬워짐
❌ 단점 : 속성 값이 미일치하는 경우가 발생할 수 있음
핵심은 이거예요.
성능상 이슈가 존재하는 경우에만 제한적으로 사용!
무분별하게 쓰면 데이터 정합성 문제가 생기기 때문에, 꼭 필요한 경우에만 사용해야합니다.
🔍 해당 모델에서 추출속성, 중복속성을 찾아보세요

위 ERD는 쇼핑몰 주문 시스템 모델입니다. 엔티티 구성은 다음과 같아요.
- 고객 : 고객번호, 고객명, 생년월일, 전화번호, 배송지주소
- 주문 : 주문번호, 고객번호(FK), 주문일시, 총주문금액, 배송지주소
- 주문상품 : 주문번호(FK), 상품번호(FK), 주문수량, 상품명
- 상품 : 상품번호, 상품명, 상품가격
스크롤 내리기 전에, 어떤 속성이 추출속성이고 중복속성인지 직접 찾아보세요.
✅ 추출속성, 중복속성은 이렇습니다

두 개념을 먼저 구분하면 이렇습니다.
추출 속성 : 다른 엔티티들과 참조해서 계산한 값을 저장하는 속성
중복 속성 : 단순히 조인을 피하고, 쿼리를 편하게 개발하려고 만들어놓은 속성이 ERD에서 각각에 해당하는 속성은 아래와 같습니다.
추출 속성 → 주문.총주문금액 주문상품의 수량 × 상품가격을 계산한 값이에요. 단순 복사가 아니라 여러 엔티티를 참조해서 계산한 결과라 추출속성입니다.
중복 속성 → 주문상품.상품명 / 주문.배송지주소 상품명은 상품 엔티티에, 배송지주소는 고객 엔티티에 이미 존재하는 값이에요. 조인 없이 바로 조회하려고 복사해둔 중복속성입니다.
🧩 추가 문제 — 회원의 나이, 배송의 발송여부는 어떤 속성일까요?

두 가지 케이스를 더 보겠습니다.
회원 엔티티의 나이 속성
- 회원번호
- 회원명
- 생년월일
- 나이 ← ?
나이는 생년월일만 있으면 계산할 수 있어요. → 중복속성입니다.
매번 CURRENT_DATE - 생년월일로 계산하는 대신 나이를 미리 저장해두면 조회 성능이 정말 아주 조금은 좋아질 수 있습니다.
하지만, 매년 업데이트가 안 되면 값이 틀려지는 문제가 생겨요. 이게 중복속성의 단점입니다.
배송 엔티티의 택배사발송여부 속성
- 배송번호
- 주문번호(FK)
- 송장번호
- 택배사발송여부 ← ?
택배사발송여부는 송장번호가 존재하면 판단할 수 있어요. → 중복속성입니다.
송장번호가 IS NOT NULL이면 발송, NULL이면 미발송으로 유추가 가능합니다.
🎯 결론

중복 속성은 최소화, 추출 속성은 성능 이슈가 있는 경우 사용
두 속성 모두 반정규화 기법이에요.
단, 두 속성 모두 데이터 정합성 문제가 생길 수 있어요. 원본 데이터가 바뀌면 추출/중복속성도 같이 업데이트해줘야 하는데, 이걸 놓치면 값이 달라지는 상황이 발생합니다. 편의를 위해 추가했다가 오히려 유지보수 비용이 올라갈 수 있으니, 꼭 필요한 경우에만 제한적으로 사용하는 게 좋습니다. 물론, 단순히 조인을 피하고자, 귀찮아서 추가하는 중복속성은 더욱 더 최소화해야합니다.
더 자세한 내용이 궁금하다면 아래 강의를 참고해주세요!

쉽게 배우는 데이터 모델링 : 기본부터 실전 테이블 설계까지 (DASP/DAP) (강의 링크 : https://inf.run/nxhnr)
'IT > DataModeling' 카테고리의 다른 글
엔티티(Entity)가 뭐에요 ?? (0) 2026.03.06 댓글