【发布时间】:2010-09-28 15:54:26
【问题描述】:
在我的职业生涯中,我遇到过几次这个问题,但从来没有对解决方案感到非常满意,我在 ASP.Net MVC、C#、SQL Server 2008 中做的一个项目中再次遇到了这个问题:
假设我有一个 Person 类型(类)。我还有扩展 Person 的类型 Mother 和 Father。父亲和母亲非常相似:他们都有一个名为“Children”的属性,它是一个 Person 类型的集合。 “人”可以用基本的 Person 类、Mother 类或 Father 类来表示。从这个示例中,您可以看到我同时存在继承 (is-a) 和关联 (has-a) 关系。
我想使用这些 OO 类型在 SQL Server 中构建和存储家谱。我想我想要这 3 张表:Person、Mother 和 Father。每个对象在 Person 中都有一个条目,如果合适的话,可能还有在 Mother 或 Father 中的条目(与 Person 有 FK 关系)。此外,我将需要一些人行横道表来存储母亲记录与任何子记录之间的关系,与父亲一样。
这听起来像是一个好的存储策略吗?
您将如何有效地查询这个以获取深度和广泛的家谱?
我遇到的问题是在树中返回和给定节点的数据的多态性。如果这只是一棵 Person 对象树,我会使用 Recursive Common Table Expression。但是对于任何给定节点,可能会返回 3 种不同形状的数据,我想将其映射到 C# 中的 3 种 OO 类型之一。我显然可以在 C# 或存储过程中进行递归,但我对过去此类解决方案的性能不太满意。另外,如何自然地插入记录?由于 SQL Server 中的 FK 关系强制,我过去总是必须以正确的顺序插入(人,然后是父亲或母亲)。
是否有可以为我处理这种类型的 ORM 的框架?
编辑:
为了清楚起见,我需要的解决方案是检索整个家谱以进行显示,并且能够向家谱添加和编辑节点。我认为最好的解决方案是在一棵深树中的一个查询中执行此操作。我要问的是如何设计架构、存储和检索?
【问题讨论】:
-
为什么不能使用带有外键的单个表?
-
您如何建议我将与母亲或父亲类型不同的属性存储在单个表中?
-
我会将这些属性存储在一个单独的表中,并使用一个外键链接回 Persons 表。
-
那么,正是我在我的问题中所描述的。
-
是的,您可以使用单独的表来存储关系等属性(已婚、父母等)。这个想法首先是说他们是人,然后他们与其他人有特殊的关系。不错的是,一个单独的表允许您创建新的关系。
标签: c# sql recursion polymorphism