如何为具有多对多关系的 2 MySQL 个表创建默认关系?
How to create default relationship for 2 MySQL tables with many-to-many relationships?
在MySQL中,我有2个table,A
和B
,具有多对多关系。对于 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
上学习此文档
在MySQL中,我有2个table,A
和B
,具有多对多关系。对于 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
上学习此文档