다대다 관계

Hyuk·2023년 5월 9일
2

다대다 관계는 한 테이블의 여러 레코드가 다른 테이블의 여러 레코드와 연관있는 경우에 발생하게 된다.
쇼핑몰 서비스에서 사용자 테이블과 제품 테이블이 있다고 가정하자.
사용자가 여러 제품을 가질 수 있고, 제품 또한 여러 사용자에게 할당될 수 있다.
이런 경우에 다대다 관계라고 생각되어진다.
하지만 관계형 데이터베이스에서는 정규화된 테이블 2개로 다대다 관계를 표현할 수가 없다.


위와 같이 테이블이 정의되어있다고 가정하다. 각 테이블에서 유저코드, 물건코드가 P.K가 된다.
이 때 1번 사용자가 연필 두개와, 지우개를 하나 샀다고 생각하면, 다음과 같이 테이블이 구성된다.

위 상황에서 문제점을 살펴보자

  • PK가 사라진다. 유저 테이블에서 더이상 유저코드로 유저를 구분할 수 없고, 물건 테이블도 마찬가지이다.
  • 만약 유저 테이블, 물건테이블의 정보가 바뀐다면, 예를 들어 유저 이름이 바뀐다면 한 군데가 아니라 여러 군데를 수정해야하는 문제가 생긴다.

위와 같은 이유로 관계형 데이터베이스에서 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다.

해결법: 연결 테이블을 추가해야 한다.
연결 테이블을 이용하여 다대다 관계를 일대다, 다대일 관계로 풀어낼 수 있다.

이 연결테이블은 유저가 구매한 물건을 나타낸다.

@ManyTpMany 어노테이션 사용
객체에서는 테이블과 다르개 객체 2개로 다대다 관계를 만들 수 있다.
예를들어 컬렉션을 이용하면 여러개의 객체를 참조할 수 있게 된다.
@ManyTpMany 어노테이션을 사용하면 연결 테이블을 자동으로 처리해주게 된다.

그런데 실무에서는 연결테이블에 다른 데이터를 담고 싶은 경우가 생긴다.

지금 @ManyTpMany 어노테이션을 사용했을 때는, 유저 아이디와 물건 아이디만 담게 되지만, 만약 구매 날짜 같은 정보를 담고싶어질 때가 있을 수 있다.
그럴땐 새로운 엔티티를 생성하여 테이블 관계처럼 @OneToMany와 @ManyToOne을 사용하면 된다.

식별관계와 비식별관계
연결테이블도 결국에는 테이블이기 때문에 데이터를 검색하기 위해서는 기본키가 필요하다.
연결 테이블에는 기본적으로 연결하려는 두 테이블의 기본키를 외래키 형태로 갖게 된다.
현재 연결 테이블에 담겨있는 내용은 유저아이디, 물건아이디, 구매 날짜 세 가지인데, 이들 중 무엇 하나도 연결테이블의 기본키로 사용할 수 있는 내용은 없다. 중복되기 때문이다.

연결 테이블의 기본키 전략 중에서 첫번째는 갖고있는 두 외래키를 결합하여 복합키로 사용하는 것이다.
현재 상황에서는 유저 아이디와 물건 아이디를 결합한 형태를 복합 키 형태의 기본키로 사용한다.
이러한 방식을 식별관계라고 한다.
식별자 변수가 두 개이기 때문에 식별자 값을 자동으로 증가시킬 수 없다.

비식별 관계에서는 연결하려는 다른 두 테이블의 기본키를 오로지 외래키로만 사용한다. 또한 연결테이블만을 위한 별도의 기본 키를 추가해서 사용한다.
이러한 비식별관계를 이용하면 식별자 값을 자동으로 증가시킬 수 있고, 키 관기 측면에서 식별관계보다 편리하다.

비식별 관계를 이용하면 복합 키를 위한 식별자 클래스를 만들지 않아도 되어서 편리하다.

profile
🙂 🙃 🙂 🙃

0개의 댓글