我有以下表格:Users
,Regions
和Teams
。每个表都是彼此多对多的连接,我需要从各个方向的每个连接。换句话说:
Users
可以有多个Regions
和Teams
。Regions
可以有多个Users
和Teams
。Teams
可以有多个Regions
并且有多个Users
。我应该如何在它们之间实现数据透视表?
我应该使用哪一个?实际上有一个完美的解决方案还是有优点和对比? 如果我必须以相同的方式连接4个或更多的表,那么答案会有所不同吗?对于任何n - 数据透视表,它会有6 - 或(n(n-1))/ 2?
答案 0 :(得分:1)
在某些情况下,取决于业务逻辑中的许多因素,由实体的确切角色定义的用例等,您可能会发现第二个选项很有用,但我肯定会选择第一个选项。在专业数据库设计中,使用连接表(不是数据透视表)对每个多对多关系进行规范化。所以你可能需要例如每个多对多关系都有User
,Region
和User_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>