代码之家  ›  专栏  ›  技术社区  ›  Ondrej Slinták

如何表示数据库中两个项目之间的关系?

  •  0
  • Ondrej Slinták  · 技术社区  · 14 年前

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

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

    • 身份证件
    • 名称
    • 计数

    我现在就到实处。例如,如果您单击标记“php”,它将显示另一个带有标记“php”的所有任务的页面。类似于 this page . 重要的是 相关标签列表 .如何在数据库中表示它?

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

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

    2. 用可乐做一张桌子 标签 , 相关标签 , 计数 所有可能的标记关系都在哪里。我们看到的唯一问题是口是心非。我们可以有标记php和相关的标记db2,但是我们也可以有带有相关标记php的标记db2,这当然是非常相同的关系,具有非常相同的计数。

    实际上我很喜欢选项2,但没有口是心非。也许在标签之间没有如此紧密的关系的地方(好像没有任何“主”标签和“次”标签)的选择是最好的。我现在还不是很确定,我不想为将来不起作用的东西建模,或者如果有一百万个标签的话,建模速度太慢。

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

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

    事先谢谢。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Stephen C    14 年前

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

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

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

        2
  •  1
  •   Thorsten Dittmar    14 年前

    我认为,如果您有一个带有正确/巧妙索引的“分配给任务X的标记”表,那么使用连接查找选项1)中描述的标记不会花费那么长时间。这将是最有活力的方法。

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

    方法2)会(如您所描述的)不允许您 确切地 当前任务的相关标记,因为您没有存储任务ID。但是,如果您这样做了,您将与方法1处于同一点上)。

        3
  •  1
  •   villintehaspam    14 年前

    我假设您使用单独的表(仅任务ID、标记ID)表示任务标记关系,因此您描述的第一个选项是使用任务标记关系表从任务表到标记表的“简单”联接。我担心我的SQL知识已经枯竭了一点,所以我不相信自己会给您提供关于它所需要的内部/外部/左/右联接的确切类型的建议,也不相信通过适当的索引构建等,您可以从中获得什么样的性能。试试看,这可能是最好的办法…SQL语句可以使用Visual Studio/Access/或者其他方法生成。

    如果您希望数据库中有许多项,那么我假设您的第二种方法更快。但是,我绝对建议您做适当的性能测试来确定这一点,而不是猜测。无论哪种方法,您都可以通过只存储一个标记标记对(例如,DB2 PHP,而不是PHP-DB2)来消除这种重复性。例如,可以通过按ID排序来确定要存储哪一个,这样您总是先用ID最小的标记来存储它们。

    我还想,您的第一个选项开始的速度更快,这样您就可以开始使用它,然后在您有时间使用第二个选项,或者一旦它成为性能问题。