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

我想知道我是否有 parent 知道他们的 child ,是吗

  • 永远可以接受,以及
  • 一个好主意

  • 让每个 child 都特别了解其 parent ? (在我的情况下,一个 child 只能有一个 parent )
    parent
    -------------
    PARENT_ID
    OTHER_COL
    ...
    
    child
    -------------
    CHILD_ID
    PARENT_ID    // <-- Should this column be here?
    OTHER_COL
    ...
    
    parent_has_children
    --------------------
    PARENT_ID
    CHILD_ID
    

    我认为在 child 中有父列的好处是可以轻松地从 child 那里检索 parent 。但是,这只是懒惰的设计吗?

    提前致谢。

    最佳答案

    TL;DR

    回复问题:

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

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



    没有 ,像这样的链接或联合表用于模拟 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: parent 如何了解自己的 child ?

    可以使用对父外键列过滤的子表的简单查询找到给定父级的子记录:
    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
        // ...
    }
    

    关于database - 数据建模 : parent and child 'dual' relationship,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3383314/

    10-15 13:27