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

时间:2015-05-17 08:12:42

标签: mysql sql database many-to-many relational-database

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

2 个答案:

答案 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的记录分配给该组。