我不知道它们是否合格,但DotNetKicks和Kigg都是开源的digg克隆实现。你可以看看他们如何做标签和搜索。
我没有很多的酝酿最佳猜测:)
- 我从来没有像序列化多个值到一个单一领域的想法,存储在一个字段,以便分隔字符串不吸引我...可能适用于具有树的邻接路径,但这些路径总是有序的而标签不需要。这看起来好像会征税LIKE操作员的工作,你可能会找到它们。
所以我最初的看法可能是实体 - > EntityTag < - 标签。
此方法使得通过标签查找项目变得非常简单,通过EntityTag连接回去,称之为一天。
您需要一个辅助操作来为结果集选择不同的标记。所以a。)拉取结果集,b。)标准化标签空间。我认为,不管第一个答案是什么 - 即使将标签填充到一个字段中仍然会产生重复标签(并且您必须反序列化它们才能执行此操作 - 因此更多的工作,另一个完全关系的参数方法)。
还是很容易的。以下是序列化方法效果更好的一个领域。无需加入子标签,它就在实体中。也就是说,通过两个表连接拉出0..n标签对我来说似乎不是太具有挑战性。如果你正在讨论perf的考虑事项,首先将它构建为规范化,然后通过缓存或denorm进行优化。
另一种选择是“同时做”。这感觉就像是一种过早的优化,但是您可以采用完全标准化的方法来支持任何以标签为中心的操作,并在持续存在序列化后在实体中拥有非标准化版本。如果还没有完全覆盖,还有一些工作可能会失去同步,但如果在用例中完全标准化的方式存在真正的限制,那么两者都是最好的。
Lucene也很有趣,你可以在索引IIRC中声明特定的元数据,所以你也可以用这种方式来利用标签搜索。我的怀疑是,如果你在这条路上走得太远,那么你最终会在数据库中存储的内容与某个时刻的索引之间断开连接。我可以赞同Lucene的说法,它的功能非常强大且易于使用 - 我相信.Text将其用于搜索功能,并且在它切换到社区服务器之前支持所有的weblogs.asp.net。如果MSSQL不在图片/足够的范围内,我会坚持使用全文搜索来解决数据库中的标签问题。
着upmod这篇文章足以 – Shawn 2009-01-03 21:16:48