我应该在多对多连接中创建一个大枢轴或多个小枢轴吗?

时间:2013-12-19 18:54:10

标签: mysql sql database-design database-relations

我有以下表格:UsersRegionsTeams。每个表都是彼此多对多的连接,我需要从各个方向的每个连接。换句话说:

  • Users可以有多个RegionsTeams
  • Regions可以有多个UsersTeams
  • Teams可以有多个Regions并且有多个Users

我应该如何在它们之间实现数据透视表?

在每个表之间创建多个小透视表

Multiple small pivot tables between each tables

在所有表格之间创建一个大的数据透视表

One big pivot table between all table

我应该使用哪一个?实际上有一个完美的解决方案还是有优点和对比? 如果我必须以相同的方式连接4个或更多的表,那么答案会有所不同吗?对于任何n - 数据透视表,它会有6 - 或(n(n-1))/ 2?

1 个答案:

答案 0 :(得分:1)

在某些情况下,取决于业务逻辑中的许多因素,由实体的确切角色定义的用例等,您可能会发现第二个选项很有用,但我肯定会选择第一个选项。在专业数据库设计中,使用连接表(不是数据透视表)对每个多对多关系进行规范化。所以你可能需要例如每个多对多关系都有UserRegionUser_Region等等。

我个人觉得1)拥有一个由每个连接表中的两列组成的复合主键,以及2)让父表的主键成为引用连接表的外键非常有效。

上述MySQL命令行中一个关系的简单示例:

mysql> 
mysql> create table a (id int not null);
Query OK, 0 rows affected (0.01 sec)

mysql>  
mysql> alter table a add primary key (id);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> 
mysql> create table b (id int not null);
Query OK, 0 rows affected (0.01 sec)

mysql> 
mysql> alter table b add primary key (id);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> 
mysql> create table a_b (a_id int not null, b_id int not null);
Query OK, 0 rows affected (0.01 sec)

mysql> 
mysql> alter table a_b add primary key (a_id, b_id);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> 
mysql> alter table a_b add foreign key a_id_fk (a_id) references a (id);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> 
mysql> alter table a_b add foreign key b_id_fk (b_id) references b (id);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql>