在我的数据库中,我有一些看起来像这样的表:
table1
---------------
id name
table2
---------
id name ParnetId <-This is an ID from Table 1
table3
---------------
id name ParnetId <-This is an ID from Table 2
在过去,似乎这三个表是完全独立的实体,但现在(由于新请求的功能......)我需要从另一个表中引用三个表中的任何一个。
类似的东西:
table4
---------------
id name foreignKey <-This ID should be from Table 1 OR Table 2 OR Table 3
所以,我想我可以添加一个表来保存表1-3的Id并从表4中引用它(+表从Id列中引用)。
请注意,我正在处理已包含数据的实时数据库。
我的问题是:
答案 0 :(得分:0)
具有自己的主键的新表(例如,CommonTable),可空字段作为table1,table2和table3的外键似乎是要走的路。
这样,table4可以有一个CommonTable外键,可以链接到table1或table2或table3。
第二种方法是在table1,table2和table3上创建一个视图(例如CommonView)。你需要为此编制一个假的主键 - 对于table1 / 2/3,可能是“t1-xxx”,“t2-xxx”,“t3-xxx”。我已将此技术用作临时数据迁移机制,但不会将其视为长期解决方案。
第三种方法,可能是最容易实现的方法,只是在table4上有多个可以为空的外键:
table1Id table2Id table3Id
我强烈建议不要让一个字段成为多个表的外键。我已经看到了这一点,这是一个与之合作的噩梦。想想未来开发人员的困惑。
答案 1 :(得分:0)
我建议总共有7个表table4,table1,table2,table3,t4t1link,t4t2link和t4t3link。
t4tXlink表应包含table4和tableX中的主键。因此,您可以在数据库中拥有适当的约束。
如果您只有一个表包含3个单独的外键,则您不能使用不允许来自其他2列的值的约束。