2011-02-09 54 views
1

数据库中的多个对象需要用字符串标记(完全是任意的)来标记。一个解决方案是一个典型的多对多一对多关系表示:标记数据库对象(字符串标记)和标记查找


table Customer  CustomerId, CustomerName 
table Product  ProductId, ProductName 
table Tags   TagId, TagName 
table CustomerTags CustomerId, TagId 
table ProductTags ProductId, TagId 

另一种解决方案是具有代表通过PATH secondary XML index标签,以提高连续查询XML列:


table Customer  CustomerId, CustomerName, Tags 
table Product  ProductId, ProductName, Tags 

哪里的标签是这将有标签,如<标签> <标签名称=“标签1”/> < XML列/标签>和路径索引喜欢/标记/标签

第一种解决方案提供了更快的查找,但添加了更多表格。第二种解决方案更慢但更干净。

我是新来的SQL,可能忽略了一些东西,所以任何输入将不胜感激。

回答

2

我的投票将在第一个解决方案。

首先,在SQL Server 2008上处理XML比等效的直接tbl-bridge-tag设置要慢。如果您想查找所有标记为X的产品,传统SQL查询将从tag-> product_tag-> product开始。您可以创建XML indexes(如您所提及的),但这些比XML本身更庞大,并且每个标记至少需要两个索引(一个用于主要,另一个用于VALUE - 您需要VALUE辅助索引而不是PATH二级索引)。其次,如果您重命名/放弃标签,则必须通过每个相关对象(产品/客户)的XML结构并使用xml.modify(它具有非常有限的支持 - 例如,只有一个节点可以是一次修改)。

+0

标记删除的好处...非常好,谢谢! – kateroh 2011-02-09 22:29:18