我们数据库中的多个对象需要用字符串标记标记(完全任意)。一种解决方案是经典的多对多关系表示:
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新手,可能忽略了某些内容,因此任何输入都会受到高度赞赏。
答案 0 :(得分:2)
我的投票将是第一个解决方案。
首先,在SQL Server 2008上处理XML的速度比等效的直接tbl-bridge-tag设置要慢。如果要查找标记为X的所有产品,则常规SQL查询将从tag-> product_tag->产品开始。您可以创建XML indexes(正如您所提到的),但这些比XML本身更笨重,每个标记至少需要两个索引(一个用于主要,一个用于 VALUE - 您想要一个VALUE二级索引而不是一个PATH二级索引。)
其次,如果重命名/删除标记,则必须遍历每个相关对象(产品/客户)的XML结构并使用xml.modify(其支持非常有限 - 例如,只能修改一个节点)一次)。