본문 바로가기

컴퓨터공학/Hibernate

Hibernate> Inheritance Mapping> Joined Tables and Mapped Superclass

 

Joined Tables

기본키와 외래키를 이용해서 상속 테이블은 부모 테이블에 없는 필드값만 넣어 만든다. 

이전에는 user 필드 값 모두 포함해서 student나 instructor를 만들었는데

이제는 student와 instructor에만 있는 필드값만 있는 테이블을 만든다. 

 

시퀀스 테이블이 필요 없다. 

 

장점

데이터베이스 모델 정규화

상속 테이블에 중복되는 필드값이 없다. 

단점

조인이 많기 때문에 서브클래스 쿼리 성능이 느리다. 

상속이 많아지면 느려진다. 

 

 

 

table per class 와 비교했을 때 달라지는 건 크게 없다.

inheritanceType.JOINED 만 바꿔 주면 된다. 

 

 


 Mapped Superclass 

 

추상클래스 없이 서브 클래스만 있다.

Table per class와 유사하지만 다른 점은 superclass 테이블이 없다는 것데이터베이스 스키마에 테이블 조인이나 상속이 없다. 상속은 오직 java object model에서만 있다. 

 

장점간단하고 직관적인 구현join이 필요 없어서 서브쿼리 쿼리 잘 작동단점복잡한 쿼리가 필요하면 HQL join 코드를 직접 짜야한다. 예를 들어 User 목록 호출 쿼리를 만드려면 Student와 Instructor 모두 join해야 한다.  그래서 많은 join으로 성능이 느릴 수 있다. 

 

 

@Entity @Table @Inheritance 을 모두 지우고 @MappedSuperclass 로 대체한다.  

서브 클래스는 이전 그대로 @Entity만 넣는다. 

 

나머지 hibernate.cfg.xml 이나 main application 은 변동없이 그대로 가면 된다. 

 

 


요약

 

Single table strategy 

테이블이 갖고 있는 모든 칼럼을 한 테이블에 넣고 구분 필드값으로 테이블을 구분한다. 

직관적이라 만들기 쉽고 테이블 하나에 모든 게 있어서 빠른 성능을 갖는다. 

null값을 많이 가질 수 있다. 

 

Table per class

superclass 공통 값과 subclass 테이블에 해당되는 칼럼만 들어간다. 

시퀀스 테이블이 필요하다. 

상위 클래스에 관한 쿼리는 느리다. 

상속이 많아지면 느려진다. 

멀티스레드가 많은 환경에서 시퀀스 테이블를 참조하는 id 생성은 느리다. 

 

Joined table 

상위 클래스 테이블이 있고 기본키와 외래키를 통해서 서브클래스에서 상위클래스를 join한다. 

데이터베이스 모델 정규화

superclass에서 상속하는 필드가 없으니 subclass에서 중복되는 필드값이 없다.. 

서브 클래스에 관한 쿼리는 느리다. 

상속이 많아지면 느려진다. 

 

Mapped Superclass 

superclass는 공통 필드값을 정의한다. 

서브 클래스 테이블은 superclass 필드값과 subclass 필드값을 갖는다. 

데이터베이스에는 subclass 테이블만 있다. 

단순하고 직관적

subclass 에 관한 쿼리가 잘 작동한다. join이 필요 없기 때문이다. 

상황에 따라서 HQL join 코드가 필요하다. 

많은 join으로 성능이 느릴 수 있다. 

 

 

상황별 전략

가장 좋은 성능이 필요할 때

: Single table

subclass 쿼리에 좋은 성능과 데이터 무결성이 필요할 때

: Table per class, Mapped Superclass

정규화된 데이터베이스와 데이터 무결성

: Joined table 

 

 

 

비교

  Single Table Table per class Joined table Mapped superclass
insert/update/delete 등 쓰기 성능 4
(테이블이 하나라서)
3
(시퀀스 테이블과
thread safe 기능 때문에)
1
(값을 넣을 때 기본키 외래키 고려해야함) 
4
(서브클래스 테이블만 동작하기 때문)
subclass 쿼리 4
(테이블이 하나라서)
4
(서브클래스 테이블만 쿼리가 동작해서)
1
(조인이 많아서 느림)
4
(서브클래스 테이블만 쿼리가 동작해서)
다형성 쿼리 4
(테이블이 하나라서)
1
(여러 테이블을 조인해야하기 때문에)
1
(조인이 많아서 느림)
1
(superclass가 없어서 HQL로 직접 만들어야함)
데이터베이스 정규화 1
(테이블이 하나라서)
3
(subclass에 맞게 상속되어 빈 곳이 없다.)
4
(기본키와 외래키로 상속되어 있어서)
3
(subclass에 맞게 상속되어 빈 곳이 없다.)
데이터무결성 1
(null이 가능해야 한다)
3
(Not null constraints 적용 가능)
4
(Not null constraints 적용 가능)
4
(Not null constraints 적용 가능)