상속관계 매핑

  • 객체는 상속관계가 존재하지만, 관계형 데이터베이스는 상속 관계가 없다.(대부분)
  • 그나마 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다.
  • 상속관계 매핑이라는 것은 객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑하는 것이다.

조인 전략

  • @Inheritance(strategy = InheritanceType.JOINED)
    • 부모 클래스에 지정. 조인 전략이므로 InheritanceType.JOINED 설정
  • @DiscriminatorColumn(name = "DTYPE")
    • 구분 컬럼 지정. Default값이 DTYPE이므로 name 속성은 생략 가능
  • @DiscriminatorValue("TEST")
    • 구분 컬럼에 입력할 값 지정. Default값으로 엔티티 이름 사용
  • @PrimaryKeyJoinColumn(name = "Album_ID")
    • Default로 자식 테이블은 부토 테이블 id 컬럼명을 그대로 사용하나, 변경시 해당 설정값 추가
  • 장점
    • 테이블의 정규화
    • 외래 키 참조 무결성 제약조건 활용 가능
    • 저장공간을 효율적으로 사용 가능
  • 단점
    • 조회시 잦은 조인으로 인해 성능 저하 가능성
    • 복잡한 조회 쿼리
    • 데이터 등록 시, 두번 실행되는 INSERT문

단일 테이블 전략

  • 하나의 테이블을 사용하며 구분 컬럼(DTYPE)을 활용해 데이터를 활용하는 전략
  • @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
    • 부모 클래스에 지정. 단일 테이블 전략이므로 InheritanceType.SINGLE_TABLE 설정
  • 장점
    • 조인이 사용되지 않아 빠른 조회 성능
    • 단순한 조회 쿼리
  • 단점
    • 자식 엔티티가 매핑한 컬럼은 모두 NULL 허용
    • 높은 테이블이 커질 가능성으로 인해 오히려 조회 성능이 안좋아질 수 있음

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

  • 자식 엔티티마다 테이블 생성하는 전략
  • 추천하지 않는 전략
  • @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
    • 부모 클래스에 지정. 구현 클래스마다 테이블 전략이므로 InheritanceType.TABLE_PER_CLASS 설정
      • 장점
        • 서브 타입을 구분해서 처리할 때 효과적
        • not null 제약조건 사용 가능
      • 단점
        • 여러 자식 테이블 함께 조회시 성능 문제(UNION을 사용함)
        • 자식 테이블을 통합해 쿼리가 어려움

'항해 99(9기) > 항해 일일' 카테고리의 다른 글

항해 99 42일 차  (0) 2022.10.31
항해 99 39일차  (0) 2022.10.28
항해 99 37일차  (0) 2022.10.26
항해 99 36일차  (0) 2022.10.25
항해 99 35일차  (0) 2022.10.24

+ Recent posts