관계형 DB에서는 상속 개념이 없기 때문에, 공통된 속성이 있어도 테이블마다 반복해서 작성해야 한다.
책
| 상품번호(PK) | 이름 | 가격 | 저자 | 출판사 |
|---|
옷
| 상품번호(PK) | 이름 | 가격 | 사이즈 | 색상 | 브랜드 |
|---|
운동기구
| 상품번호(PK) | 이름 | 가격 | 무게 | 사이즈 | 브랜드 |
|---|
→ 공통 필드(상품번호, 이름, 가격)가 반복됨
공통 속성을 부모(슈퍼) 테이블로 올리고 자식(서브)이 상속받는 구조
상품(슈퍼테이블)
| 상품번호(PK) | 이름 | 가격 | 상품타입 |
|---|---|---|---|
| 책 / 옷 / 운동기구를 구분 |
서브 테이블
책
| 상품번호(PK, FK) | 저자 | 출판사 |
|---|
옷
| 상품번호(PK, FK) | 사이즈 | 색상 | 브랜드 |
|---|
운동기구
| 상품번호(PK, FK) | 무게 | 사이즈 | 브랜드 |
|---|
※ 이 구조는 논리적 모델이며, 실제 물리 구현은 전략에 따라 달라짐
상품(단일 테이블)
| 상품번호 | 이름 | 가격 | 저자 | 출판사 | 사이즈 | 색상 | 브랜드 | 무게 | 상품타입 |
|---|---|---|---|---|---|---|---|---|---|
| 책/옷/운동기구 구분 칼럼 포함 |
| 연관관계 | 기본 로딩 방식 |
|---|---|
@ManyToOne, @OneToOne | 즉시 로딩(EAGER) |
@OneToMany, @ManyToMany | 지연 로딩(LAZY) |
→ 특별히 항상 함께 조회되는 관계가 아니면 지연 로딩 권장
엔터티 타입
임베디드 타입(복합 값 타입)
class Address {
private String address;
private String addressDetail;
private String zipcode;
}
→ 엔터티에서 아래처럼 통합 표현 가능
private Address address;
JPA 상속 매핑 = 객체지향 설계 + DB 물리 모델링 간 격차 해소