상속관계 매핑
Super : Item (id, name, price)
Sub : Book, Album, Movie
기본 옵션은 Item 한 테이블에 모두 생성됨
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Item {
@Id @GeneratedValue
private Long id;
private String name;
private int price;
}
DTYPE 생성 어노테이션
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn
public class Item {
@Id @GeneratedValue
private Long id;
private String name;
private int price;
자식 객체에서 저장될 값 지정 가능
@Entity
@DiscriminatorValue("M")
public class Movie extends Item {
private String director;
private String actor;
⭕️장점1. 테이블 정규화
⭕️장점2. 외래 키 참조 무결성 제약조건 활용가능
⭕️장점3. 저장공간 효율화
❌단점1. 조회 시 조인을 많이 사용, 성능 저하
❌단점2. 조회 쿼리가 복잡함
❌단점3. 데이터 저장시 INSERT SQL 2번 호출
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
public class Item {
@Id @GeneratedValue
private Long id;
private String name;
private int price;
단일 테이블 전략은 @DiscriminatorColumn 이 없어도 DTYPE이 생성되어 있음
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@DiscriminatorColumn
public abstract class Item {
@Id @GeneratedValue
private Long id;
private String name;
private int price;
⭕️장점1. 조인이 필요 없으므로 일반적으로 조회 성능이 빠름
⭕️장점2. 조회 쿼리가 단순함
❌단점1. 자식 엔티티가 매핑한 컬럼은 모두 null 허용
❌단점2. 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다.상 황에 따라서 조회 성능이 오히려 느려질 수 있다.
(변경 관점에서 안좋음, 새로운 타입이 추가가 될 때 많은걸 뜯어야함)
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@DiscriminatorColumn
public abstract class Item {
@Id @GeneratedValue
private Long id;
private String name;
private int price;
!!! 이 전략은 데이터베이스 설계자와 ORM 전문가 둘 다 추천하지 않음 !!!
⭕️장점1. 서브 타입을 명확하게 구분해서 처리할 때 효과적
⭕️장점2. not null 제약조건 사용 가능
❌단점1. 여러 자식 테이블을 함께 조회할 때 성능이 느림 (UNION 필요)
❌단점2. 자식 테이블을 통합해서 쿼리하기 어려움
@MappedSuperclass
참고: @Entity 클래스는 엔티티나 @MappedSuperclass로 지 정한 클래스만 상속 가능
@MappedSuperclass
public abstract class BaseEntity {
@Column(name = "INSERT_MEMBER")
private String createdBy;
private LocalDateTime createdDate;
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
extends로 상속받아 속성만 사용
public class Member extends BaseEntity{
** 까먹지 않기 위해 정규화 정리 !!
제 1정규화 : 테이블 컬럼이 원자값 하나
제 2정규화 : 종속 함수 제거 (부분키는 어느 속성의 결정자일 수 없음)
제 3정규화 : 이행 함수 제거 (A->B, B->C, A->C 제거)
BCNF : 모든 결정자가 후보키 (제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해)