1

이이최대 절전 모드에 적합한 상속 전략

@Entity 
@Table(name="QUESTION") 
public class Question extends APostCommon { 

    private static final long serialVersionUID = 1L; 

    @Transient 
    private List<Answer> answers; 

    @Column(name="FOLLOW_COUNT") 
    private Integer followerCount; 

    @Column(name="ANSWER_COUNT") 
    private Integer answerCount; 

    //omitted others for purity 
} 

AnswerquestionId 필드

@Entity 
@Table(name="ANSWER") 
public class Answer extends APostCommon{ 

    private String questionId; 
    //omitted others for purity 
} 

를 포함하여 상위 클래스와 다른 자식 클래스에게 있습니다

@MappedSuperclass 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
public class APostCommon extends Actionable {  

    private static final long serialVersionUID = 1L; 

    @Column(name = "TITLE") 
    private String title; 

    @Lob 
    @Column(name="DESCRIPTION") 
    private String description; 

    //omitted others for purity 
} 

부모 클래스 어느 데이터 모델은 저에게 적합합니다. InheritanceType.SINGLE_TABLE 또는 TABLE_PER_CLASS을 사용해야합니다. 미래에 수백만의 기록이있을 때 어떤 일이 발생합니다.

답변

1

내가 JPA 인증을 준비하고, 이러한 내 벚꽃이 두 전략에 메모를 집어 같습니다 접근 방식은 데이터베이스 테이블의 더 낭비 될 수있다 전략

단일 테이블,하지만 제공 피크를 수행 다형성 쿼리 및 쓰기 작업 모두에 대한 성능

이러한 작업을 실행하는 데 필요한 SQL 최적화, 간단하고 귀하의 경우

  • 프로에 합류 필요하지 않습니다 : 어쩌면 당신의 디자인은 좋은 정규화되지 않습니다하지만 당신은 너 자신을 아끼지 않습니다 성능에 관한 두통이 많으며 특히 질문 및 답변을 위해 수백만 건의 레코드가 필요할 것으로 예상되는 경우 쿼리가 훨씬 간단 해집니다.
  • 귀하의 경우 단점 : 나는 질문과 답변이 공통점이 많을 것이라고 생각하지만 시간이 갈수록 테이블이 커짐에 따라 여러 가지 속성/열이 많이 생깁니다. 가능한 한 모든 데이터 평화를 유지하고 어느 시점에서는 유지할 수없는 비 대한 테이블 중 하나가 될 수 있습니다. (전체 부서와 테스트 일 승인을 받아야만 한 컬럼에 하나의 인덱스를 추가해야하는 것이 아닙니다. 그런 식탁). 엔티티 당 테이블 매핑

    전략 가입

데이터가 정규화 된 데이터 스키마 제공 및 데이터를 저장하는 가장 효율적인 방법입니다, 즉이 계층 구조의 여러 서브 클래스에 의해 공유되어 있는지 다시 제공합니다.

귀하의 경우
  • 찬성 : 스키마가 좋은 정규화로 시간은 질문 사이에 추가 별개의 컬럼의 수와 답변 테이블 그러므로 그 각각의 논리적 인 장소가있다, 문제가되지 않습니다. 디자인은 깨끗하고 명확하며 유지 보수가 가능하고 확장 가능합니다 (전문적인 질문과 대답에 더 많은 추상화를 추가해야 할 수도 있음).
  • 단서 질문/답변에 수백만 개의 행이있는 : 에 대한 단점이 있지만 열/기능이 커짐에 따라 정규화 된 상태로 유지하는 경우 최소한의 조인 횟수 그것보다 높을거야.

결론 :

처음

내가 단일 테이블쪽으로 생각이 기울고 있었다, 그러나 나는 나 자신에게 약간의 시간을주고, 그것은 그의 (a '게으른'결정이 될 하나 개의 가방에 모든 것을 넣어 것입니다 깨닫게했다 디자인에 대해 잊어 버려라.) 조인 된 테이블은 인덱싱 전략, 얼마나 많은 테이블을 정규화해야하는지 (그리고 어떤 데이터 그룹), 그리고 효율적인 쿼리, 배치 문을 사용해야하는지에 대해 생각할 필요가있을 때 더 성숙한 결정으로 보인다.

결정은 당신에게 달려 있지만, 합류 한 전략으로 가면 더욱 까다로워 질 수밖에 없습니다.

+0

답장을 보내 주셔서 감사합니다. 그런데 관련 문제에 대한 의견을 구할 수 있습니까? 나는 성능 측면을 선택하고 싶다. 그래서 나는 데이터 중복성에 신경 쓰지 않는다. 나는 데이터베이스를 매우 비정규 화했다. 가능한 한 조인을 피하십시오. 그러나 올바른 방법으로 확신 할 수는 없습니다. 엔티티 자체가 아닌 관계의 id 속성만을 보유하는 것에 대한 당신의 견해는 무엇입니까 – ilkerbfl

+0

일반적으로 제 생각에 역 정규화는 매우 작은 부분의 데이터베이스 디자인에만주의해서 사용해야하는 예외적 인 전략입니다. 테이블의 행 수와 함께 더 많은 열이 예상되는지 생각해야합니다. 계속 성장한다면 100 + 컬럼이있는 모든 정보 저장 테이블을 얻게 될 것입니다. 그런 다음 정규화를 수행하는 데 너무 늦었습니다. 문제가 생겼어. 그 단일 테이블 전략으로 시작할 수는 있지만 테이블이 커지면서 여전히 정규화 된 양식을 전환 할 수있는 기회가있는 경우주의하십시오. –

+1

더 명확하게하기 위해 얻었습니다. 설명하기 위해 답 엔티티에서 questionId 대신 Question Entity를 사용합니다. 하지만 그렇게하면 나쁜 성능을 유발하는 조인 쿼리가 생성됩니다. 아직도 정상화를 주장합니까? – ilkerbfl