关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。
想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。
6年前关闭。
Improve this question
在我的职业生涯中,我遇到过几次这个问题,并且从来没有对解决方案感到非常满意,并且在我在 ASP.Net MVC、C#、SQL Server 2008 中进行的一个项目中再次遇到了这个问题:
想象一下,我有一个 Person 类型(类)。我还有扩展 Person 的 Mother 和 Father 类型。父亲和母亲非常相似:他们都有一个名为“Children”的属性,这是一个 Person 类型的集合。 “人”可以用基本的 Person 类、Mother 类或父类来表示。从这个例子中你可以看到我有继承(is-a)和关联(has-a)关系。
我想使用这些 OO 类型在 SQL Server 中构建和存储家谱。我想我想要这 3 个表:人、母亲和父亲。每个对象都会有一个 Person 条目,如果合适的话,也可能有一个 Mother 或 Father 条目(与 Person 有 FK 关系)。此外,我将需要一些人行横道表来存储母亲记录和任何子记录之间的关系,以及与父亲相同的关系。
这听起来像是一个好的存储策略吗?
您将如何有效地查询深而宽的家谱?
我遇到的问题是在树中的给定节点处返回的数据的多态性。如果这只是一棵 Person 对象树,我会使用 Recursive Common Table Expression .但是对于任何给定节点,可能会返回 3 种不同形状的数据,我想将其映射到 C# 中的 3 种 OO 类型之一。我显然可以在 C# 或存储过程中进行递归,但我对过去此类解决方案的性能不是很满意。另外,如何自然地插入记录?由于 SQL Server 中的 FK 关系强制执行,我过去总是必须以正确的顺序(人,然后是父亲或母亲)插入。
有没有一个框架可以为我处理这种类型的 ORM?
编辑:
明确地说,我需要的解决方案是检索整个家谱进行显示,并且能够向家谱添加和编辑节点。我认为最好的解决方案是在深树中的一个查询中执行此操作。我要问的是如何设计模式、存储和检索?
最佳答案
我唯一能给出足够答案的部分是关于 ORM 框架。 NHibernate非常擅长处理表继承。例如,如果您使映射正确,它将为您保存的每个母亲或父亲保存一个 Person 实体。
退房 Inheritance Mapping
关于c# - SQL Server 中多态树的数据模式和查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/397031/