Development/Database
[database] 식별 관계 vs 비식별관계
컴공희
2025. 1. 24. 23:13
제가 아는 지식 + 참고 자료로 작성해 보겠습니다.
식별 관계란?
해당 키를 식별하는 데 사용하겠다는 의미입니다.
따라서, 무조건 자식(혹은 가져온 테이블)에 존재하는 키 여야만 합니다.
따라서, NULL 이 들어갈 수 없습니다.
비식별관계란?
그에 비해 비식별관계는 Null 일 수 있고 다른 테이블의 의존하지 않고 독립적으로 존재할 수 있습니다.
비교적 자유롭고, JPA에서도 쉽게 구현하고 있습니다.
🤷🏻♂️ 그러면 다 비식별 쓰면 되는 거 아닌가요?
식별관계를 사용하는 이유
식별관계를 사용하는 이유는 다음과 같습니다.
- 데이터의 정합성을 유지하고 보장할 수 있다.
- 자식 테이블에 데이터가 존재한다면 부모 데이터도 반드시 존재한다고 보장할 수 있다.
- 3가지 복합 키의 종류가 유니크해야 하는 것을 보장할 수 있다.
- 기본 키 인덱스를 사용하기 편리하며 상위 테이블의 기본 키 칼럼을 자식 테이블들이 가지고 있으므로 특정 상황에 조인이 필요 없다.
유니크한 조합이 보장되어야 할 때,
주문과 결제가 있다고 하면
<주문 table>
pk | 이름 |
1 | 주문1 |
2 | 주문2 |
<결제 table>
pk | 이름 |
1 | 결제1 |
2 | 결제2 |
<주문_결제 table>
FK(주문) | FK(결제) |
1 | 1 |
2 | 1 |
1 | 2 |
2 | 2 |
1 | 1 |
유니크한 조합이 필수 일 때, 한 주문이 같은 결제를 가질 수 없습니다.
ERD 설계에서 1대 1 식별 관계로 설계된 경우에는 일반적으로 식별 관계로 매핑하는 것이 더 적합하니, 식별 관계로 매핑해 보시는 것을 권장드립니다.
결론 제 생각
- 하지만, 요즘은 개발의 유연성을 위해서 비식별관계를 많이 사용한다.
- 관계 테이블도 pk 하나 만들고 모두 비식별로 유지하고, NOT NULL을 설정하여 필수적 비식별 관계를 매핑하는 것이 더 낫다!
- 생각하기에 이 테이블은 필수로 있어야 하며 데이터 정합성이 중요한 테이블이라면 식별관계를 고려해 보는 것도 나쁘지 않을 것 같다. (거의 사용 안 해도 될 듯..)