【问题标题】:"ordered" many-to-many relationships in sql (postgres)?sql(postgres)中的“有序”多对多关系?
【发布时间】:2017-06-16 20:11:09
【问题描述】:

我正在建模文章及其作者,其中每篇文章可以有多个作者,每个作者可以有多个文章。保持给定文章的作者顺序很重要(成为给定文章作者列表中的第一个作者与成为最后一个作者有很大不同)。我如何最好地保持作者的顺序? (我使用的是 postgres,9.4)

通过“author_id,article_id”中间表的经典多对多不会保留给定文章的作者顺序。我看到了两种解决方案:

  1. 在 author_articles 表中添加 author_rank 列,使其为“author_id, article_id, author_rank”

  2. 废弃中间表,在文章表中添加一个“author_ids”列,并在其中保留一个作者 ID 数组。 (失去了对参照完整性的自动检查,但获得了简单性)

还有其他解决方案吗?这两种解决方案中的任何一种更糟糕的原因是什么?谢谢!

【问题讨论】:

标签: sql postgresql database-design many-to-many


【解决方案1】:

首选选项是添加author_rank 列。

所以你将拥有:

  1. 一个Article 表,其中包含您在此表中需要的所有列以及每篇文章的唯一 ID (article_id)

  2. 一个Author 表,其中包含您在此表中需要的所有列以及每个作者的唯一 ID (author_id)

  3. 第三个表 author_articles 表将两个表通过 article_idauthor_id 与您建议的附加列 (author_rank) 连接在一起 (author_rank)

这是在用户界面方面最简单和最容易实现的。

查询很容易编写。

要获取文章作者,请提供article_id 并按author_rank 订购author_articles 表。

在一个表中只保留相关信息是一种很好的做法。 这样,如果您想链接到另一个表,比如说审阅者表:一组已经审阅过文章的人,那么您最终不会回到设计文章表。

我根本不会选择第二种选择。

您实际上并没有获得任何简单性,实际上您正在使它变得更加复杂。例如将所有 author_Ids 放在一列中:您需要编写代码将 author_Ids 放在一起并在查看时将它们分开。 您最终将编写一些软件,而不仅仅是使用查询。

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我强烈建议您在几乎任何情况下都使用第一种解决方案。我应该说,对于 Postgres,这个决定比大多数其他数据库更难。 Postgres 对数组有很强的支持,你可以用第二种解决方案做大部分你想做的事情。

    也就是说,第一个解决方案允许您做很多您可能想做的事情:

    1. 可能最重要的是,您可以声明显式外键关系。这允许数据库确保数据完整性。
    2. 第一种方法可以更简单地回答诸如“一位作者写了多少本书”之类的问题。
    3. 第一种方法可以更简单地回答诸如“哪两位作者一起写的书最多”之类的问题。
    4. 第一种方法可以更简单地回答诸如“哪些书共享作者”之类的问题。

    等等。 (我知道除了 1 之外的所有内容都可以使用数组进行查询;我知道该怎么做。)

    我不认为第二种方法(使用数组)“更简单”。随着数据库的使用,缺乏参照完整性是一个大问题。了解“非标准”数组功能(相对于标准 SQL)的需要限制了可以直接查询数据库的受众。

    话虽如此,在某些情况下数组是一个不错的选择。我只是怀疑这是其中一种用例。

    【讨论】:

    • Ad 4) "哪些书共享两个作者?哪些书共享所有作者?(关系划分)
    猜你喜欢
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 2011-10-09
    • 2020-09-15
    相关资源
    最近更新 更多