【问题标题】:Create a SQL table that can have cascading child parent relationships创建可以具有级联子父关系的 SQL 表
【发布时间】:2020-02-11 18:05:49
【问题描述】:

我有一组可以有子实体的实体,这些子实体本身有子实体,它们有子实体......等等。问题是实体之间后续子实体的数量不是恒定的。

例子:

汽车有一个引擎,引擎有多个组件,可能包含多个零件,而这些零件可能有更小的零件

如上所述,级联下来的后续子实体的数量例如在火车和汽车之间是不同的,因此我不能为每个父级创建无限期的子表。

我的问题是,存储此类数据并维护每个父级和后续子级之间关系的最有效方法是什么?一个例子将不胜感激。

【问题讨论】:

  • 对于父/子关系,您通常只需要一个带有 ID 的自引用表,以及 ParentID 或 ChildID 列(以及其他元数据列)。这里更重要的是您将如何使用数据,如果没有更多细节,我们无法真正为您提供建议。
  • 我了解创建单个自引用表和父子关系。但是,如果孩子成为另一个孩子的父母等等,我如何跟踪或维持这种关系。见提到的例子。我对如何使用数据有一个想法,但现在它以最有效的方式存储它,而不会创建无限的父/子表链。我还应该提到,后续子表的元数据是相同的。不确定我是否理解正确,但也许你可以分享一个简单的例子。
  • 一张像entity_id | parent_entity_id 这样的表就足够了。当您有一个新孩子进来时,您只需添加一条新记录,注明它属于哪个parent_entity_id。当您想要提取实体的所有后代时,您可以使用递归 CTE。这样它就是一张桌子和秤。如果这些实体的属性(colorcreate_datesmellcountry 等等)都相同,那么您也可以将它们作为列添加到此表中。
  • 谢谢。这是我想这样做的方式,但我不确定这是否是最有效的方式,因此我提出了问题。非常感谢您的帮助。

标签: sql-server relationship parent-child cascading


【解决方案1】:

最简单的数据模型是这样的树:

TABLE Entity (Id, Name, EntityTypeId, ParentEntityId NULL)
TABLE EntityType (Id, Name, ParentEntityTypeId NULL)

在更复杂的模型中,例如共享相同电机型号的不同车型(不清楚您是在谈论车型还是特定车型),ParentEntityId 列将替换为关系表:

TABLE Entity (Id, Name, EntityTypeId)
TABLE EntityHierarchy (Id, ParentEntityId, ChildEntityId)

EntityHierarchy 表中的条目将受到 EntityTypes 树的约束(在应用程序级别)

在更复杂的模型中,ParentEntityTypeId 也将替换为层次结构表。

如果您的实体或其类型随时间发生变化,您还可以将 DATE 范围添加到这些表中的任何一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 2021-12-31
    • 2015-02-19
    • 1970-01-01
    相关资源
    最近更新 更多