标记数据库对象(字符串标记)和标记查找

时间:2011-02-09 19:51:09

标签: sql tsql sql-server-2008 database-design

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


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

另一个解决方案是使用XML列来表示带有PATH secondary XML index的标记,以改进顺序查找:


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

其中,标签是一个XML列,其标签类似于< tags>< tag name =“tag1”/>< / tags>和PATH索引类似/ tags / tag

第一个解决方案提供了更快的查找速度,但添加了更多表。第二种解决方案更慢但更清洁。

我是SQL新手,可能忽略了某些内容,因此任何输入都会受到高度赞赏。

1 个答案:

答案 0 :(得分:2)

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

首先,在SQL Server 2008上处理XML的速度比等效的直接tbl-bridge-tag设置要慢。如果要查找标记为X的所有产品,则常规SQL查询将从tag-> product_tag->产品开始。您可以创建XML indexes(正如您所提到的),但这些比XML本身更笨重,每个标记至少需要两个索引(一个用于主要,一个用于 VALUE - 您想要一个VALUE二级索引而不是一个PATH二级索引。)

其次,如果重命名/删除标记,则必须遍历每个相关对象(产品/客户)的XML结构并使用xml.modify(其支持非常有限 - 例如,只能修改一个节点)一次)。