주문 1건을 읽는 관점

저장 구조가 바뀌면 조회 방식과 주문 시점 보존 방식도 함께 바뀝니다.

정규화는 중복을 줄이기 위해 값을 분리 저장하고, 반정규화는 함께 읽을 값을 한 문서에 모아 읽기와 이력 보존을 단순하게 만듭니다.

RDB 정규화 역할별 테이블로 나눠 저장
MongoDB 반정규화 주문 문서 안에 함께 조회할 값을 임베딩
저장 구조

주문 정보가 여러 테이블에 흩어집니다.

users { id, name }
orders { id, user_id, date }
order_items { order_id, product_id, qty }
products { id, name, price }

주문을 읽을 때 필요한 값이 한 문서에 모입니다.

orders {
  user: { name: "홍길동" },
  items: [
    { product: "노트북", price: 1500000, qty: 1 },
    { product: "마우스", price: 35000, qty: 2 }
  ],
  total: 1570000
}
주문 1건 조회

조회 시 JOIN으로 조합합니다.

문서 1건 읽기로 끝납니다.

문서 안에 남는 값
  • 상품 이름·가격은 products 테이블에 따로 둡니다.
  • 합계는 조회 시 계산하거나 별도 컬럼으로 관리합니다.
  • user.name, product, price를 주문 문서 안에 중복 저장합니다.
  • total 같은 파생값도 함께 저장해 즉시 읽습니다.
값 변경 후 의미

현재 원본 값과 주문 정보를 분리 관리합니다. 주문 시점 스냅샷이 필요하면 이력용 컬럼이나 별도 설계를 추가해야 합니다.

주문 당시 이름·가격이 문서 안에 남습니다. 상품 정보가 나중에 바뀌어도 주문 기록은 그 시점 값을 그대로 보존합니다.

함께 조회되고 변경 빈도가 낮은 값이라면, 임베딩은 읽기 속도와 주문 시점 보존을 동시에 얻기 쉽습니다. 반대로 자주 바뀌거나 여러 곳에서 공유되는 값은 중복 관리 비용도 함께 고려해야 합니다.
읽기 최적화 + 이력 보존