如何为两个具有多对多关系的MySQL表创建默认关系?

63lcw9qa  于 2023-01-12  发布在  Mysql
关注(0)|答案(2)|浏览(99)

在MySQL中,我有两个具有多对多关系的表AB,还有一个透视表A_B,用于表A和B之间的关系。
在表A中,有一些行需要链接到*ALL*(包括当前和将来)行。例如,假设table B中当前有5行。table A中的行A2链接到table B中的所有5行。将来,当向table B添加新行时,我希望行A2自动链接到table B中的 * 所有 * 新行。
目前我正在考虑使用MySQL触发器来添加这个功能。但是我不确定这是否是正确的方法。
或者我应该在table A中添加一个新列,并将其用作默认关系的指示器,然后在我的编程代码中,我可以检查列值,以确定table A中的某行是否与table B中的所有行都有关系。

bfnvny8b

bfnvny8b1#

  • 数据透视表 *

在关系数据库术语中,这是一个关联表。
您所拥有的是一个需求,使得Table_A中的指定行与Table_B中的所有行相关联;其余的通过Table_A_B联系起来。伟大的Dr E F Codd要求我们从集合的Angular 来考虑数据。Table_A中有两个集合。让我们称第一个集合为All_B,第二个集合为Specific_B,Table_A_B确定了它们的特定关系。
因此,不是“默认”关系,而是基于子类型的两个单独关系。
您不需要所描述的“默认”关系,这将导致大量无用的行,因为Table_B for All_B中的行是已知的,不需要存储它们。
您不需要触发器(每当插入All_B行时,都需要触发器来保持插入Table_A_B行)。
正确的方法是使用为集合命名的独占子类型,其中:

  • Specific_B通过表_A_B与表_B相关
  • Table_A本身和All_B不相关。

您的代码可以确定任何Table_A行是哪个子类型,并相应地联接Table_B:

  • 通过特定_B的表_A_B
  • 笛卡尔乘积表_A::表_B用于所有_B。

图片

Typical XOR Gate • Table Relation Diagram
独占子类型需要在基类型中有一个鉴别器列。
如果你不想为完整的关系完整性而烦恼,那么Table_A中的Indicator列就足够了,也就是Table_A中的Discriminator列减去Subtypes。

回应评论

  • 这是我第一次了解互斥子类型的概念,现在我知道如何解决这个问题了 *

在这种情况下,请在Subtypes上学习本文档。链接中包含了您需要的代码,例如声明式完整性。如果您希望进行完整的讨论,特别是为了避免强制“完整性”的丑陋方法,请阅读this answer

e4yzc0pl

e4yzc0pl2#

我认为使用database triggers是最合适的方法,因为它从程序中节省了数据库的independence,而且数据库本身是完整的。
但是,也许您可以考虑使用Grouping concept,因为它在用户帐户管理DB中使用。您可以创建一个组(如admins),并将表B的所有记录与之关联,只将表A的记录分配给该组。

相关问题