<aside> ❗
관계형 데이터베이스는 상속 관계 없음
****슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사
객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑
객체 입장에서는 다 똑같음 DB에서 어떤 방법으로 구현하더라도 JPA에서는 맵핑 가능
JPA 기본 전략은 단일 테이블 전략
</aside><aside> ❗
DTYPE 컬럼
을 둬서 ALBUM, MOVIE, BOOK를 구분해서 조회하게 함@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Item {
@Id @GeneratedValue
private Long id;
private String name;
private int price;
}
@Entity
public class Album extends Item {
private String artist;
}
@Entity
public class Movie extends Item {
private String director;
private String actor;
}
@Entity
public class Book extends Item {
private String author;
private String isbn;
}
조회시 조인을 많이 사용
, 성능 저하조회 쿼리가 복잡함
데이터 저장시 INSERT SQL 2번 호출
**** 조인 전략이 가장 정석 전략 ****
→ 객체랑 잘 맞음, 정규화 가능, 깔금하게 설계 가능
→ 상황에 따라 단일 테이블 전략을 쓰지만 일반적으로 가장 잘 맞는게 조인 전략
<aside> ❗
논리 모델을 한 테이블로 합쳐버리는 것
구분하기 위해 DTYPE 컬럼을 둔다.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Item {
@Id @GeneratedValue
private Long id;
private String name;
private int price;
}
/*
create table Item (
price integer not null,
id bigint not null,
DTYPE varchar(31) not null,
actor varchar(255),
artist varchar(255),
author varchar(255),
director varchar(255),
isbn varchar(255),
name varchar(255),
primary key (id)
)
*/
@DiscriminatorColumn
를 추가해주지 않아도 자동으로 DTYPE 컬럼이 생성된다.
테이블이 하나만 생성
된다.쿼리가 한 번만 나가면 됨
조회도 조인 없이 간단한 쿼리가 나간다.
일반적으로 조회 성능이 빠름
조회 쿼리가 단순
함모두 null 허용
// 치명적
→ 데이터 무결성 입장에선 애매함테이블이 커질 수 있다
.
상황에 따라서 조인보다 조회 성능이 오히려 느려질 수 있다.
→ 임계점을 넘는 경우는 거의 없어 일반적으로 조인보다 성능이 좋음
</aside><aside> ❗
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Item {
@Id @GeneratedValue
private Long id;
private String name;
private int price;
}
/*
Hibernate:
create table Album (
price integer not null,
id bigint not null,
artist varchar(255),
name varchar(255),
primary key (id)
)
Hibernate:
create table Book (
price integer not null,
id bigint not null,
author varchar(255),
isbn varchar(255),
name varchar(255),
primary key (id)
)
Hibernate:
create table Movie (
price integer not null,
id bigint not null,
actor varchar(255),
director varchar(255),
name varchar(255),
primary key (id)
)
*/
@DiscriminatorColumn
이 의미가 없음 → 각 테이블이 분리됐기 때문이 전략은 데이터베이스 설계자와 ORM 전문가 둘 다 추천 X
서브 타입을 명확하게 구분해서 처리할 때 효과적
여러 자식 테이블을 함께 조회할 때 성능이 느림(UNION SQL 필요)
<aside> ❗
@Inheritance(strategy = InheritanceType.XXX)
@DiscriminatorColumn(name=”DTYPE”)
- name 옵션 생략 가능
→ DTYPE 컬럼이 테이블에 생성된다.
→ DTYPE 컬럼에 테이블 이름이 들어간다. ALBUM, MOVIE, BOOK
→ 사용하는게 좋음
→ 싱글 테이블 전략에서는 반드시 필수@Entity
@DiscriminatorValue("A") // DTYPE 컬럼에 A가 저장됨
public class Album extends Item {
private String artist;
}
</aside>
<aside> ❗
<aside> ❗
</aside>
<aside> ❗
</aside>
<aside> ❗
</aside>