상속관계 매핑

slee2·2022년 3월 4일
0

상속관계 매핑

  • 관계형 데이터베이스는 상속 관계X
  • 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사
  • 상속 관계 매핑: 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑

슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법

  • 조인 전략
  • 단일 테이블 전략
  • 구현 클래스마다 테이블 전략

조인 전략

@Inheritance
기본값이 SINGLE_TABLE이다.
이를 JOINED로 바꿔주면 조인 전략으로 바뀐다.

이와 같이 extends를 통해 엮어준다.

싱글 테이블일때

조인일때

여기서 추가로,

@DiscriminatorColumn 어노테이션을 추가로 넣으면
extends로 받은 자식엔티티들을 DTYPE으로 구분이 가능하다.

참고로 DTYPE의 이름을 각각 따로 설정해주고 싶다면,
Movie, Book 등의 엔티티에
@DiscriminatorValue("설정하고 싶은 이름")을 추가하면 된다.

단일 테이블 전략

모든 자식 테이블을 한곳에 합치는 전략.
구분하기 위해 DTYPE이 필수다.
JOIN을 쓰지 않기 때문에 간편해 보이지만,
어딘가 나사빠져 보이는 구조.

구현 클래스마다 테이블 전략

Item 테이블을 없애고 해당 컬럼들(item_id, name, price)를 전부 밑으로 내려서 처리
사용하기 용이해보이나, find로 찾을때 모든 테이블을 다 뒤져야하는 불편함이 있음.

주요 어노테이션

  • @Inheritance(strategy=InheritanceType.XXX)
    JOINED: 조인 전략
    SINGLE_TABLE: 단일 테이블 전략
    TABLE_PER_CLASS: 구현 클래스마다 테이블 전략
  • @DiscriminatorColumn(name="DTYPE")
  • @DiscriminatorValue("XXX")

각각의 장단점

조인 전략

장점

  • 테이블 정규화
  • 외래 키 참조 무결성 제약조건 활용가능
  • 저장공간 효율화

단점

  • 조회시 조인을 많이 사용, 성능 저하
  • 조회 쿼리가 복잡함
  • 데이터 저장시 INSERT SQL 2번 호출

단일 테이블 전략

장점

  • 조인이 필요 없다.
  • 조회 쿼리가 단순하다.

단점

  • 자식 엔티티가 매핑한 컬럼은 모두 null 허용한다.
  • 단일 테이블에 모든 것을 저장하므로 테이블이 커진다.
  • 상황에 따라 오히려 성능이 저하될 수 있다.

구현 클래스마다 테이블 전략

일단 추천ㄴ

장점

  • 서브 타입을 명확하게 구분해서 처리할 때 효과적
  • not null 제약조건 사용 가능

단점

  • 여러 자식 테이블을 함께 조회할 때 성능이 느림(자식 테이블을 다 뒤져야됨)
  • 자식 테이블을 통합해서 쿼리하기 어려움

0개의 댓글