【问题标题】:Data modelling: parent and child 'dual' relationship数据建模:父子“双重”关系
【发布时间】:2011-03-23 22:28:29
【问题描述】:

我正在尝试在我的数据模型中创建适当的父/子关系。我在父母和孩子之间有典型的一对多关系。

我想知道我是否有父母了解他们的孩子,是吗

  1. 永远可以接受,并且
  2. 好主意

让每个孩子具体了解其父母? (在我的情况下,孩子只能有一个父母)

parent      
-------------
PARENT_ID
OTHER_COL
...

child
-------------
CHILD_ID
PARENT_ID    // <-- Should this column be here?
OTHER_COL
...

parent_has_children
--------------------
PARENT_ID
CHILD_ID

我看到在子项中拥有父列的优势是可以轻松地从子项中检索父项。但是,这只是懒惰的设计吗?

提前致谢。

【问题讨论】:

    标签: database database-design relational-database data-modeling


    【解决方案1】:

    TL;DR

    再问:

    child
    PARENT_ID    // <-- Should this column be here?
    

    ,如果从child.PARENT_ID添加外键约束引用父列parent.PARENT_ID,则将强制执行父子关系的完整性。

    parent_has_children应该存在吗?

    ,这样的链接或联合表用于建模many-many 关系。表PC 之间的多对多关系意味着相同的C 行可以同时关联许多P 行,反之亦然。这显然不是亲子关系。

    建模一对多关系

    如果关系是 1 个父级与多个子级(即同一个子级只能属于一个父级),则标准建模方法是通过父键(其中一个)从子表中引用父表列,通常是父主键 (PK)。同时,对引用列 (child.PARENT_ID) 进行外键 (FK) 约束也是一个好主意,以鼓励 RDMBS 在整个关系中强制执行 referential integrity

    parent      
    -------------
    PARENT_ID PRIMARY KEY, // PK for the parent table
    OTHER_COL
    ...
    
    child
    -------------
    CHILD_ID PRIMARY KEY,  // PK for the Child Table
    PARENT_ID              // <-- Should this column be here? = Yes
    CONSTRAINT FK_ChildParent FOREIGN KEY(PARENT_ID) REFERENCES parent(PARENT_ID)
    

    OP 的额外 many:many 表 parent_has_children 是多余的,因为每个 child 将只有一行,并且很快就会成为保留此表 in sync 并从另一个表中添加/删除行的负担表(因为未能保持同步将导致关系完整性的混乱/矛盾)。

    Re : 父母如何了解自己的孩子?

    可以使用在父外键列上过滤的子表上的简单查询找到给定父级的子记录:

    SELECT ... 
    FROM child 
    WHERE PARENT_ID = myParentId;
    

    由于这通常是一个常见的查询,确保外键 child.PARENT_ID 被索引总是一个好主意 - 一些 RDBMS 版本默认为所有外键执行此操作。

    CREATE INDEX IXFoo on child(PARENT_ID);
    

    如果您在表示这些表的应用程序中有一个实体模型(例如,用于 ORM),则父实体通常会有一个包含其 child 实例的集合,而在子实体上,标量外键 child.PARENT_ID 'column' 要么完全删除,要么替换为对父实例的引用:

    class Parent
    {
        ParentId,
        Child[] Children,
        // ...
    }
    
    class Child
    {
        ChildId,
        Parent Parent, // Optional, allows bidirectional navigation
        // ...
    }
    

    【讨论】:

      【解决方案2】:

      我倾向于废弃 parent_has_children 表,而只在孩子上使用 PARENT_ID - 这是表示此数据的更传统方式。

      【讨论】:

        【解决方案3】:

        如果关系是真正的一对多而不是多对多,那么您可以将PARENT_ID 保留在CHILD 表上作为外键,并完全删除PARENT_HAS_CHILDREN 表。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-09
          • 2018-01-28
          • 1970-01-01
          相关资源
          最近更新 更多