다대다 관계는 개념적으로는 학생 – 강의, 회원 – 관심상품처럼 M:N 관계로 표현되지만, 관계형 데이터베이스에서는 항상 중간에 연결(조인) 테이블을 두어 두 개의 1:N으로 풀어낸다.
예: 회원과 쿠폰
이를 풀어내기 위해 member_coupon이라는 연결 테이블을 추가한다.
CREATE TABLE coupon (
coupon_id BIGINT NOT NULL AUTO_INCREMENT,
coupon_code VARCHAR(50) NOT NULL,
name VARCHAR(100) NOT NULL,
PRIMARY KEY (coupon_id),
UNIQUE (coupon_code)
);
CREATE TABLE member_coupon (
member_id BIGINT NOT NULL,
coupon_id BIGINT NOT NULL,
issued_at DATETIME NOT NULL,
PRIMARY KEY (member_id, coupon_id),
CONSTRAINT fk_member_coupon_member
FOREIGN KEY (member_id)
REFERENCES member (member_id),
CONSTRAINT fk_member_coupon_coupon
FOREIGN KEY (coupon_id)
REFERENCES coupon (coupon_id)
);
여기서 member_coupon은 (member_id, coupon_id) 복합 PK를 사용한다. 이때 두 부모의 PK를 합쳐서 PK를 구성하기 때문에, 엄밀히 말하면 member_coupon은 두 부모에 대해 "식별 관계"에 가깝다.
하지만 이 경우는 순수한 관계(relationship) 자체를 테이블로 승격한 것이고, 구조도 비교적 단순하기 때문에 실무에서도 종종 사용된다.