将数据保存为数据库中的XML与保存多行数据
我正在设计我的数据库并想知道处理此问题的最佳方法。我有一个页面,看起来像这样的标签:将数据保存为数据库中的XML与保存多行数据
Tab1
--SubTab1
----Data1
--SubTab1
--SubTab1
Tab2
--SubTab1
--SubTab1
--SubTab1
Tab3
--SubTab1
--SubTab1
--SubTab1
我可以把数据库中的信息将被存储在多个行这样
TypeID---------------Name
1--------------------Tab
2--------------------Data
ObjectID----------Parent-------------TypeID
1-----------------0------------------1
2-----------------0------------------1
3-----------------0------------------1
4-----------------1------------------1
或者我可以把这个在数据库就像这样:
<root>
<tab name="MyTab">
<tab name="MySubTab">
<data>1234567890</data>
</tab>
</tab>
</root>
如果我刚拉的XML从数据库中,然后我就不需要选择多行我只需要选择一个行然后解析XML转换为类,然后传递数据控制器。我只想知道这是个好主意吗?如果我的网站未来可以扩展,我会犯一个错误吗?随着网站变得更大并且需要更多功能,这会不会进行更多维护?
XML很难用SQL查询。如果您认为您永远不需要查询可以使用XML的数据。为了将来的灵活性,我可能会将数据存储在多行中。
如果您的数据是一大块xml,您不能使用数据库轻松搜索该数据。你需要在XML中搜索信息吗?分离它将使这项任务更容易。
也许我误解了它,但它似乎决定是否将数据保存为XML或将其保存在表中,然后使用xml查询以返回它。如果是这样的话:
更容易查询,并能处理更多的变化:保存的数据表和查询它后来是更好,如果你将有很多的变化,它会在一个较高的速度增长。您为复杂的查询获得更多选择。
如果数据不增加或更改快得多:如果数据惯于变化,往往并没有成长为多,那么你可以简单地使用XML来保持它在正确的语法已经是它的危险,它会有更少的性能影响。这种方法意味着您在查询正确的数据时缺乏灵活性。
如果您正在考虑是否将XML存储在数据库中,现在应该开始问自己是否需要将数据存储在数据库中。
将这些数据存储在静态XML文件中怎么样?这是一个可行的选择吗?为什么?为什么不?
如果这些数据没有频繁变化,并且您不想将旅程投资到数据库,但您仍然希望确保将来可以使用CMS编辑此数据,那么也有可能要创建一个使用数据库中的数据创建静态XML文件的批处理过程,然后您的应用程序将完全忽略此数据位于数据库中并仅使用静态XML文件这一事实。批处理过程将按计划或按需运行。
这是一种可扩展,可维护且高效的方法来处理不经常更改的数据。
类似的实现方法是使用像ASP.net或PHP这样的服务器端技术,从数据库表中为您生成XML,然后使用输出缓存和很长的到期时间来确保生成过程不经常运行。
作为一般的经验法则,在数据库字段中存储非原始数据或复杂数据通常不是一个好主意。
如果使用SQL Server,我只会使用hierarchyid。虽然在TSQL中可以处理XML,但有几点需要注意。最重要的是得到有序的XML回吸,因为TSQL(2008)不正确/完全支持position()
。它需要有点凌乱的连接到'索引器'列。 (如果您阅读了XML blob后面的整个,但这不适用,但这听起来像是手头解析客户端的头痛)。
hiearchyid允许这些水平可以很容易地保存,以更加规范化的格式使数据库(RDBMS”是设计超过许多列有效地工作,只要确保有正确的索引),而应该是更容易在一般情况下处理 - 尤其是如果你还没有准备好潜入SPROC土地:-)
hiearchyid代表父/子关系,以及兄弟姐妹进行排序(它真的可以收拾模型);它基于深度优先模型,适用于这样的任务。另外,使用XML可能不会保存任何内容(IIRC,[typed] XML实际上已经分解为某种内部列设置)。如果需要,它(XML)更好地用作“输入/输出”消息格式(或“文档”)。
快乐SQL'ing。
这不是很难做(排序需要一些使其变得复杂的黑客,但是: - /) - 如果您直接在TSQL(2008+)中编写语句,只需要学习模式。话虽如此,我不会使用XML来解决这个问题,因为“黑客”会得到适当的排序(`position()`没有得到适当的支持)。 – 2010-12-05 00:20:19
将“hard”读为“比查询跨列和行分割的原始数据要困难”。 – cspolton 2010-12-05 10:13:31
您也可以将“hard”读作“比查询跨列和行分割原始数据效率要低效”;这可能更加重要。即使在黑客存在的情况下,它们仍然是黑客,他们会摆脱许多与数据库相关的效率。 – Murven 2010-12-05 17:44:12