有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java什么时候使用每个类的表层次结构而不是每个子类的表?

在任何Web应用程序中,我们都会遇到这样的场景,即我们可以使用表/类层次结构 或每个子类的表。但重要的是决定哪一个更适合您的用例。 我已经得出了我的基本理解,那一个更好的时候

Scenario :-员工。永久雇员和合同雇员扩展雇员。 有两种选择:

Option 1:-每个类层次结构的表,其中我们在单个表中表示所有字段。 它的好处是,你可以从一个表中获得所有细节,消除员工和永久/合同员工之间的连接。 所以提高了性能。但是,是的,你不能声明NOTNULL约束,即使是在你认为不能声明的字段上 永久雇员为空(因为我们在一张桌子上同时招待永久雇员和合同雇员)。这是不利的一面

Option 2:-每个子类的表,其中我们有对父表的外键引用。在这里加入会降低性能。 但是,是的,你可以直接把约束像no-null一样放进去,这在第一个选项中是做不到的

My take :-如果您不需要放置约束,请继续使用这种情况下的选项1,因为消除连接对性能pov有好处

想知道这件事是否有更多的方面,或者我的理解是否正确


共 (1) 个答案

  1. # 1 楼答案

    未来读者注意:自从这个答案发表以来,这个问题被大量修改。第二点可能不再有意义了

    你的问题有两个答案:

    1. 您误解了每个层次表和 每个子类的表。这些涉及的是继承,而不是关联。 所以我可以解释这些概念到底是什么 <> LI>可以考虑您所考虑的数据库设计,而不考虑 第一点

    1) 什么是每个层次的表和每个子类的表

    这些概念与一对一或多对一关联无关,它们与在类设计中处理继承和在数据库设计中转换的方式有关。在某个时刻,你简单地谈到了永久雇员和合同雇员。因此,你面临的困境肯定是:

    I have classes PermanentEmployee and ContractEmployee that extend class Employee. Do I need a single table for both types of employees (table per hierarchy) or do I need a table for ContractEmployee and another for PermanentEmployee (table per subclass) ?

    在这种困境下,非零约束的存在是很重要的。使用第一种策略,您将得到一个包含所有公共列、所有特定于承包商的列、所有特定于永久物的列的表,以及一个用于区分的附加列(例如,它将包含承包商的“CON”和永久物的“PER”)。如果存储永久数据,则会将承包商特定列的所有列设置为空。所以你不能强制执行“承包商有一个强制性的终止合同日期栏”这样的规则,因为它对于永久物将是空的

    支持或反对的其他论据是绩效:第一种策略使用了更多的空间,有大量的空列,而在第二种策略中,您复制了两个表中的公共列,如果您想要选择所有员工(无论承包商/永久工),您必须创建一个select UNION

    2) 你的设计怎么样

    一对一和多对一与表和联接相关。如果是一对一,则表示有两个表具有受限外键(唯一)。如果你有多对一,同样的事情,但fk不是唯一的

    对于多对一示例,您是正确的,规范化需要两个表。对于一对一,你也应该使用两个表,但是你可以用一个组件来代替EmployeeDetails,然后只有一个表。请参阅this hibernate documentation,这将解释它(请注意,从词汇的角度来看,它将不再是一对一)