Computer >> 컴퓨터 >  >> 프로그래밍 >> SQL

다대다(M:N) 관계 모델 완벽 이해하기

데이터베이스 설계에서 다대다(many-to-many) 관계는 매우 자주 등장하는 관계 유형입니다. "제품 판매" 데이터베이스에서 고객의 한 주문은 하나 이상의 제품을 포함할 수 있으며, 반대로 하나의 제품은 여러 주문에 포함될 수 있습니다. 마찬가지로 "서점" 데이터베이스에서 한 권의 책은 한 명 이상의 저자가 집필할 수 있고, 한 저자는 없거나 여러 권의 책을 쓸 수 있습니다. 이처럼 양쪽 모두 여러 레코드와 연결되는 관계를 다대다 관계라고 부릅니다.

예제: 제품 판매 데이터베이스

"제품 판매" 데이터베이스를 예로 들어 구체적으로 살펴보겠습니다. 먼저 Products(제품)와 Orders(주문)라는 두 개의 테이블로 시작합니다.

  • Products 테이블: 제품에 대한 정보(제품명, 설명, 재고 수량 등)를 저장하며, productID가 기본 키(primary key) 역할을 합니다.
  • Orders 테이블: 고객의 주문 정보(customerID, dateOrdered, dateRequired, status 등)를 저장합니다.

그런데 여기서 문제가 발생합니다. 주문된 상품 목록을 Orders 테이블 안에 직접 저장할 수 없습니다. 한 주문에 몇 개의 상품이 담길지 미리 알 수 없기 때문에, 항목을 위해 몇 개의 열(column)을 확보해야 할지 정할 수 없기 때문입니다. 반대로 주문 정보를 Products 테이블에 저장하는 것 역시 불가능합니다.

연결 테이블(Junction Table) 도입

다대다 관계를 지원하려면 세 번째 테이블, 즉 연결 테이블(junction table)을 만들어야 합니다. 여기서는 이 테이블을 OrderDetails(주문 상세) 또는 OrderLines라고 부르겠습니다. 이 테이블의 각 행(row)은 특정 주문에 포함된 개별 상품 항목 하나를 나타냅니다.

OrderDetails 테이블의 기본 키는 orderID와 productID 두 열로 구성된 복합 키(composite key)이며, 이 조합이 각 행을 고유하게 식별합니다. 또한 orderID와 productID는 각각 Orders 테이블과 Products 테이블을 참조하므로, OrderDetails 테이블에서 외래 키(foreign key) 역할도 동시에 수행합니다.

다대다(M:N) 관계 모델 완벽 이해하기

두 개의 일대다 관계로 구현

사실 다대다 관계는 연결 테이블을 도입함으로써 두 개의 일대다(one-to-many) 관계로 분해되어 구현됩니다.

  • Orders ↔ OrderDetails: 하나의 주문은 OrderDetails에 여러 항목을 가질 수 있으며, 각 OrderDetails 항목은 특정 하나의 주문에만 속합니다.
  • Products ↔ OrderDetails: 하나의 제품은 여러 OrderDetails 항목에 나타날 수 있으며, 각 OrderDetails 항목은 단 하나의 제품만 지정합니다.

이처럼 연결 테이블을 활용하면 복잡해 보이는 다대다 관계도 깔끔하고 확장 가능한 방식으로 데이터베이스에 구현할 수 있습니다. 실무에서는 주문 수량, 단가 등 추가 정보를 OrderDetails 테이블의 열로 넣어 더욱 풍부한 데이터를 관리할 수도 있습니다.