繁体   English   中英

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

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

在MySQL中,我有2个表AB ,具有多对多关系。 我有一个数据透视表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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM