如何表示DB中两个项目之间的关系?

时间:2010-01-11 09:23:06

标签: database algorithm

我和我的同事们正在开发一个与Stackoverflow类似的网站,但是用于提交任务(以及内部使用)。今天早上我们讨论了标记任务,无法确定哪个选项最快,或者我们是否遗漏了什么。

让我们想象一下带有标签的表格,它会根据用户动态更新。用户可以创建任何标签,并将其添加到此表中。结构如下:

  • ID
  • 名称
  • 计数

我现在就明白了。如果单击,例如标记“PHP”,它将显示另一个页面,其中所有任务都标记为“PHP”。与this page类似的东西。重要的是相关标签列表。如何在数据库中表示它?

我们想到了两个选择,但我认为其中任何一个都不是最有效的选择。

  1. 选择带有“PHP”标签的所有任务,并检查它们包含的其他标签。几年后,我们可能会从服务器上得到答案。

  2. 制作一个包含cols 标记相关标记计数的表格,其中包含所有可能的标记关系。我们看到的唯一问题是两面派。我们可以标记PHP和相关标记DB2,但我们也可以使用相关标记PHP标记DB2,这当然是完全相同的关系,具有相同的计数。

  3. 我实际上非常喜欢选项#2,但没有两面性。也许在标签之间没有如此密切关系的选项(好像没有任何“主要”和“次要”标签)可能效果最好。我现在还不是很确定,我不想对将来无效的东西进行建模,或者如果有一百万个标签就太慢了。

    我们将使用PHP和mySQL或DB2,但我想这没关系。

    所以,实际问题是:还有其他可能更好的选择吗?如有任何问题,请问我。

    提前致谢。

3 个答案:

答案 0 :(得分:1)

我想如果你有一个带有正确/聪明索引的“分配给任务X的标签”表,那么按照选项1)所述找到标签不应该使用连接。那将是最具活力的方法。

选项二将为您提供一种方法来执行“标记X通常与标记Y和Z一起使用”查询,并且可以在创建新任务时静态填充,但是,例如当一个新任务时,它将需要更多的efford在任务中添加或删除标记。对于方法1),这将是自动的。

方法2)将(如您所述)不允许您为当前任务获取完全相关标签,因为您没有存储任务ID。但是,如果你这样做,那么你与方法1)处于同一点。

答案 1 :(得分:1)

我认为你这样做是因为想要“显示与'tag'相关的前N个标签”的查询真的很快。

如果你在数据库中这样做,那么你的第二种方法是最好的。您甚至可以考虑创建一个索引,该索引在标记字段上升序并在相关标记计数字段上降序。

但如果你真的想要速度,可以考虑将其表示为内存数据结构。

答案 2 :(得分:1)

我假设您使用单独的表(只是task-id,tag-id)表示任务标记关系,因此您描述的第一个选项是从任务表到标记表的“简单”连接使用任务标记关系表。我担心我的SQL知识已经枯竭了,所以我不相信自己会给你关于它要求什么类型的INNER / OUTER / LEFT / RIGHT加入的建议,也不会给你什么类型的表现可以期待与适当的索引构建等。尝试一下,这可能是最好的事情...可以使用Visual Studio / Access /可能是其他东西构建sql语句。

如果您希望数据库中有许多项目,我会假设您的第二种方法更快。但是,我肯定会建议你做适当的性能测试来确定这个而不是猜测。无论哪种方式,你可以通过仅存储一个标签 - 标签对(例如db2-php而不是php-db2)来摆脱双重性。要存储哪一个可以通过id对它们进行排序来确定,以便始终将它们与最小id的标记一起存储。

我还猜测你的第一个选择是开始更快,所以你可以开始使用它,然后在你有时间或者一旦它成为性能问题时再去第二个选项。