database - 建模多个多对多关系的最自然方式

标签 database database-design

假设我有书和人。一个人可以写很多书,一本书可以由很多人写。一个人读过很多书,一本书被很多人读过。

Person               Book
------               -----
personId             bookId

我可以使用两个关系表:

has_read             has_authored
--------             ------------
personId, bookId     personId, bookId

或者一个:

person_book_relation
--------------------
personId, bookId, relationType ("read", "authored")

另一个例子可能是 Actor 和 Event 之间的某种订阅者/发布者关系。

是否有任何选择指南?

如果有更多类型的关系呢?这会改变您的解决方案吗?

一个团队有很多人都有一个角色。一个人可以在很多团队中。 (只是编造的)

Team_Person_relation
--------------------
TeamId, PersonId, Role ('Defender', 'Attacker', 'Goalkeeper', 'Midfielder'... etc)

如果您要使用单独的表格,则至少需要 4 个表格。但是,感觉团队角色之间的联系比“阅读/创作”关系更紧密?

最佳答案

我会使用第二种类型的表,除非我遇到关系类型实际影响表中列的情况。

例如,在图书示例中,作者可能有一个将其发送给出版商的日期,例如,这使将所有信息保存在一个表中的想法无效,因为该信息不适用于读者.

“Goals saved”同样只适用于您的守门员。

我想诚实的,如果有点陈腐的回答是“这取决于你试图提取什么信息”——但一般来说,你可以更明确地表明“这是描述表 x 和表 y 之间关系的表"您的数据库将越清晰、越容易维护。

关于database - 建模多个多对多关系的最自然方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12206177/

相关文章:

sql-server - 如果链接表中没有匹配的值,如何显示零值

java - 将输入的密码与数据库中的 BCrypt 散列密码进行比较

mysql - sql/mysql新手无法找出外键

SQL选择用字符串替换整数

mysql - 存储允许的设置组合

sql-server - 友情网站数据库设计

database - 为什么Elasticsearch不返回包含几乎相等词的文档?

php - orWhere 不使用 Laravel Eloquent 关系查询

mysql - 配置文件页面 View 的数据模型

mysql - 什么 SQL 关系适合这里?