【问题标题】:Should I create one big pivot or multiple small pivots in a great many to many connection?我应该在多对多连接中创建一个大枢轴还是多个小枢轴?
【发布时间】:2014-01-08 11:33:27
【问题描述】:

我有以下表格:UsersRegionsTeams。每张桌子都相互之间存在多对多的连接,我需要来自各个方向的每一个连接。换句话说:

  • Users 可以是多个RegionsTeams
  • Regions 可以有多个UsersTeams
  • Teams 可以在多个Regions 中,并有多个Users

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

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

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

我应该使用哪一个?实际上是否有完美的解决方案,或者是否有优缺点? 如果我必须以相同的方式连接 4 个或更多表,答案是否会有所不同,其中任何 n - 数据透视表都有 6 - 或 (n(n-1))/2?

【问题讨论】:

  • 用户是否属于独立于团队的区域?或者用户是否属于特定区域,因为该人的团队位于该特定区域?
  • @AgRizzo 不,地区和团队是两个不同的东西。用户可以是某个区域的一部分,也可以是位于完全不同区域的团队的一部分。例如,用户住在匈牙利,但在美国团队远程工作。
  • 采用第一个解决方案——第二个是用户、匈牙利和美国队之间的关系。然后,您需要为该用户的团队和地区的每个变体创建另一个条目。
  • @AgRizzo 是的,但是如果我需要添加第四个表,就会有很多数据透视表。
  • 很多表不一定是坏事,当您存储规范化数据时会出现这种情况。顺便说一句,您描述的表格是junction tables,而不是pivot tables。您应该根据需要拥有尽可能多的联结表,听起来您有三个独立的关系,团队 >> 用户、用户 >> 区域、区域 >> 团队。这三个都是独立的,所以每个关系都应该有自己的联结表,所以使用你的第一种方法。

标签: mysql sql database-design database-relations


【解决方案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> 

【讨论】:

    猜你喜欢
    • 2018-11-27
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 2016-11-07
    相关资源
    最近更新 更多