티스토리 뷰

반응형

다대다(M:N) 관계

두 개의 테이블이 서로의 행에 대해서  여러개로 연관 되어 있는 상태를 다대다(M:N)관계라고 합니다. 예를 들어 보겠습니다. 한명의 학생이 여러 수업을 수강하고, 한 수업은 여러 학생을 수용합니다. 이를 ERD로 표현하면 아래와 같습니다.


학생테이블과 수업테이블이 다대다 관계로 연관되어 있다.


다대다(M:N) 구현하기

논리적으로 다대다관계의 표현은 가능하지만, 2개의 테이블만으로 구현하는 것은 불가능 합니다. 다대다관계를 실제로 구현하기 위해선 각 테이블의 PrimaryKey를 외래키(FK)로 참조 하고 있는 연결테이블(매핑테이블)을 사용해야 합니다. 이를 ERD로 표현하면 아래와 같습니다. 


'학생테이블'과 '학생_수업테이블'이 일대다 관계로 연관되어 있고, '학생_수업테이블'과 '수업테이블'이 다대일 관계로 연관되어 있다.


예를들어 '철수'라는 학생은 '국어', '영어', '수학' 3가지의 수업을 수강하고 있고, '수학'이라는 수업은 '철수', '영희', '미자' 라는 학생을 수용 하고 있습니다. 예제를 이용해서 데이터를 3개의 테이블에 입력하면 아래와 같습니다.


[학생]

 학생 이름 

학생  코드

철수

영희

미자 



[학생_수업] - 연결테이블(매핑테이블)

 학생 코드

수업 코드

1

1

1

2

3



[수업]

수업명

수업  코드

국어

a

영어

b

수학

c


  • 만약 철수가 듣고있는 수업들을 알고 싶다면, 철수의 학생코드 1을 조건문으로 학생_수업 테이블을 조회합니다. 
  • 만약 영희가 국어 수업을 듣게 된다면, 영희의 학생 코드 2와 국어의 수업코드 a를 학생_수업 테이블에 삽입합니다.


TIP) 테이블간의 관계를 이해하기가 어려운 분들에게

  1. 관계를 생각 할 때 테이블로 생각하지 말고, '한 행'을 기준으로 생각합니다. 그러므로 테이블 명도 '학생 목록', '수업 목록'이 아닌, 한 행을 대표할 수 있는 이름인 '학생', '수업'으로 해야 합니다.
  2. 논리적으로 생각할 땐, 연결(매핑) 테이블은 생각하지 않습니다.
    -철수의 학생 코드는 학생_수업 테이블에 여러개 존재한다. (X)
    -철수는 국어, 영어, 수학 수업을 수강한다.(O)
  3. 항상 일대다(1:N) 기준으로 생각합니다. 다대일(N:1)보다 직관적으로 이해하기 쉽습니다.
    -철수가 여러 수업을 수강한다.(O)
    -국어, 영어, 수학은 철수를 수용 한다.(X)



해당 예제는 http://blog.naver.com/PostView.nhn?blogId=nitrogehne&logNo=150166090575 포스팅을 참고했습니다.

반응형
댓글