【问题标题】:How to create default relationship for 2 MySQL tables with many-to-many relationships?如何为具有多对多关系的 2 个 MySQL 表创建默认关系?
【发布时间】:2015-05-17 08:12:41
【问题描述】:

在 MySQL 中,我有 2 个表,AB,具有多对多关系。我有一个数据透视表,A_B,用于表 A 和 B 之间的关系。

在表 A 中,有一些行我想链接到 table B 中的 *ALL*(包括当前和未来)行。例如,假设当前table B 中有 5 行。 table A 中的 A2 行链接到 table B 中的所有 5 行。将来,当将新行添加到 table B 时,我希望行 A2 自动链接到 ALL table B 中的那些新行。

目前我正在考虑使用 MySQL Trigger 来添加这个功能。但我不确定这是否是正确的方法。

或者我应该在table A 中添加一个新列,并将其用作默认关系的指示符?然后在我的编程代码中,我可以检查列值是否table A 中的行与table B 中的所有行有关系。

【问题讨论】:

  • 如果有不明白的地方,或者如果您需要更多细节等,请评论,评论。否则,请选择,投票等。
  • 谢谢。你想要一个数据模型吗?
  • @PerformanceDBA 感谢您的帮助。这是我第一次了解独占子类型的概念。现在我知道如何解决这个问题了。
  • 这是我的荣幸。我已经更新了答案,提供了几个链接和一张漂亮的图片。

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


【解决方案1】:

数据透视表

在关系数据库术语中,这是一个关联表。

你的需求是表_A中的指定行与表_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_A_B 与 Table_B 相关

  • Table_A 本身和 All_B 都与任何事物无关。

您的代码可以确定任何 Table_A 行是哪个子类型,并相应地加入 Table_B:

  • 通过 Table_A_B 获取 Specific_B

  • 笛卡尔积 Table_A::Table_B for All_B。

图片

Typical XOR Gate • Table Relation Diagram

Exclusive Subtype 需要 Basetype 中的 Discriminator 列。

如果您不想打扰完整的关系完整性,那么可以肯定的是,Table_A 中的指示符列就足够了。即 Table_A 中的 Discriminator 列,减去 Subtypes。

回复评论

这是我第一次了解独占子类型的概念。现在我知道如何解决问题了

在这种情况下,请在Subtypes 上研究此文档。这些链接包含您需要的代码,因此完整性是声明性的。如果您想进行完整的讨论,特别是要防止自己被自称是理论家的马戏团怪胎引诱,他们兜售疯狂的方法来强制执行“诚信”,请阅读this Answer

【讨论】:

    【解决方案2】:

    我认为使用database triggers 是做你想做的最合适的方式,因为它可以从程序中节省independence 的DB 并且DB 本身是完整的。

    但也许您考虑使用Grouping concept,因为它用于用户帐户管理数据库。您可以创建一个组,例如 admins,并将表 B 的所有记录与其关联,并且仅将 A 的记录分配给该组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      相关资源
      最近更新 更多