我试图弄清楚是否可以用这种方式创建外键。
首先,在这种情况下有两个父表。
表1有一个PK int和另一个int列。当两者结合时,它们是独一无二的。
表2有一个PK int和另一个int列。当两者结合时,它们是独一无二的。
两个整数之间的配对值是我们当前如何为这两个表选择子记录。
表3中包含前两个表之一的PK和其他int列的值。它可靠地选择,因为在搜索中使用的两个字段对于上述表之一是唯一的。
所以我想为这个场景创建一个FK或两个FK。我希望能够从第一个表中的任何一个到第三个表中进行级联删除,并且还希望将它用于实体框架中的实体关系。
如果这没有意义,请告诉我。我已经多次阅读过,而且我能够清楚地看到它。
由于
答案 0 :(得分:1)
如果我理解正确,你有3个表格结构如下:
TABLE_A:
PK_FIELD int NOT NULL
OTHER_FIELD int NOT NULL, NOT IN TABLE_B.OTHER_FIELD
TABLE_B:
PK_FIELD int NOT NULL
OTHER_FIELD int NOT NULL, NOT IN TABLE_A.OTHER_FIELD
TABLE_C:
PK_FIELD int NOT NULL
OTHER_FIELD int NOT NULL IN (TABLE_A.OTHER_FIELD OR TABLE_B.OTHER_FIELD
您要做的是定义TABLE_C,以便您可以在表之间级联更新和删除。由于TABLE_A.OTHER_FIELD
和TABLE_B.OTHER_FIELD
的定义方式,您可以保证它们之间没有重叠。问题在于弄清楚哪个表具有对TABLE_C
的引用。
您可以使用此定义执行从TABLE_A
或TABLE_B
到TABLE_C
的级联,因为该方向的关系非常明确。但是,从TABLE_C
级联起来更复杂,因为您不知道要级联到哪个表。在TABLE_C
中定义两个字段以引用其他每个表,然后您可以定义所有三个表之间的关系,知道对于任何给定的记录,只涉及一个或两个表,从不全部三个。或者,您可以使用代码来确定将此特定行与哪个表相关联并相应地级联。
答案 1 :(得分:0)
我不知道您使用的是哪个dbms,但我不知道有哪些接受多父母。你可以做的是在table3上定义一个索引(只是为了更快)并在你的应用程序中实现级联删除。
答案 2 :(得分:0)
如果Table3包含Table1 UNION Table2中的所有值,那么您有一个inheritance scheme:
Table3 { (int id, int type) PK }
Table1 { (int id, int type [CHECK type = 1]) FK Table3 }
Table2 { (int id, int type [CHECK type = 2]) FK Table3 }
这样,从Table3中删除将适当地级联到Table1或Table2。
否则,如果Table3只是Table1 UNION Table2的一个子集 - 那么将Table4作为完整集引入将起作用。
Table4 { (int id, int type [CHECK type IN (1,2)]) PK }
Table1 { (int id, int type [CHECK type = 1]) FK Table4 }
Table2 { (int id, int type [CHECK type = 2]) FK Table4 }
Table3 { (int id, int type) FK Table4 }
要处理级联删除,您需要从Table4中删除(尽管您可以在Table3上执行触发来为您处理)。
编辑(因为我认为应该看到这一点,与评论分开):
是的,问题在于父母一两个。它们都有3个相关记录,它们是FK,而不是该表的PK。使用FK约束似乎几乎不可能。谢谢你的回复! - Chrisb(一小时前)
IMO - 您的数据模型已破损。表1和表2是不相关的,但是您尝试将它们填充到表3中的相同列中。如果Table1和Table2以某种方式相关,那么您需要对其进行建模。
如果它们相关,则引入父表(Table4),或者表3中的第2列(Table1 FK,Table2 FK)或2个连接表(如果它们不相关)。不要试图将圆形钉子放入方孔中 - 并且不要试图用扳机来弥补它。 ;)