我正在为文章及其作者建模,每篇文章可以有多个作者,每个作者可以有多篇文章。保持给定文章的作者顺序非常重要(作为给定文章的作者列表中的第一个与最后一个作者非常不同)。我如何才能最好地保持作者的顺序? (我正在使用postgres,9.4)
经典的多对多通过“author_id,article_id”的中间表不保持给定文章的作者顺序。我看到两个解决方案:
将author_rank列添加到author_articles表,使其成为“author_id,article_id,author_rank”
废弃中间表,在文章表中添加“author_ids”列,并在其中保留一组作者ID。 (丢失参照完整性的自动检查但简单化)
还有其他解决方案吗?任何原因导致两种解决方案中的一种更糟糕?谢谢!
答案 0 :(得分:2)
首选选项是添加author_rank
列。
所以你会:
Article
表格,其中包含此表格中您需要的所有列,以及每篇文章的唯一ID(article_id
)
Author
表格,其中包含此表格中您需要的所有列,以及每位作者的唯一ID(author_id
)
第三个表author_articles
表格,article_id
和author_id
将两个表格连接在一起,并附带您建议的其他列(author_rank
)
这是用户界面最简单,最容易实现的。
查询很容易编写。
要获得文章作者,请提供article_id
并按author_rank
至author_articles
表格进行排序。
最好将相关信息放在一个表格中。 这样,如果您想要链接到另一个表,请说一个评论者表:一组已经审阅过该文章的人,那么您最终不会回到设计文章表。
我根本不会选择第二种选择。
你实际上并没有获得任何简单性,事实上你正在使它变得更加复杂。例如将所有author_Ids放在一列中:您需要编写代码以放置togather author_Ids并在查看时将它们分开。 你最终会编写一个软件而不是仅使用查询。
我希望这会有所帮助。
答案 1 :(得分:1)
我强烈建议您在几乎任何情况下使用第一种解决方案。我应该说,对于Postgres,这个决定比大多数其他数据库更难。 Postgres对阵列有很强的支持,你可以用第二种解决方案完成你想要的大部分工作。
那就是说,第一个解决方案允许你做很多你可能想做的事情:
等等。 (我知道除了1以外的所有数据都可以使用数组查询;我知道如何做到这一点。)
我不认为第二种方法(使用数组)更简单"。随着数据库的使用,缺乏参照完整性是一个大问题。需要了解"非标准"数组功能(与标准SQL相对)限制了可以直接查询数据库的受众。
所有这一切,在某些情况下阵列将是一个不错的选择。我只是怀疑这是用例之一。