프로젝트 db 테이블을 설계하다 식별 관계가 필요한 경우와

비식별 관계가 필요한 경우가 있다는것을 느껴 이를 정리 해보고자 한다

 

1. 용어 정리

- 기본키

테이블의 여러 정보들 중 이를 식별해 낼 수 있는 정보

 

- 외래키

테이블간의 관계(참조하는 테이블과 참조되는 테이블 간의 관계) 를 나타내는 정보

 

- 식별 관계

부모 테이블(=참조되는 테이블), 자식 테이블(=참조하는 테이블)

부모 테이블의 기본키 또는 유니크 키를 자식 테이블이 자신의 기본키로 사용하는 관계

부모 테이블의 기본키가 자식 테이블의 외래키이자 기본키로 사용되는 관계

두개의 외래키가 합쳐 기본키가 되므로 두 테이블 중 하나라도 없으면 기본키를 못 만든다

 

- 비식별 관계

부모 테이블(=참조되는 테이블), 자식 테이블(=참조하는 테이블)

부모 테이블의 기본키 또는 유니크 키를 자식 테이블이 자신의 기본키로 사용하지 않고

외래키로 사용하는 관계

자식 테이블의 행을 추가할 때 부모 테이블의 참조 행이 없어도

자식 테이블의 행을 추가할 수 있다

 

2. 예시로 알아보기

먼저 유저테이블, 주문테이블 이렇게 2개의 테이블이 있다

이 두 테이블은 1:N (일대다) 관계이다

 

식별 관계

 

비식별 관계

 

1) 식별 관계는 부모 테이블에 데이터가 반드시 존재해야

자식테이블에 데이터를 추가할 수 있다

 

2) 비식별 관계는 부모 테이블에 데이터가 없어도

자식 테이블에서 데이터를 추가할 수 있다

 

3) 만약 회원만 주문할 수 있는 조건이라면

식별 관계를 통해서 생성하면 좋다

왜냐하면 식별 관계는 부모인 유저 테이블에 데이터가 없으면

자식인 주문 테이블에 데이터를 넣지 못하게 되니까

정합성이 보장된다

 

4) 만약 비회원도 주문할 수 있는 조건이라면

비식별 관계를 통해서 생성하면 좋다

왜냐하면 비식별 관계는 부모인 유저테이블에 데이터가 없어도

자식인 주문 테이블에 데이터를 넣을 수 있으니

정합성은 보장되지 않는다

 

3. 결론

보통 비식별 관계를 더 선호하는것으로 알고 있다

왜냐하면 구조 변경에 용이하고 부모 테이블과의 의존성을 제거할 수 있으며

과도한 인덱스를 제거할 수 있기 때문이다

 

하지만 상황에따라 식별 관계를 적절히 사용 해줘야 할때가 있다

이건 회사에서 사용된 예시이긴 한데

부모-자식 관계만 있는것이 아니라

조부모-부모-자식 이렇게 관계가 맺어져 있을때

조부모의 pk 값을 자식이 써야할 때가 있다

이럴때 fk 로만 엮으면 테이블의 수가 너무 늘어나기에

값이 고정되어 있다면 식별관계로 연관관계를 맺어주면

쉽게 해결할 수 있다