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

2021. 6. 25. 22:52·개발중/Java Persistence API (JPA)
목차
  1. ✅ 식별 관계 / 비식별 관계 장단점
  2. ✅ ORM 신규 프로젝트의 추천하는 방법 👍
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
반응형
저작자표시 (새창열림)

'개발중 > Java Persistence API (JPA)' 카테고리의 다른 글

JPA - 값 타입 컬렉션  (0) 2021.06.30
JPA - 즉시 로딩과 지연 로딩  (0) 2021.06.28
JPA / 프록시 알아보기  (0) 2021.06.28
JPA - 어노테이션 정리  (0) 2021.06.25
JPA / 객체 간 연관관계 매핑 - 기록  (0) 2021.06.25
  1. ✅ 식별 관계 / 비식별 관계 장단점
  2. ✅ ORM 신규 프로젝트의 추천하는 방법 👍
'개발중/Java Persistence API (JPA)' 카테고리의 다른 글
  • JPA - 즉시 로딩과 지연 로딩
  • JPA / 프록시 알아보기
  • JPA - 어노테이션 정리
  • JPA / 객체 간 연관관계 매핑 - 기록
Binsoo
Binsoo
내 트러블 슈팅
  • Binsoo
    정수빈 기술블로그임.
    Binsoo
  • 전체
    오늘
    어제
    • 빈수 개발자 개발 일기 (932)
      • 개발중 (634)
        • Spring Boot (95)
        • Spring Security (2)
        • Spring Batch (6)
        • Spring Boot & Redis (13)
        • Java Persistence API (JPA) (28)
        • Web (42)
        • Rest Api (7)
        • Spring Concurrency Control (3)
        • Redis (8)
        • Kubernetes (k8s) (4)
        • MYSQL (35)
        • AirFlow (15)
        • Docker (2)
        • Git (22)
        • Linux (9)
        • JSON Web Tokens (JWT) (4)
        • Troubleshooting (87)
        • Swagger (0)
        • Vue.js (52)
        • Java (74)
        • html (12)
        • C (5)
        • jQuery (15)
        • JavaServer Pages (JSP) (17)
        • Arduino (1)
        • JavaScript (35)
        • Amazon Web Services (AWS) (11)
        • Algorithm (9)
        • 참고 기능 (18)
        • mongo (2)
      • PROJECT (27)
        • 스프링부트+JPA+몽고 API 개발 (3)
        • MINI (2)
        • 게시판 (3)
        • vue 프로젝트 (1)
        • JPA 사이드 프로젝트 기록 (17)
      • TEAM STUDY (156)
        • 가상 면접 사례로 배우는 대규모 시스템 설계 기초 (8)
        • 한 권으로 읽는 컴퓨터 구조와 프로그래밍 (12)
        • NAVER DEVELOPER (4)
        • LINUX (23)
        • PYTHON (19)
        • SERVER (8)
        • 알고리즘 코딩 테스트 스터디 (31)
        • 쿠버네티스 (40)
        • 대세는 쿠버네티스 [초급~중급] (11)
      • BOOK (0)
      • 자격증 (61)
        • 리눅스 1급 - 필기 기록 (19)
        • 네트워크 관리사 (2)
        • 네트워크 관리사 2급 - 실기 기록 (21)
        • 네트워크 관리사 2급 - 필기 기록 (16)
        • 정보처리 (2)
      • 직장인 대학원 (17)
        • 기록 (1)
        • 캐글 스터디 (3)
        • R (12)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    BackendDevelopment
    쿠버네티스
    java
    git
    알고리즘
    redis
    Spring
    네트워크 관리사 2급 실기
    리눅스 마스터 1급 요약
    스프링
    리눅스 마스터 1급 정리
    파이썬
    springboot
    리눅스 마스터
    docker
    REST API
    네트워크 관리사 요약
    리눅스 마스터 1급
    네트워크 관리사 실기
    VUE
    네트워크 관리사 2급
    Git 저장소
    jpa
    네트워크 관리사 학점
    리눅스 1급 요약
    파이썬 알고리즘
    네트워크 관리사 자격증
    쿠버네티스 스터디
    리눅스 마스터 요약
    네트워크 관리사
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Binsoo
식별 관계와 비식별 관계 구분

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.