我有一个包含一列source_id
的表,其值应该是另一个表的主键,不过哪个表会因记录而异。每条记录必须具有source_table
的值,用于指定源记录的表,以及source_id
的值,用于指定源表中的行。
有没有办法实现这一点,以利用DB的外键约束和验证?或者我是否必须将验证逻辑移到应用程序层?或者,还有另一种设计可以让我避免这个问题吗?
答案 0 :(得分:4)
外键约束只能引用一个目标表。 SQL中不提供基于某些其他字段引用不同目标表的“条件”外键。正如下面评论中提到的@OMG Ponies,您可以在同一列上有多个外键,引用多个表,但这意味着该列的值必须存在于所有引用的表中。我想这不是你想要的。
对于一些可能的解决方案,我建议您查看@Bill Karwin's这个问题的答案:
我喜欢一般的“超级”方法。您可能还想查看此帖子以获取另一个示例:
答案 1 :(得分:1)
我认为以前的答案确实很好地回答了问题的第一部分。但是,Daniel推荐的链接仅为引用的“源”表的数量相当小的情况提供了解决方案。如果您决定增加“源”表的数量,解决方案将无法轻松扩展。
为了推荐一个更好的策略,最好有一些关于任务是什么的详细信息,以及“源”表是否有任何共同点可以将它们组合起来。
在目前的结构中(据我可以从问题推断),我会改变这种关系: