다대다(M:N) 관계는 두 테이블을 직접 1:N, N:1로 연결해서는 표현할 수 없다.
예를 들어 쇼핑몰에서:
orders)에는 여러 상품이 들어간다. (1:N)items)은 여러 주문에 포함될 수 있다. (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 테이블이 주문과 상품 사이의 관계 자체를 테이블로 승격한 것이다. 여기에 quantity, price 같은 관계에 종속된 속성을 함께 저장한다.
전통적인 방식에서는 연결 테이블의 기본 키를 다음과 같이 잡곤 했다.
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)
);
order_id와 item_id의 조합이 한 주문에서 한 상품을 유일하게 식별한다.이 방식은 데이터 무결성 측면에서는 매우 이상적이다.
하지만 앞에서 본 복합 키의 단점이 그대로 나타난다.
(order_id, item_id) 를 FK로 가져야 한다.