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

How to create default relationship for 2 MySQL tables with many-to-many relationships?

在MySQL中,我有2个table,AB,具有多对多关系。对于 table A 和 B 之间的关系,我有一个枢轴 table、A_B

在table A中,有一些行我想在table B中link到*ALL*(包括当前和未来)行。例如,假设当前 table B 中有 5 行。 table A 中的 A2 行被 link 编辑到 table B 中的所有 5 行。将来,当新行添加到 table B 时,我希望 A2 行自动 linked 到 ALL table B 中的那些新行.

目前正在考虑使用MySQL触发器来增加这个功能。但是我不确定这是否是正确的方法。

或者我应该在table A中添加一个新列,并将其用作默认关系的指标?然后在我的编程代码中,我可以检查列值 table A 中的一行是否与 table B.

中的所有行有关系

我认为使用 database triggers 是最合适的方法来做你想做的事情,因为它从程序中保存了 independence 的数据库,而数据库本身就是完整的。

但您可能会考虑使用 Grouping concept,因为它用于用户帐户管理数据库。您可以创建一个组,例如 admins,并将 table B 的所有记录关联到该组,并且只将 A 的记录分配给该组。

Pivot table

在关系数据库术语中,这是一个关联 Table。

你有的是需求,这样 Table_A 中的指定行与 Table_B 中的所有行相关;其余的通过 Table_A_B 重新关联。伟大的 EF Codd 博士要求我们从集合的角度来思考数据。 Table_A中有两组。我们称第一组为All_B,第二组为Specific_B,其中Table_A_B标识了具体的关系。

因此不是 "default" 关系,它是两个独立的关系,基于子类型。

您不需要您描述的 "default" 关系。这将导致大量无用的行,因为 Table_B 中 All_B 的行是已知的,不需要存储它们。

您不需要触发器(无论何时插入 All_B 行,触发器都是继续插入 Table_A_B 行所必需的)。丑得像罪过。

正确的方法是使用以集合命名的独占子类型,其中:

  • Specific_B 与 Table_B 有关,来自 Table_A_B

  • Table_A 本身和 All_B 没有任何关系。

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

  • 通过 Table_A_B 获得 Specific_B

  • All_B 的笛卡尔积 Table_A::Table_B。

图片

Typical XOR Gate • Table Relation Diagram

独占子类型需要基类型中的鉴别器列。

如果您不想打扰完整的关系完整性,那么当然,Table_A 中的一个指标列就足够了。那是 Table_A 中的鉴别器列减去子类型。

回复评论

This is the first time I learn about the concept of exclusive subtype. Now I know how to solve the problem

在这种情况下,请在 Subtypes. The links include code that you will need, such that the integrity is Declarative. If you would like a full discussion, and particularly to inoculate yourself from being seduced by the circus freaks who allege to be theoreticians, who peddle insane methods to enforce "integrity", read this Answer

上学习此文档