【问题标题】:How to decide which should be Parent table and which should be Child table while defining Parent Child relationship在定义父子关系时如何确定哪个应该是父表,哪个应该是子表
【发布时间】:2016-09-29 11:23:43
【问题描述】:

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

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

我们是否有任何经验法则或指南。

同时在休眠中定义一对一映射时,我应该在哪个表中定义关系。例如,我们指定以下标签来定义关系<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

请提出建议。

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

【问题讨论】:

    标签: database hibernate database-design parent-child


    【解决方案1】:

    1) 我们不应该关心休眠中的表(父/子)。您应该做的是用 Java(面向对象的方法)实现您的软件设计,hibernate 将根据您的软件/项目设计完成它的工作。
    您的项目设计不应该对任何 API 有任何实现依赖像休眠一样。

    例如: 假设在您的设计中,您有一个场景想要实现 is-a 关系(继承),例如“有两种员工在公司担任正式员工和合同工。”
    这个场景可以用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 框架进行相应的映射。
    在实现休眠时,您不应更改或决定父/子表。这是在实现您的 java 类之前决定的。

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

    4) 数据库设计应基于用例的设计方式。在用例图中,实体之间的所有关系都是针对场景定义的。

    建议:好好利用ORM框架,实现你的需求。
    让设计人员完成他们的工作,开发人员按照设计人员的意愿实施设计。

    【讨论】:

      猜你喜欢
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      • 2020-08-05
      相关资源
      最近更新 更多