【发布时间】:2011-01-03 16:38:07
【问题描述】:
我和我的同事正在开发一个与 Stackoverflow 类似的网站,但用于提交任务(以及供内部使用)。今天早上我们讨论了标记任务,但无法真正确定哪个选项是最快的,或者我们是否没有遗漏什么。
让我们想象一下带有标签的表格,它会根据用户动态更新。用户可以创建任何标签,它们将被添加到此表中。结构如下:
- 身份证
- 姓名
- 计数
我现在要谈实际的了。例如,如果您单击标记“PHP”,它会显示另一个页面,其中包含所有标记为“PHP”的任务。类似于this page 的东西。重要的是这个相关标签列表。如何在数据库中表示?
我们想到了两种选择,但我认为它们中的任何一种都不是最有效的。
选择所有带有“PHP”标签的任务并检查它们包含的其他标签。几年后我们可能会得到服务器的答复。
用 cols tag、related tag、count 制作一个表格,其中包含所有可能的标签关系。我们看到的唯一问题是重复性。我们可以有标签 PHP 和相关标签 DB2,但我们也可以有标签 DB2 和相关标签 PHP,这当然是相同的关系,具有相同的计数。
我实际上很喜欢选项 #2,但没有重复。也许标签之间没有如此密切关系的选项(好像没有任何“主要”和“次要”标签)可能效果最好。在这一点上我不是很确定,我不想为将来无法工作的东西建模,或者如果有例如一百万个标签会太慢。
我们将使用 PHP 和 mySQL 或 DB2,但我想这并不重要。
所以,实际的问题是:还有其他更好的选择吗?如有任何问题,尽管问我。
提前致谢。
【问题讨论】:
-
好吧,我会选择选项 2 并接受重复的可能性,因为这允许您拥有单向标签,因此您始终根据最左侧的列搜索相关标签,即您总是在哪里搜索Tag=[whatever] 并且您只需使用 RelatedTag。如果您明白我的意思,这允许您将“PHP”标记为“DB2”,而不必将“DB2”与“PHP”相关联,因为我倾向于认为 DB2->PHP 不一定与 PHP-> 相同DB2 ....那么我可能又疯了哈哈。我什至不会担心 1M 标签。索引/磁盘空间将为您解决这个问题:)