我不知道它们是否符合最佳条件,但 DotNetKicks 和 Kigg 都是开源 digg 克隆实现。你可以看看他们是如何做标签和搜索的。
我最好的猜测没有经过深思熟虑:)
- 我从不喜欢将多个值序列化到一个字段中的想法,因此存储在一个字段中的分隔字符串对我没有吸引力……可能适用于具有树的邻接路径,但这些路径始终是有序的,标签不需要。这似乎会对您可能为找到它们所做的 LIKE 操作员工作增加负担。
所以我最初的想法可能是 Entity -> EntityTag <- Tag。
这种方法使通过 Tag 查找项目变得非常容易,通过 EntityTag 重新加入,收工。
您需要在此处进行辅助操作来为结果集选择不同的标签。所以 a.) 拉取结果集,b.) 规范化标签空间。我认为无论#1 的答案是什么,你都会这样做——即使将标签填充到一个字段中仍然会产生重复的标签(并且你必须对它们进行反序列化才能执行此操作——因此需要更多的工作,这是完全关系的另一个论点方法)。
还是很轻松的。这是序列化方法效果更好的一个领域。无需加入子标签,它就在实体中。也就是说,通过两个表连接提取 0..n 个标签对我来说似乎并不太具有挑战性。如果您正在谈论性能考虑,请先将其标准化,然后通过缓存或 denorm 进行优化。
另一种选择是“两者都做”。这感觉像是过早的优化,但您可以使用完全规范化的方法来支持任何以标签为中心的操作并在持久化后序列化以在实体中拥有非规范化版本。更多的工作,如果没有完全覆盖,一些可能会失去同步,但如果在您的用例中对完全标准化的方式存在真正的限制,那么两全其美。
Lucene 也很有趣,您可以在索引 IIRC 中声明特定的元数据,因此您也可以通过这种方式利用标签搜索。我的怀疑是,如果你在这条路上走得太远,那么你最终会在数据库中存储的内容与索引之间出现一些断开连接。我可以说 Lucene,它功能强大且易于使用——我相信 .Text 使用它是因为它的搜索功能,并且在切换到社区服务器之前它支持所有 weblogs.asp.net。如果 MSSQL 不在图片中/足够,我会坚持使用它进行全文搜索,解决数据库 imo 中的标签问题。