在MySQL中,我有2个表,A
和B
,具有多对多关系。我有一个数据透视表A_B
,用于表A和B之间的关系。
在表A中,有些行要链接到*ALL*
中的table B
(包括当前和未来)行。例如,假设目前table B
中有5行。 table A
中的第A2行链接到table B
中的所有5行。将来,当新行添加到table B
时,我希望行A2自动链接到 ALL table B
中的新行。
目前我正在考虑使用MySQL Trigger添加此功能。但我不确定这是否是正确的方法。
或者我应该在table A
中添加一个新列,并将其用作默认关系的指标?然后在我的编程代码中,我可以检查列值table A
中的行是否与table B
中的所有行有关。
答案 0 :(得分:3)
数据透视表
在关系数据库术语中,这是一个关联表。
您需要的是,Table_A中的指定行与Table_B中的所有行相关;其余的通过Table_A_B重新相关。伟大的E F Codd博士要求我们根据集合来考虑数据。 Table_A中有两组。让我们调用第一组All_B和第二组Specific_B,Table_A_B为其识别特定关系。
因此,它不是“默认”关系,它是基于子类型的两个独立关系。
您不需要您描述的“默认”关系。这将导致大量行没有用处,因为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 for Specific_B
笛卡尔积表_A ::表_B为All_B。
Typical XOR Gate • Table Relation Diagram
独占子类型需要Basetype中的Discriminator列。
如果您不想完全关系完整性,那么Table_A中的Indicator列就足够了。这是Table_A中的Discriminator列,减去Subtypes。
这是我第一次了解独占子类型的概念。现在我知道如何解决问题
在这种情况下,请在Subtypes上学习本文档。这些链接包含您需要的代码,以便完整性为Declarative。如果你想进行充分的讨论,特别是要让自己不被那些自称是理论家的马戏团人士所诱惑,他们兜售疯狂的方法来强制执行“诚信”,请阅读this Answer
答案 1 :(得分:1)
我认为使用database triggers
是最合适的方式来做你想要的事情,因为它从程序中保存了数据库的independence
,而数据库本身就是完整的。
但也许您考虑使用Grouping concept
,因为它在用户帐户管理数据库中使用。您可以创建一个组,例如管理员,并将表B的所有记录与其关联,并仅将A的记录分配给该组。