我想做的是有许多表代表原始数据,因此在这种情况下,
Items (ID pk, Name, <properties>)
Tags (ID pk, Name)
TagItems (TagID fk, ItemID fk)
这样可以在写入时间上快速运行,并使所有内容正常化,但是您可能还需要注意,对于每个标签,您需要为要与的每个其他标签进行两次表连接,因此读取速度很慢。
一种改善读取的解决方案是通过设置一个存储过程来在命令中创建一个缓存表,该存储过程实质上是创建一个新表来表示扁平化格式的数据...
CachedTagItems(ID, Name, <properties>, tag1, tag2, ... tagN)
然后,您可以考虑“标记项”表需要保持多长时间更新一次(如果它在每次插入中),然后在游标插入事件中调用存储过程。如果这是每小时的任务,则设置一个每小时的任务来运行它。
现在,要变得真正聪明的数据检索,您将需要创建一个存储过程以从标记中获取数据。而不是在大量的case语句中使用嵌套查询,而是要传递一个包含要从数据库中选择的标签列表的单个参数,并返回记录集的Items。使用按位运算符,最好是二进制格式。
以二进制格式,很容易解释。假设有四个标签分配给一个项目,用二进制可以表示
0000
如果将所有四个标签都分配给一个对象,则该对象将如下所示:
1111
如果只是前两个...
1100
这只是在所需列中查找带有1和0的二进制值的情况。使用SQL Server的按位运算符,您可以使用非常简单的查询来检查第一列中是否有1。
检查此链接以了解更多信息。