세 전략은 모두 상속 구조를 저장하지만, NULL, 조인, 중복 중 무엇을 비용으로 받아들일지가 다릅니다.
|
단일 테이블
기본 전략
한 테이블에 모든 타입을 넣고 구분 컬럼으로 필터링 |
타입별 테이블
JPA JOINED
공통은 부모에, 전용은 자식에 두고 조회 시 결합 |
구체 테이블
TABLE_PER_CLASS
각 구체 타입이 공통 속성까지 모두 직접 저장 |
|
|---|---|---|---|
| 공통 속성 저장 |
한 곳에만 저장
중복은 없지만 타입별 미사용 컬럼이 함께 놓입니다. |
부모 테이블에 모음
정규화가 잘 되고, 공통 속성은 계속 한 곳에서 관리됩니다. |
각 자식 테이블에 반복
조인은 줄지만 공통 컬럼 변경 시 여러 테이블을 함께 손봐야 합니다. |
| 타입별 조회 |
WHERE로 구분
한 테이블만 읽으면 되지만 NULL 컬럼이 많이 따라옵니다. |
자식 + 부모 조인
타입별 속성이 많아도 구조는 깔끔하지만 조회 시 결합이 필요합니다. |
각 구체 테이블만 읽음
학생이면 학생 테이블만 읽으면 끝이라 가장 직접적입니다. |
| 전체 조회 |
가장 단순
한 번의 스캔으로 전체 상속 계층을 읽을 수 있습니다. |
조인 비용 발생
부모와 자식을 합쳐야 해서 앞 절의 단점이 여기서 드러납니다. |
UNION 필요
각 타입 결과를 모아야 하므로 전체 집계나 목록 조회가 번거롭습니다. |
| 잘 맞는 경우 |
타입이 단순하고 전체 조회가 잦을 때
구조보다 조회 단순성이 더 중요하면 유리합니다. |
공통 속성도 많고 타입별 속성도 많을 때
중복 없이 모델을 유지하면서도 타입별 확장을 분리할 수 있습니다. |
공통보다 독립 조회가 더 중요할 때
타입 간 공통점이 적고, 각 타입을 따로 다루는 경우에 어울립니다. |