在MySQL中,我有两个表,A和B,具有多到多个关系。我有一个支点表,A_B,用于表A和表B之间的关系。
在表A中,有一些行我希望链接到*ALL* (包括当前和未来) table B中的行。例如,假设当前table B中有5行。table A中的行table A链接到table B中的所有5行。将来,当新行被添加到table B时,我希望行A2自动链接到table B中的所有新行。
目前,我正在考虑使用MySQL触发器来添加这个函数。但我不知道这是否正确的做法。
或者我应该在table A中添加一个新列,并使用它作为默认关系的指示符?然后,在我的编程代码中,我可以检查列值,table A中的一行是否与table B中的所有行相关。
发布于 2015-05-19 16:28:05
枢轴台
在关系数据库术语中,这是一个关联表。
您所拥有的是一种需求,即Table_A中指定的行与Table_B中的所有行相关;其余的通过Table_A_B关联。伟大的E F Codd博士要求我们从集合的角度来考虑数据。在Table_A中有两个集合,让我们调用第一个集合All_B和第二个集合Specific_B,Table_A_B为它们标识特定的关系。
因此,它不是一个“默认”关系,而是两个独立的关系,基于子类型。
你不需要你描述的“默认”关系。这将导致大量没有用途的行,因为Table_B for All_B中的行是已知的,因此不需要存储它们。
您不需要触发器(只要插入了Table_A_B行,就必须继续插入All_B行)。丑陋得像罪恶。
正确的方法是使用以集合命名的排它子类型,其中:
您的代码可以确定任何Table_A行的哪个子类型,并相应地加入Table_B:
图片
Typical XOR Gate • Table Relation Diagram
排他子类型需要基本类型中的判别器列。
如果您不想费心于完整的关系完整性,那么当然,Table_A中的指示列就足够了。这是Table_A中的判别器列,减去子类型。
对评论的答复
这是我第一次学习排他性子类型的概念。现在我知道如何解决这个问题了
在这种情况下,请在Subtypes上学习此文档。链接包括您需要的代码,因此完整性是声明性的。如果你想要进行充分的讨论,特别是避免被那些声称是理论家的马戏团怪胎所诱惑,他们兜售疯狂的方法来实施“正直”,请阅读this Answer。
发布于 2015-05-17 09:30:21
我认为使用database triggers是做您想做的事情最合适的方式,因为它从程序中保存了DB的independence,并且DB本身就完成了。
但是,您可能会考虑使用Grouping concept,因为它在用户帐户管理DB中使用。您可以创建一个组(如admins ),并将表B的所有记录关联到它,并且只将A的记录分配给这个组。
https://stackoverflow.com/questions/30284761
复制相似问题