我正在开发一个使用XML与外部服务进行通信的服务应用程序.我计划使用sql Server 2008来存储接收和发送到外部服务的XML.我正在探索将XML存储在数据库中的选项.我发现的三个选项是:
>将XML存储在XML数据类型列中
>创建表以存储XML中表示的各种父关系和子关系.
>上述两种方法的混合,其中原始XML存储在XML数据类型列中,但XML中的几个字段分解为各自的列,以简化查询和索引.
我正在根据您的个人经验寻找任何建议,在sql Server中存储和检索XML数据.
一些额外的背景:我使用了一个名为XsdObjectgenerator的‘xsd.exe’等效项来创建基于XML模式的.net类.当服务收到XML文件时,它会被反序列化为.net类的实例.此实例用于执行服务的操作.我最初的计划是使用上面的选项#1来存储XML.如果我需要更新或报告数据,我只需将db记录反序列化为我的一个.net类.
尽管这种方法很有效并且使得使用xml非常简单,但我担心随着数据量的增加,查询XML数据类型记录的性能会降低.这就是我探索选项2的原因. 3.上面.
除了存储XML之外,还将查询XML以在报告和单独的Web应用程序中使用. db记录将被最终用户查询,排序,过滤,分组,汇总并可能更新.
如果你大多只是存储它,并且可能在以后作为一个整体检索并再次发送它,那么我肯定会使用XML数据类型 – 没有必要将它粉碎成碎片.
但是,如果您需要主要处理XML文件的内容,并且可能还需要操作和更改该内容,那么建议使用列来匹配XML内容,并在存储时将其粉碎,使用它,当你需要时,使用SELECT(columns)FROM dbo.Table FOR XML …..从关系片重新组装它.
粉碎和重新组装会产生一些开销 – 所以你需要问问自己这是否值得做.但是,如果您需要过多地操作XML列,还会产生一些开销.
如果您只需要对XML中的一些属性进行只读访问,我就会很高兴能够将这些属性包装到UDF中并将其作为表中的计算列表示.这样,您可以根据存储在XML中某处的值轻松地从表中选择一些内容 – 非常方便!但是不要过度使用这种方法 – 适用于2,3个属性 – 但是如果你需要一遍又一遍地访问你的XML(以及大部分或全部),那么你可能最好将它粉碎成相关的部分开始.