[英]How to create default relationship for 2 MySQL tables with many-to-many relationships?
在MySQL中,我有2个表A
和B
,具有多对多关系。 我有一个数据透视表A_B
,用于表A和B之间的关系。
在表A中,有些行我想链接到table B
*ALL*
(包括当前和将来)行。 例如,假设table B
当前有5行。 table A
A2行链接到table B
所有5行。 将来,当将新行添加到table B
,我希望将行A2自动链接到table B
所有这些新行。
目前,我正在考虑使用MySQL触发器添加此功能。 但是我不确定这是否是正确的方法。
或者我应该在table A
添加一个新列,并将其用作默认关系的指示符? 然后,在我的编程代码中,我可以检查列值, table A
中的行是否与table B
所有行都有关系。
数据透视表
用关系数据库术语来说,这是一个关联表。
您所需要的是,使Table_A中的指定行与Table_B中的所有行相关; 其余的通过Table_A_B关联。 伟大的EF Codd博士要求我们从集合的角度来考虑数据。 Table_A中有两组。 我们将第一组称为All_B,将第二组称为Specific_B,其中Table_A_B标识了特定的关系。
因此,这不是“默认”关系,而是基于子类型的两个单独的关系。
您不需要您描述的“默认”关系。 这将导致大量行不起作用,因为Table_B中的All_B行是已知的,因此不需要存储它们。
您不需要触发器(每当插入All_B行时都需要继续插入Table_A_B行)。 丑陋如罪。
正确的方法是使用为集合命名的互斥子类型,其中:
Specific_B通过Table_A_B与Table_B相关
Table_A本身和All_B没有任何关系。
您的代码可以确定任何Table_A行是哪个子类型,并相应地加入Table_B:
通过Table_A_B用于Specific_B
所有All_B的笛卡尔乘积Table_A :: Table_B。
Exclusive子类型需要在Basetype中的Discriminator列。
如果您不想打扰完整的关系完整性,那么可以肯定,Table_A中的“指标”列就足够了。 那就是Table_A中的Discriminator列,减去Subtypes。
这是我第一次了解互斥子类型的概念。 现在我知道如何解决问题了
在这种情况下,请阅读有关子类型的文档。 链接包括您将需要的代码,以使完整性为声明性。 如果您想进行全面讨论,尤其是希望自己免受被声称是理论家,兜售疯狂方法以实施“正直”的马戏团怪人的诱惑,请阅读此答案。
我认为使用database triggers
是执行所需操作的最合适方法,因为它可以保护数据库与程序的independence
,并且数据库本身是完整的。
但是也许您考虑使用Grouping concept
因为它在用户帐户管理数据库中使用。 您可以创建一个组,例如admins,并将表B的所有记录与其相关联,并且仅将A的记录分配给该组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.