c# - SQL Server 中多态树的数据模式和查询

标签 c# sql recursion polymorphism

关闭。这个问题不满足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/

相关文章:

c# - 如何正确编写正则表达式以匹配特定的起始数字?

c# - DispatcherTimer 的毫秒间隔

sql - 我如何帮助需要 CSV 格式的关系数据库数据的人?

recursion - OCaml 模块中相互调用的函数

c++ - 有人可以举例说明递归如何与 while 循环一起使用吗?我无法理解流程

c# - LINQ:获取所有子项总和的有效方法

c# - 是否可以在不指定数据库的情况下连接到 SQL Server?

mysql - SQL多表无记录显示

java - Hibernate 查询将 count 转换为 int?

recursion - 尝试通过递归绘制特定形状,尝试了我知道的所有可能方法