위의 상황을 보자.
Author 테이블과 Topic 테이블이 있는데, 여러 명의 작가가 한 개의 글
을 쓸 수 있고 한 명의 작가가 여러 개의 글
을 쓸 수 있는 상황의 M:N 연관관계
가 있는 상황이다.
여기에서 두 테이블의 join 조건을 만들어주기 위해 어느 테이블이든 column을 추가해 foreign key를 추가 해보자. 그럼 위의 그림에서 노란색으로 표시된 방법 2가지가 있을 수 있겠다. 그러나 값이 2개 이상이 들어간 row도 있고 null인 row도 존재한다. 따라서 저 방법으로는 join 을 할 수가 없다.
중간의 write 테이블이 author 테이블과 topic 테이블의 매핑 테이블이다. 각각의 글을 어떤 저자가 썼느냐, 또 각각의 저자는 어떤 글을 썼냐에 대한 정보를 나타내 주는 테이블이다.
이렇게 연결 테이블을 두면, 매핑 테이블의 정보를 기반으로 한 다리 건너서 join 이 가능하다.
참고로 프로젝트를 할 때 N:M 연관관계가 나오면 역시 @ManyToMany
로 절대 처리하지 않는다. 위의 방법대로 매핑된 테이블의 클래스를 한 개 정의해서(보통 테이블 두개 이름을 붙여서 만듦. AuthorTopic.java
, OrderItem.java
와 같이) @OneToMany
, @ManyToOne
관계로 풀어서 연관관계를 맺는다.
영상 출처: 생활코딩, 관계형 데이터 모델링 - 5.5.1. N:M 관계의 처리
관계형 데이터 모델링 - 5.5.2. N:M 관계의 처리 - 내용 정정