gpt4 book ai didi

java - Hibernate适合的继承策略

转载 作者:行者123 更新时间:2023-11-30 06:56:09 25 4
gpt4 key购买 nike

这是父类

@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 与父类(super class)的区别仅在于包含 questionId 字段

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

private String questionId;
//omitted others for purity
}

哪种数据模型适合我。我应该使用 InheritanceType.SINGLE_TABLE 还是 TABLE_PER_CLASS。当 future 有数百万条记录时会发生什么。

最佳答案

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

单表策略

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

发出这些操作所需的 SQL 很简单、经过优化且不需要联接

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

联合策略

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

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

结论:

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

决定取决于您,但如果您选择联合策略,您肯定会提高您的技能,因为这会要求更高。

关于java - Hibernate适合的继承策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41773038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com