在我的职业生涯中,我遇到过几次这个问题,并且从来没有对这个解决方案感到非常满意,并且在我在 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?
编辑:
为了清楚起见,我需要的解决方案是检索整个家谱以进行显示,并能够向家谱添加和编辑节点。我认为最好的解决方案是在一棵深树中的一个查询中执行此操作。我要问的是如何设计模式、存储和检索?