在MySQL中,我有两个具有多对多关系的表A
和B
,还有一个透视表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
中的所有行都有关系。
2条答案
按热度按时间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行)。
正确的方法是使用为集合命名的独占子类型,其中:
您的代码可以确定任何Table_A行是哪个子类型,并相应地联接Table_B:
图片
Typical XOR Gate • Table Relation Diagram
独占子类型需要在基类型中有一个鉴别器列。
如果你不想为完整的关系完整性而烦恼,那么Table_A中的Indicator列就足够了,也就是Table_A中的Discriminator列减去Subtypes。
回应评论
在这种情况下,请在Subtypes上学习本文档。链接中包含了您需要的代码,例如声明式完整性。如果您希望进行完整的讨论,特别是为了避免强制“完整性”的丑陋方法,请阅读this answer。
e4yzc0pl2#
我认为使用
database triggers
是最合适的方法,因为它从程序中节省了数据库的independence
,而且数据库本身是完整的。但是,也许您可以考虑使用
Grouping concept
,因为它在用户帐户管理DB中使用。您可以创建一个组(如admins),并将表B的所有记录与之关联,只将表A的记录分配给该组。