在sql(postgres)中“命令”多对多关系?

时间:2017-01-31 11:45:43

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

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

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

  1. 将author_rank列添加到author_articles表,使其成为“author_id,article_id,author_rank”

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

  3. 还有其他解决方案吗?任何原因导致两种解决方案中的一种更糟糕?谢谢!

2 个答案:

答案 0 :(得分:2)

首选选项是添加author_rank列。

所以你会:

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

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

  3. 第三个表author_articles表格,article_idauthor_id将两个表格连接在一起,并附带您建议的其他列(author_rank

  4. 这是用户界面最简单,最容易实现的。

    查询很容易编写。

    要获得文章作者,请提供article_id并按author_rankauthor_articles表格进行排序。

    最好将相关信息放在一个表格中。 这样,如果您想要链接到另一个表,请说一个评论者表:一组已经审阅过该文章的人,那么您最终不会回到设计文章表。

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

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

    我希望这会有所帮助。

答案 1 :(得分:1)

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

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

  1. 可能最重要的是,您可以声明显式的外键关系。这允许数据库确保数据完整性。
  2. 第一种方法可以更简单地回答一个问题,例如"有多少本书是作者写的"。
  3. 第一种方法可以更简单地回答诸如&#34之类的问题;两位作者将大多数书籍写在一起"。
  4. 第一种方法可以更简单地回答问题,例如"哪些书分享作者"。
  5. 等等。 (我知道除了1以外的所有数据都可以使用数组查询;我知道如何做到这一点。)

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

    所有这一切,在某些情况下阵列将是一个不错的选择。我只是怀疑这是用例之一。