프로젝트 db 테이블을 설계하다 식별 관계가 필요한 경우와
비식별 관계가 필요한 경우가 있다는것을 느껴 이를 정리 해보고자 한다
1. 용어 정리
- 기본키
테이블의 여러 정보들 중 이를 식별해 낼 수 있는 정보
- 외래키
테이블간의 관계(참조하는 테이블과 참조되는 테이블 간의 관계) 를 나타내는 정보
- 식별 관계
부모 테이블(=참조되는 테이블), 자식 테이블(=참조하는 테이블)
부모 테이블의 기본키 또는 유니크 키를 자식 테이블이 자신의 기본키로 사용하는 관계
부모 테이블의 기본키가 자식 테이블의 외래키이자 기본키로 사용되는 관계
두개의 외래키가 합쳐 기본키가 되므로 두 테이블 중 하나라도 없으면 기본키를 못 만든다
- 비식별 관계
부모 테이블(=참조되는 테이블), 자식 테이블(=참조하는 테이블)
부모 테이블의 기본키 또는 유니크 키를 자식 테이블이 자신의 기본키로 사용하지 않고
외래키로 사용하는 관계
자식 테이블의 행을 추가할 때 부모 테이블의 참조 행이 없어도
자식 테이블의 행을 추가할 수 있다
2. 예시로 알아보기
먼저 유저테이블, 주문테이블 이렇게 2개의 테이블이 있다
이 두 테이블은 1:N (일대다) 관계이다
식별 관계

비식별 관계

1) 식별 관계는 부모 테이블에 데이터가 반드시 존재해야
자식테이블에 데이터를 추가할 수 있다
2) 비식별 관계는 부모 테이블에 데이터가 없어도
자식 테이블에서 데이터를 추가할 수 있다
3) 만약 회원만 주문할 수 있는 조건이라면
식별 관계를 통해서 생성하면 좋다
왜냐하면 식별 관계는 부모인 유저 테이블에 데이터가 없으면
자식인 주문 테이블에 데이터를 넣지 못하게 되니까
정합성이 보장된다
4) 만약 비회원도 주문할 수 있는 조건이라면
비식별 관계를 통해서 생성하면 좋다
왜냐하면 비식별 관계는 부모인 유저테이블에 데이터가 없어도
자식인 주문 테이블에 데이터를 넣을 수 있으니
정합성은 보장되지 않는다
3. 결론
보통 비식별 관계를 더 선호하는것으로 알고 있다
왜냐하면 구조 변경에 용이하고 부모 테이블과의 의존성을 제거할 수 있으며
과도한 인덱스를 제거할 수 있기 때문이다
하지만 상황에따라 식별 관계를 적절히 사용 해줘야 할때가 있다
이건 회사에서 사용된 예시이긴 한데
부모-자식 관계만 있는것이 아니라
조부모-부모-자식 이렇게 관계가 맺어져 있을때
조부모의 pk 값을 자식이 써야할 때가 있다
이럴때 fk 로만 엮으면 테이블의 수가 너무 늘어나기에
값이 고정되어 있다면 식별관계로 연관관계를 맺어주면
쉽게 해결할 수 있다
'DataBase' 카테고리의 다른 글
| [DataBase] postgresql 논리적 복제 plugin(pgoutput) 포멧 조사 (1) | 2024.04.18 |
|---|---|
| [DataBase] WITH절 알아보기 (0) | 2023.09.26 |
| [DataBase] TimescaleDB 특징, 설치 방법 및 테스트 (0) | 2023.08.04 |
| [DataBase] JPA @Transactional 없이 수동으로 처리 해보기 (0) | 2023.07.26 |
| [DataBase] Elasticsearch bulk 구현 (0) | 2023.07.21 |