关联 table 的优缺点是什么?
What are the pros and cons of associative table?
在 RDBMS 中,我相信有几种方法可以设计 table 之间的关系。因此,我想问一下 pros 和 cons 在创建关系 with associative table 和 没有关联 table。是否有正式的解决方案来决定两者?
使用泛型tables,下面我演示我的意思:
示例 #1(无关联 table)
用户
+----+-------+
| id | name |
+----+-------+
| 1 | John |
| 2 | James |
| 3 | Jacob |
+----+-------+
评论
+----+-----------------------------+---------+
| id | text | user_id |
+----+-----------------------------+---------+
| 1 | Lorem ipsum dolor sit amet. | 1 |
| 2 | Praesent ultricies libero. | 2 |
| 3 | Donec eget blandit nunc. | 3 |
+----+-----------------------------+---------+
注:评论作者的引用存储在comments
.
示例 #2(具有关联 table)
用户
+----+-------+
| id | name |
+----+-------+
| 1 | John |
| 2 | James |
| 3 | Jacob |
+----+-------+
评论
+----+-----------------------------+
| id | text |
+----+-----------------------------+
| 1 | Lorem ipsum dolor sit amet. |
| 2 | Praesent ultricies libero. |
| 3 | Donec eget blandit nunc. |
+----+-----------------------------+
comment_user
+----+--------------+-----------+
| id | comment_id | user_id |
+----+--------------+-----------+
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 3 |
+----+--------------+-----------+
注意:评论作者的引用存储在comment_user
.
您使用的术语 "pivot table" 不正确。中间有各种说法table;常用名称包括结点 table 和关联 table。优点和缺点也很奇怪——你在征求意见,这在 Stack Overflow 上是明确不允许的。但是,你的问题相当误导。因此,值得回答。
你的两个选项做不同的事情。第一个实现 1:n 关系。一个给定的用户可以有很多评论。但是一条评论只能属于一个用户。
第二个实现 m:n 关系。一个给定的用户可以有很多评论。给定的评论也可以有很多用户。
显然,1:n 关系可以作为 m:n 关系的特例来实现。然而,这是矫枉过正且效率低下。
用户和评论之间的关系通常是 1:n,因此第一个结构似乎更自然。
没有什么正式的,没有。
优点:
- 关联 tables 可以处理一对一、一对多和多对多关系,具体取决于您定义的键。
- 您可以在没有用户的情况下发表评论(不使用 NULL)。
- 可以将关联 table 添加到现有数据库,而无需修改现有 table。
缺点:
- 额外的 table 会使您的架构有点混乱。
- 查询时的额外连接有点复杂,可能会影响性能。
- 确保每个评论都有一个用户(如果这是一个要求)更复杂。
顺便说一句,comment_user table 中的 id 列似乎毫无意义。
在 RDBMS 中,我相信有几种方法可以设计 table 之间的关系。因此,我想问一下 pros 和 cons 在创建关系 with associative table 和 没有关联 table。是否有正式的解决方案来决定两者?
使用泛型tables,下面我演示我的意思:
示例 #1(无关联 table)
用户
+----+-------+
| id | name |
+----+-------+
| 1 | John |
| 2 | James |
| 3 | Jacob |
+----+-------+
评论
+----+-----------------------------+---------+
| id | text | user_id |
+----+-----------------------------+---------+
| 1 | Lorem ipsum dolor sit amet. | 1 |
| 2 | Praesent ultricies libero. | 2 |
| 3 | Donec eget blandit nunc. | 3 |
+----+-----------------------------+---------+
注:评论作者的引用存储在comments
.
示例 #2(具有关联 table)
用户
+----+-------+
| id | name |
+----+-------+
| 1 | John |
| 2 | James |
| 3 | Jacob |
+----+-------+
评论
+----+-----------------------------+
| id | text |
+----+-----------------------------+
| 1 | Lorem ipsum dolor sit amet. |
| 2 | Praesent ultricies libero. |
| 3 | Donec eget blandit nunc. |
+----+-----------------------------+
comment_user
+----+--------------+-----------+
| id | comment_id | user_id |
+----+--------------+-----------+
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 3 |
+----+--------------+-----------+
注意:评论作者的引用存储在comment_user
.
您使用的术语 "pivot table" 不正确。中间有各种说法table;常用名称包括结点 table 和关联 table。优点和缺点也很奇怪——你在征求意见,这在 Stack Overflow 上是明确不允许的。但是,你的问题相当误导。因此,值得回答。
你的两个选项做不同的事情。第一个实现 1:n 关系。一个给定的用户可以有很多评论。但是一条评论只能属于一个用户。
第二个实现 m:n 关系。一个给定的用户可以有很多评论。给定的评论也可以有很多用户。
显然,1:n 关系可以作为 m:n 关系的特例来实现。然而,这是矫枉过正且效率低下。
用户和评论之间的关系通常是 1:n,因此第一个结构似乎更自然。
没有什么正式的,没有。
优点:
- 关联 tables 可以处理一对一、一对多和多对多关系,具体取决于您定义的键。
- 您可以在没有用户的情况下发表评论(不使用 NULL)。
- 可以将关联 table 添加到现有数据库,而无需修改现有 table。
缺点:
- 额外的 table 会使您的架构有点混乱。
- 查询时的额外连接有点复杂,可能会影响性能。
- 确保每个评论都有一个用户(如果这是一个要求)更复杂。
顺便说一句,comment_user table 中的 id 列似乎毫无意义。