【问题标题】:Recommendations for implementing a complex schema in SQL Server using XML Type使用 XML 类型在 SQL Server 中实现复杂架构的建议
【发布时间】:2011-07-08 14:19:09
【问题描述】:

我的应用程序有一个复杂的域实体架构。 需要使用 SQL Server 2008。以下是复杂性:

Domain Entity is Hierarchical:数据结构是一棵树;它嵌套了很多层。树中很少有节点是可重复的(多值)。例如,实体可以有无限的地址(家庭、帐单、送货、办公室等)
域实体是可扩展的:架构将来可能会扩展(而不是缩小)。

将这样的架构直接设计为相关的 SQL Server 表是非常具有挑战性的。如果不设计,查询肯定会这样。

我正在考虑使用 XML 类型来存储域实体记录。但是我有以下疑问:

  • 由于特殊的报告需求,每个字段都应该是可查询的(在实体记录内和实体记录之间)。这甚至适用于将来添加到架构中的字段。
  • 使用 XML 类型时,由于我失去了结构,我可以设计的最佳数据访问层是什么?
  • 在这种情况下我可以有效地使用实体框架吗?
  • 有没有推荐的最佳做法?

【问题讨论】:

    标签: sql-server xml data-access-layer hierarchical-data


    【解决方案1】:

    一个建议:不要这样做。严重地。您已经走下坡路了 - 继续学习使用数据库。

    您在此处定义的“域实体”将很大,这意味着查询它将是一个挑战。无限地址意味着您必须准备好 100.000 个。任何愚蠢到要求 xml 文档的人都会得到一个严重的惊喜,服务器也是如此。

    您还会左右松动很多工具 - 从 ORM 到报告工具。仅仅因为您滥用了数据库所具有的 XML 支持(计划存储文档,而不是充当伪数据库)。

    您的查询:

    由于特殊的报告需求,每个字段都应该是可查询的(内部和跨 实体记录)。这甚至适用于将来添加到架构中的字段。

    你知道,在英语中,这不是查询。也不可能。

    在使用 XML 类型时,由于我失去了结构,我可以设计的最佳数据访问层是什么?

    开始编写 SQL。用手。或者自己开发。您已经脱离了人们使用 XML 的方式,因此没有预定义的工具支持。

    在这种情况下我可以有效地使用实体框架吗?

    显然没有。

    有什么最佳做法推荐吗?

    是的,学习正确使用 SQL Server。这不是一个好方法。

    【讨论】:

    • +1。关系数据库可以对层次模型进行建模。这就是 1-N 关系的用途。大多数现实世界的模型分层的,但仍然在关系数据库中。
    • 谢谢汤姆汤姆。既然你强烈反对,我想你绝对清楚这是一种错误的做法。所以再次感谢。我已经对常规使用 SQL Server 进行了充分考虑,这些是我偶然发现的障碍。 1)使用表关系实现层次结构将有巨大的性能损失。 2) 我想不出一种优雅的方式来实现所需的模式可扩展性。接下来,我遇到了sisodb.com,它采用模型优先的方法来设计实体,但我不相信将其用于我的生产。
    • 嗯,1 和 2 是所有数据库的问题。它变得复杂(那又怎样;)-这是工作的一部分)并且可以以某种方式有效地处理层次结构,但它们在所有语言中都是一个坏问题。就性能而言,使用 xml 不会变得更容易。
    • 检查 2008 数据类型。 HierarchId 可能会有所帮助。
    • TomTom,我之前检查过 HierarchyId 并得出结论,它适用于在层次结构中的所有节点中具有相似记录(类型)的层次结构。我的每个节点都有不同的。
    【解决方案2】:

    我正在为此开发一个抽象层: http://rogeralsing.com/2011/02/28/linq-to-sqlxml/

    代码可在https://github.com/rogeralsing/linq-to-sqlxml获得

    您可以从 Sql server XML 列中查询和选择/投影实体。 我们正在使用它来发展实体模式,同时保持旧版本不变。

    也就是说,我们只在特殊情况下使用它,并将 O/R 映射作为默认方法。

    【讨论】:

    • 从表面上看,它看起来很不错!我感谢你的努力。这将对许多人有所帮助。我希望你继续巩固这件作品并使其成为最高质量的产品。万事如意!
    【解决方案3】:

    老实说,虽然我看到了@TomTom 的观点,但这取决于它是否只是一个 xml 文档。使用 2008,您可以设置 XML 模式并将它们映射到 XML 字段。

    与 TomTom 的回答相反,您可以像往常一样查询 xml 数据字段。查看以下 SO 答案以获取更多信息:https://stackoverflow.com/questions/966441/xml-query-in-sql-server-2008

    您可以使用实体框架(我的知识有点短),通过制作一些存储过程来查询您的数据,然后从代码中调用存储过程并将其转换为 XDocument。不是最漂亮的方法,但它应该工作。注意:可能有另一种方法可以做到这一点,但就我对 EF 的了解而言,也许在问题中为 EF 添加标签?

    我想您需要回到我们这里并说明您是否需要查询 1 个 xml 文档(在这种情况下,@TomTom 建议的关系数据库可能会更好)或多个文档(我将使用 SQL Server 来做这项工作。无论如何,您可能会有某种方式将这些文档链接在一起)。

    XML 索引提示可以找到here

    还有更多关于 SQL 2008 中 XML 的信息 here

    第,

    学习

    【讨论】:

    • 我想查询许多 XML 文档(例如表中的许多行)。我同意在单个文档中查询和搜索已经得到很好的支持。
    • 是的,你可以这样做。可以找到一个简短的示例:stackoverflow.com/questions/1509529/… 如果您需要更多信息,请告诉我
    【解决方案4】:

    您尝试过 SisoDb 吗?如果您对此有任何疑问,我很乐意回答。使用http://www.sisodb.com 的联系表或在 Twitter 上联系我。

    【讨论】:

      猜你喜欢
      • 2011-12-07
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 2012-04-19
      • 1970-01-01
      相关资源
      最近更新 更多