본문 바로가기

개발중/Java Persistence API (JPA)

식별 관계와 비식별 관계 구분

728x90
반응형

식별 관계 / 비식별 관계 매번 많이 사용 되는데
확실한 개념은 매번 짚고 가려 하지만
매번 헷갈리는 식별 관계와 비식별 관계 제대로 정리하기



데이터베이스 테이블 사이에 관계는 외래 키가 기본 키에 포함 되는지 여부에 따라

식별 관계와 비식별 관계로 구분한다.

 

DB TABLE을 설계할 때는 식별관계 OR 비식별관계 하나를 택해야 한다.

 

최근에는 비식별 관계를 주로 사용하고

꼭 필요한 곳에만 식별 관계를 사용하는 추세이다.

 

JPA 는 식별관계와 비식별 관계 모두 지원한다.


✅ 식별 관계

식별 관계는 부모 테이블의 기본키를 내려 받아서 자식 테이블의 기본키 + 외래키를 사용하는 관계이다.

 

 비식별 관계

비식별 관계는 부모 테이블의 기본키를 받아서 자식 테이블의 외래 키로만 사용하는 관계이다.

 

- 필수적 비식별 관계

외래키에 NULL 을 허용하지 않는다

 

- 선택적 비식별 관계

외래키에 NULL 을 허용한다


 식별 관계 / 비식별 관계 장단점

 

DB 설계 관점에서 보면 다음과 같은 이유로 식별 관계 보다는 비식별 관계를 선호한다.

그 이유는 다음과 같다. 😏

 

  • 식별 관계는 부모 테이블의 기본키를 자식 테이블로 전파하면서 자식 테이블의 기본키 컬럼이 점점 늘어난다. 예를 들어 부모 테이블은 기본 키 컬럼이 하나 였지만 자식 컬럼은 2개, 손자는 3개 결국 쿼리는 복잡해지고 기본 키 인덱스가 불필요하게 늘어날 수 있다.
  • 식별 관계는 2개 이상의 컬럼을 합해서 복합 기본키로 만들어야 하는 경우가 많다.
  • 식별 관계를 사용할 때 기본키로 비지니스 의미가 있는 자연 키 컬럼을 조합하는 경우가 많다. 반면에 비식별 관계의 기본키는 비즈니스와 전혀 관계없는 대리키를 주로 이용한다. 비즈니스 요구사항은 시간이 지남에 따라 언젠가 변하기에 식별 관계의 자연 키 컬럼들은 변경이 어려워진다.
  • 식별 관계는 부모 테이블의 기본 키를 자식 테이블의 기본 키로 사용하므로 비식별 관계보다 테이블 구조가 유연하지 못하다.
  • 일대일 관계를 제외하고 식별 관계는 2개 이상의 컬럼을 묶은 복합 기본키를 사용한다. JPA 에서 복합 기본키는 별도의 복합키 클래스를 만들어 관리해야 한다. 따라서 컬럼이 하나인 기본키를 매핑하는 것보다 많은 노력이 필요하다.

 

물론 식별 관계가 가진 장점도 있다. 😎

 

  • 기본키 인덱스를 활용하기 좋고 상위 테이블의 기본 키 컬럼을 자식, 손자 테이블들이 가지고 있으므로 특정 상황에 조인 없이 하위 테이블 만으로 검색을 완료할 수 있다.

 

이처럼 식별 관계가 가지는 장점도 있으니 꼭 적절하게 사용하는 것이 DB  테이블 설계의 묘를 살리는 방법이다.

 


 ORM 신규 프로젝트의 추천하는 방법 👍

 

  • 비식별 관계를 사용하라
  • 기본키는 LONG 타입의 대리키를 사용하라
    • 대리키는 비즈니스와 아무 관련이 없다. 따라서 비즈니스가 변경되어도 유연한 대처가 가능하다는 장점이 있다.
    • JPA 는 @Generatevalue 를 통해 간편하게 대리키를 생성할 수 있다.
    • 식별자 컬럼이 하나여서 쉽게 매핑할 수 있다.
    • 자바에서 Integer 는 20억 정도면 끝나버리므로 데이터가 많을 경우 문제가 발생할 수 있다. 반면에 LONG 은 아주 커서 ( 약 920경 ) 안전하다.
  • 선택적 비 식별 관계 or 필수적 비식별 관계
    • 필수적 비식별 관계 추천한다.
    • 선택적인 비식별 관계는 NULL 을 허용하므로 조인할 때에 외부 조인을 사용해야 한다.
    • 필수적 비식별 관계는 NOT NULL 로 항상 관계가 있다는 것을 보장하므로 내부 조인을 사용해야 한다.

 


 

728x90
반응형