7-1. 다대다 관계(N:M)와 연결 테이블

다대다(M:N) 관계는 두 테이블을 직접 1:N, N:1로 연결해서는 표현할 수 없다.

예를 들어 쇼핑몰에서:

이를 그대로 연결하면 orders ↔ items는 M:N 관계가 된다.

관계형 데이터베이스에서는 이를 직접 표현할 수 없기 때문에, 보통 중간에 연결 테이블(연관 엔티티) 을 만든다.

CREATE TABLE order_item (
  order_id   BIGINT NOT NULL,
  item_id    BIGINT NOT NULL,
  quantity   INT    NOT NULL,
  price      INT    NOT NULL
);

이 order_item 테이블이 주문과 상품 사이의 관계 자체를 테이블로 승격한 것이다. 여기에 quantityprice 같은 관계에 종속된 속성을 함께 저장한다.


7-2. 연결 테이블의 기본 키를 복합 키로 잡는 방식

전통적인 방식에서는 연결 테이블의 기본 키를 다음과 같이 잡곤 했다.

CREATE TABLE order_item (
  order_id   BIGINT NOT NULL,
  item_id    BIGINT NOT NULL,
  quantity   INT    NOT NULL,
  price      INT    NOT NULL,

  PRIMARY KEY (order_id, item_id),
  CONSTRAINT fk_order_item_order
    FOREIGN KEY (order_id) REFERENCES orders(order_id),
  CONSTRAINT fk_order_item_item
    FOREIGN KEY (item_id) REFERENCES items(item_id)
);

이 방식은 데이터 무결성 측면에서는 매우 이상적이다.

하지만 앞에서 본 복합 키의 단점이 그대로 나타난다.