다대다 관계는 개념적으로는 학생 – 강의회원 – 관심상품처럼 M:N 관계로 표현되지만, 관계형 데이터베이스에서는 항상 중간에 연결(조인) 테이블을 두어 두 개의 1:N으로 풀어낸다.

6-1. 개념적 M:N → 논리적 1:N + N:1

예: 회원과 쿠폰

이를 풀어내기 위해 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) 자체를 테이블로 승격한 것이고, 구조도 비교적 단순하기 때문에 실무에서도 종종 사용된다.