다대다 관계

다대다 관계는 한 테이블에 있는 여러 레코드가 다른 테이블에 있는 여러 레코드와 연관되어 있는 경우 발생합니다. 예를 들어, 다대다 관계는 고객과 제품 간에 존재합니다. 고객은 다양한 제품을 구입할 수 있고 제품은 다수의 고객에게 구입될 수 있습니다.

관계형 데이터베이스 시스템에서는 일반적으로 두 테이블 간에 직접적인 다대다 관계를 구현할 수 없습니다. 송장을 추적하는 예제를 검토해보십시오. 다수의 송장이 동일한 송장 번호를 가지고 있고 고객 중 한 명이 해당 송장 번호에 대해 문의한 경우 어떤 번호를 참조했는지 알 수 없습니다. 이것이 각 송장에 고유한 값을 할당하는 이유 중 하나입니다.

이 문제를 피하려면 연결 테이블이라는 세 번째 테이블을 사용하여 다대다 관계를 두 개의 일대다 관계로 분리해야 합니다. 연결 테이블의 각 레코드에는 연결하는 두 테이블의 주요 키 값을 포함하는 일치 필드가 있습니다. (연결 테이블에서 이와 같은 일치 필드는 외부 키입니다.) 이와 같은 외부 키 필드는 연결 테이블의 레코드가 연결하는 테이블에서 생성될 때 데이터로 채워집니다.

일반적인 다대다 관계의 예제는 학생과 수업 간의 관계입니다. 학생은 여러 수업에 등록할 수 있고 수업은 여러 학생들을 포함할 수 있습니다.

다음 예제에는 각 학생의 레코드를 포함하는 학생 테이블과 각 수업의 레코드를 포함하는 수업 테이블을 포함되어 있습니다. 연결 테이블인 입학은 두 테이블 각각 사이에 하나씩 두 개의 일대다 관계를 생성합니다.

각각 등록 연결 테이블로 관계 선이 있는 학생 테이블 및 수업 테이블

주요 키 학생 ID는 학생 테이블에 있는 각 학생을 고유하게 식별합니다. 주요 키 수업 ID는 수업 테이블에 있는 각 수업을 고유하게 식별합니다. 입학 테이블에는 외부 키 학생 ID와 수업 ID가 포함되어 있습니다.

다대다 관계에 대한 연결 테이블 설정하기:

  1. 위의 예제를 사용하여 입학이라는 테이블을 생성하면 이 테이블이 연결 테이블이 됩니다.
  2. 입학 테이블에서 학생 ID 필드와 수업 ID 필드를 생성합니다.

    연결 테이블은 일반적으로 다른 테이블에 맞지 않을 수 있는 필드를 보유합니다. 누군가가 수업을 시작한 날짜를 추적하는 날짜 필드, 수업을 받기 위해 학생이 지불한 금액을 추적하는 비용 필드와 같은 필드를 입학 테이블에 추가할 수 있습니다.

  3. 테이블에서 두 학생 ID 필드 간에 관계를 생성합니다. 그런 다음 테이블에서 수업 ID 필드 간에 관계를 생성합니다.

이 디자인을 사용하여 학생이 세 가지 수업에 등록하는 경우 해당 학생은 학생 테이블에 하나의 레코드와 입학 테이블에 세 개의 레코드(학생이 등록한 각 수업에 대해 레코드 하나)를 가지게 됩니다.

참고 

  • 연결 테이블은 별도의 관계를 생성할 필요 없이 테이블에서 필드와 데이터에 접근할 수 있습니다. 예를 들어, 학생이 등록한 모든 수업의 목록을 표시하려면 학생 테이블을 기반으로 한 레이아웃에 포털을 생성하십시오. 수업 테이블에서 관련 레코드를 표시하도록 포털을 설계합니다. 그런 다음 수업에서 해당 필드를 포털에 추가합니다. 학생 레이아웃에서 레코드를 탐색할 때 포털에 특정 학생이 등록한 모든 수업이 표시됩니다.