2

这是父类

@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
}

这是一个儿童班

 @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
}

Answer仅通过包含questionId字段与超类不同

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

   private String questionId;
   //omitted others for purity
}

哪种数据模型适合我。我应该使用InheritanceType.SINGLE_TABLEor TABLE_PER_CLASS。未来有数百万条记录时会发生什么。

4

1 回答 1

2

当我准备 JPA 证书时,这些是我对这两种策略的精选笔记:

单表策略

这种方法可能更浪费数据库表空间,但它确实为多态查询和写入操作提供了最佳性能。

发出这些操作所需的 SQL 简单、优化且不需要加入

  • 您的情况的优点:也许您的设计不会很好和规范化,但您会在性能方面免去很多麻烦,而且您的查询也会更简单,特别是如果您期望有数百万条问题和答案的记录。
  • 你的情况的缺点:我猜问题和答案会有很多共同点,而且随着时间的推移和表格的增长,很多不同的属性/列。您最终可能会得到一个臃肿的表,其中包含所有可能的数据和平并且在某些时候无法维护(一旦我必须获得整个部门的批准和几天的测试才能将单个索引添加到其中一个列一张这样的桌子)。

加盟战略

为每个实体映射一个表提供了规范化数据模式提供的数据重用,并且是存储数据的最有效方式,由层次结构中的多个子类共享。

  • 在您的情况下的优点:随着时间的推移,问题和答案表之间的额外不同列的数量不是问题,因为您的架构很好并且标准化,因此每个都有一个合乎逻辑的位置。设计干净、清晰、可维护和可扩展(您可能需要为专门的问题和答案添加更多抽象)。
  • 你的情况的缺点:有数百万行的问题和答案,你将需要至少一个额外的连接来进行基本查询,但如果你随着列/特性的增长保持它的规范化,最小的连接数将高于此。

结论

最初我倾向于单桌,但当我给自己一点时间时,它意识到这将是一个“懒惰”的决定(把所有东西都放在一个袋子里,忘记设计)。加入桌似乎更成熟的决定当您需要考虑您的索引策略时,您应该规范化多少表(以及哪些数据组)并最终提出有效的查询,批处理语句。

决定权取决于您,但如果您采用联合战略,您肯定会提高您的技能,因为它会要求更高。

于 2017-01-20T22:13:24.287 回答