在定义父子关系时,如何确定哪个应该是父表,哪个应该是子表

时间:2016-09-29 11:23:44

标签: database hibernate database-design parent-child

在定义父子关系时,我们如何确定哪个表应该是父表,哪个表应该是Child表。

比如说我在hibernate中创建一对一的关系。现在我如何决定哪个表应该是父表,哪个表应该是子表。

我们是否有任何拇指规则或任何准则。

同时在hibernate中定义一对一映射时,我应该在哪个表中定义关系。例如,我们指定以下标记来定义关系<one-to-one></one-one>.如果关系是单向的,它应该在父表还是子表中。

我也经历了以下链接

Which table should be Parent table and which should be child table?

Which Table Should be Master and Child in Database Design

请建议。

是否必须将包含主键的表视为父表?

1 个答案:

答案 0 :(得分:0)

1)我们不应该关心hibernate中的表(Parent / Child)。你应该做的是用Java实现你的软件设计(面向对象的方法),hibernate将根据你的软件/项目设计来完成它的工作。
项目的设计不应该对任何API(如hibernate)有任何实现依赖。

例如:让我们在你的设计中说你想要实现一个 is-a 关系(继承)的场景,比如&#34;有两个公司中的员工类型为常规员工和合同员工。&#34;
这个场景可以在java中实现,如下所示:

class Employee {  
 private int id;  //applicable for both types of employees
 private String name; //applicable for both types of employees

 //getters and setters  
}  
class Contract_Employee extends Employee{  
    private float pay_per_hour;  
    private String contract_duration;  

//getters and setters  
}  
class Regular_Employee extends Employee{  
    private float salary;  
    private int bonus;  

 //getters and setters  
} 

它与hibernate的映射可以完成如下:

<hibernate-mapping>
<class name="com.stack.Employee" table="emp" discriminator-value="emp">
    <id name="id">
        <generator class="increment"></generator>
    </id>
    <discriminator column="type" type="string"></discriminator>
    <property name="name"></property>
    <subclass name="com.stack.Regular_Employee" discriminator-value="regular_emp">
        <property name="salary"></property>
        <property name="bonus"></property>
    </subclass>
    <subclass name="com.stack.Contract_Employee" discriminator-value="contract_emp">
        <property name="pay_per_hour"></property>
        <property name="contract_duration"></property>
    </subclass>
</class>
</hibernate-mapping>  

由于Hibernate是ORM框架,它支持这种关系,它必须。 hibernate框架中正在进行大量的演变5.x是最近的演变。以便解决许多现实问题。

2)请记住,所有关系(@ OneToMany,@ OneToOne,@ ManyToMany,@ ManyToOne等)都是面向对象的方法来解决特定的现实问题。
所以一旦你创建了用于实现这些关系的java类,您希望使用ORM将对象存储在数据库中,您只需按原样保持关系并按照ORM框架执行相应的映射。
在实现hibernate时,您不应该更改或决定父/子表的内容。这是在实现java类之前决定的。

3)因此,拇指规则依赖于您的项目设计/要求,而不是它在休眠中的实现。
应该更改/(添加新的)后端api以实现设计。这是因为,良好的软件设计并不依赖于其底层实现。

4)数据库设计应根据USE-CASE的设计方式完成。在用例图中,实体之间的所有关系都是为场景定义的。

建议:只需充分利用ORM框架,即可实现您的要求。
让设计师完成他们的工作,开发人员按照设计师的意愿实现设计。