我的应用程序具有域实体的复杂架构。它是必需的使用SQL Server 2008.以下是复杂性:
域实体是分层的:数据结构是树;它嵌套在很多层面。树中的少数节点是可重复的(多值)。例如,该实体可以具有无限的地址(家庭,计费,运输,办公室等) 域实体可扩展:架构可能会在未来扩展(不缩小)。
直接将此类架构设计为相关的SQL Server表非常具有挑战性。如果不进行设计,那么查询肯定会如此。
我正在考虑使用XML类型来存储域实体记录。但是我有以下问题:
答案 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我。