数据建模:父母和孩子的“双重”关系

时间:2010-08-01 18:59:28

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

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

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

  1. 永远可以接受,
  2. 一个好主意
  3. 让每个孩子专门了解其父母? (在我的情况下,孩子只能有一个父母)

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

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

    提前致谢。

3 个答案:

答案 0 :(得分:4)

<强> TL; DR

回答问题:

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

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

  

表格parent.PARENT_ID是否存在?

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

对1对多关系进行建模

如果关系是多个子节点的父节点(即同一个子节点只能属于一个父节点),那么标准建模方法是通过父节键中的一个引用子表中的父表。列,通常是Parent的主键(PK)。同时,对参考列(P)的外键(FK)约束也是一个好主意,以鼓励RDMBS在整个关系中强制执行referential integrity

child.PARENT_ID

OP的额外多个:许多表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) 是多余的,因为每parent_has_children只有一行,并且很快就会成为使这个表child保持行的负担从其他表中添加/删除(因为未能保持同步将导致关系完整性的混乱/矛盾)。

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

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

in sync

由于这通常是一个常见的查询,因此确保将外键SELECT ... FROM child WHERE PARENT_ID = myParentId; 编入索引始终是一个好主意 - 默认情况下,某些RDBMS版本会对所有外键执行此操作。

child.PARENT_ID

如果在表示这些表的应用程序中有实体模型(例如,对于ORM),则父实体通常具有包含其CREATE INDEX IXFoo on child(PARENT_ID); 实例的集合,并且在子实体上具有标量外键{ {1}}'column'要么完全删除,要么替换为对父实例的引用:

child

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我倾向于废弃parent_has_children表,而只是在子节点上有一个PARENT_ID - 这是表示这些数据的更传统方式。