【问题标题】:Data schema and query for polymorphic tree in SQL Server [closed]SQL Server 中多态树的数据架构和查询 [关闭]
【发布时间】: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


【解决方案1】:

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

查看Inheritance Mapping

【讨论】:

【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 2017-08-25
      • 2017-10-18
      • 2018-04-12
      • 2014-02-01
      相关资源
      最近更新 更多