【问题标题】:How to represent relationship between two items in DB?如何表示数据库中两个项目之间的关系?
【发布时间】:2011-01-03 16:38:07
【问题描述】:

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

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

  • 身份证
  • 姓名
  • 计数

我现在要谈实际的了。例如,如果您单击标记“PHP”,它会显示另一个页面,其中包含所有标记为“PHP”的任务。类似于this page 的东西。重要的是这个相关标签列表。如何在数据库中表示?

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

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

  2. 用 cols tagrelated tagcount 制作一个表格,其中包含所有可能的标签关系。我们看到的唯一问题是重复性。我们可以有标签 PHP 和相关标签 DB2,但我们也可以有标签 DB2 和相关标签 PHP,这当然是相同的关系,具有相同的计数。

我实际上很喜欢选项 #2,但没有重复。也许标签之间没有如此密切关系的选项(好像没有任何“主要”和“次要”标签)可能效果最好。在这一点上我不是很确定,我不想为将来无法工作的东西建模,或者如果有例如一百万个标签会太慢。

我们将使用 PHP 和 mySQL 或 DB2,但我想这并不重要。

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

提前致谢。

【问题讨论】:

  • 好吧,我会选择选项 2 并接受重复的可能性,因为这允许您拥有单向标签,因此您始终根据最左侧的列搜索相关标签,即您总是在哪里搜索Tag=[whatever] 并且您只需使用 RelatedTag。如果您明白我的意思,这允许您将“PHP”标记为“DB2”,而不必将“DB2”与“PHP”相关联,因为我倾向于认为 DB2->PHP 不一定与 PHP-> 相同DB2 ....那么我可能又疯了哈哈。我什至不会担心 1M 标签。索引/磁盘空间将为您解决这个问题:)

标签: database algorithm


【解决方案1】:

我假设您这样做是因为希望“显示与 'tag' 相关的前 N ​​个标签”查询非常快。

如果您在数据库中执行此操作,那么您的第二种方法是最好的。您甚至可以考虑创建一个在 tag 字段上升序并在 related-tag-count 字段上降序的索引。

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

【讨论】:

    【解决方案2】:

    我想,如果您有一个“分配给任务 X 的标签”的表,并且索引正确/聪明,那么使用连接查找选项 1) 中描述的标签应该不会花费那么长时间。那将是最有活力的方法。

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

    方法 2) 将(如您所描述的)不允许您获取当前任务的确切相关标签,因为您没有存储任务 ID。但是,如果您这样做了,那么您将与方法 1) 大致相同。

    【讨论】:

      【解决方案3】:

      我假设您使用单独的表(仅任务 ID、标签 ID)表示任务标签关系,因此您描述的第一个选项将是从任务表到标签表的“简单”连接使用任务标签关系表。恐怕我的 SQL 知识已经枯竭了一点,所以我不相信自己会就它需要哪种类型的 INNER/OUTER/LEFT/RIGHT 加入,以及你的性能类型给出建议可以期望通过适当的索引构建等等。试试看,这可能是最好的做法... sql 语句可以使用 Visual Studio/Access/可能其他的东西来构建。

      如果您希望数据库中有很多项目,我会假设您的第二种方法更快。但是,我绝对建议您进行适当的性能测试来确定这一点,而不是猜测。无论哪种方式,您都可以通过仅存储其中一个标签-标签对(例如 db2-php 而不是 php-db2)来消除重复性。例如,可以通过按 id 对它们进行排序来确定要存储哪个,这样您就始终将它们与具有最小 id 的标签一起存储。

      我还猜想您的第一个选项上手速度更快,因此您可以先使用它,然后在您有时间这样做或一旦它成为性能问题时再选择第二个选项。

      【讨论】:

        猜你喜欢
        • 2016-03-12
        • 1970-01-01
        • 1970-01-01
        • 2018-08-17
        • 1970-01-01
        • 2018-09-15
        • 1970-01-01
        • 2015-04-14
        • 1970-01-01
        相关资源
        最近更新 更多