3

在我的职业生涯中,我遇到过几次这个问题,并且从来没有对这个解决方案感到非常满意,并且在我在 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?

编辑:

为了清楚起见,我需要的解决方案是检索整个家谱以进行显示,并能够向家谱添加和编辑节点。我认为最好的解决方案是在一棵深树中的一个查询中执行此操作。我要问的是如何设计模式、存储和检索?

4

3 回答 3

2

我能给出充分答案的唯一部分是关于 ORM 框架。NHibernate非常擅长处理表继承。例如,如果您使映射正确,它将为您保存的每个母亲或父亲保存一个 Person 实体。

查看继承映射

于 2008-12-29T02:50:06.603 回答
0

你不需要为一个人设置一个母亲和一个父亲,你只需要为每个人关联2个父母。识别具有“性别”属性的人,男性将自动成为父亲,女性将自动成为母亲。

于 2010-01-14T20:48:58.427 回答
0

我不明白你的具体情况有多难。如果父亲和母亲的代码没有不同的行为,则不需要单独的类。您甚至可能根本不需要对 person 进行子类化。

如果确实发现您确实需要一个超类和两个子类,并且您希望表格图具有一定的可读性(而不是对平面表格中的每个原始属性进行 GUID),您可以在其中包含子类 A 和子类 B 数据它们各自的表具有外键关系到具有超类型数据的表。

如果 Has-A 关系依赖于子类型,您可以将其作为列放在适当的子类表中,并带有对 person 的外键约束。

我错过了什么吗?如果您描述实施此解决方案时面临的问题,也许会有所帮助。

于 2010-03-29T13:46:01.687 回答