使用XML Type在SQL Server中实现复杂模式的建议

时间:2011-03-04 06:00:14

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

我的应用程序具有域实体的复杂架构。它是必需的使用SQL Server 2008.以下是复杂性:

域实体是分层的:数据结构是树;它嵌套在很多层面。树中的少数节点是可重复的(多值)。例如,该实体可以具有无限的地址(家庭,计费,运输,办公室等) 域实体可扩展:架构可能会在未来扩展(不缩小)。

直接将此类架构设计为相关的SQL Server表非常具有挑战性。如果不进行设计,那么查询肯定会如此。

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

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

4 个答案:

答案 0 :(得分:2)

一个建议:不要做。认真。你已经陷入了滑坡 - etter学会使用数据库。

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

您还会从ORM到报告工具左右松散大量工具。仅仅因为您滥用了XML支持数据库(计划存储文档,而不是伪数据库)。

您的疑问:

  

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

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

  

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

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

  

我可以在这种情况下有效使用Entity Framework吗?

显然没有。

  

建议采用哪种最佳做法?

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

答案 1 :(得分:2)

我正在为这个抽象层工作: http://rogeralsing.com/2011/02/28/linq-to-sqlxml/

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

上找到

您可以从Sql server XML列查询和选择/项目实体。 我们正在使用它来改进实体模式,同时保持旧版本的完整性。

有人说,我们只将它用于特殊情况,并将O / R映射作为默认方法。

答案 2 :(得分:1)

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

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

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

我想你需要回到我们这里来说明你是否需要查询1 xml文档(在这种情况下,关系数据库可能会更好,由@TomTom建议)或多个文档(我会使用SQL Server来查询)你可以通过某种方式将这些文件链接在一起。)

可以找到XML索引提示here

有关SQL 2008 here

中XML的更多信息

H个,

斯图

答案 3 :(得分:0)

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