父母与父母孩子FK和同桌一样

时间:2017-01-18 13:15:49

标签: sql sql-server entity-framework ordbms

父母和父母的最佳做法是什么?子表FK到同一个表?

Parent > Child(ren) 

CommonAttributes: Sex, Age, Height, Weight

直接引用公用表是否更好:

CommonAttributes > Parent(s) > Child(ren)

&安培;

CommonAttributes > Child(ren)

或使用参考表:

RefTable: CommonAttributes_Id, Parent_Id(null), Child_Id(null)

我认为第一种方法可以正常工作(关于EF),但它有点循环引用。使用引用表来定义约束是否更好?

1 个答案:

答案 0 :(得分:2)

有几种方法,您需要的方法取决于您的业务需求。

首先,儿童记录可以有多个父母吗?例如,您可能正在为组织结构建模,其中员工可以拥有两名主管。如果这是真的,那么你有一对多的关系,需要一个单独的表来使这个模型起作用。

如果保证每个子节点只有一个父节点(但每个父节点可能有一个父节点(构建一个层次结构),那么你可以建模这是一个表。表结构将包括主键,比如UserID然后父级的可空列,例如ParentUserID。然后,您可以在同一个表中为该字段创建外键。

ALTER TABLE dbo.Mytable  ADD CONSTRAINT FK_Mytable _UserPArent FOREIGN KEY (ParentUserD)      REFERENCESdbo.Mytable (UserID)  

如果要在查询中构建层次结构,则使用递归CTE来获取它。见这里的例子: https://msdn.microsoft.com/en-us/library/ms186243.aspx

另一次,如果主表中只有一小部分记录具有父子关系,那么您可能希望为子父关系构建单独的表。例如,假设您有一个存储的人员表,销售代表和客户。只有销售代表才会有父子关系。因此,您需要一个单独的SalesRepHierarchy表来存储它,使得查询更加直接。

虽然您通常希望在递归CTE中创建层次结构,但在特殊情况下,预先计算层次结构可能会更快。如果经常查询层次结构,CTE性能较慢并且您可以控制层次结构的构建方式(最好只通过导入数据)以及它是否很少发生更改(您不希望重建层次结构),则会出现这种情况。每分钟,但每天只能进行一次导入。这可以大大加快并简单地查询整个层次结构,但如果通过应用程序不断创建和更改父子关系,则不建议这样做。