我有一个表,其中一列source_id
的值应该是另一个表的主键,尽管它是哪个表会因记录而异。每条记录都必须有一个用于source_table
指定源记录表的值,以及一个用于source_id
指定源表中行的值。
有没有办法利用数据库的外键约束和验证来实现这一点?或者我是否必须将我的验证逻辑移动到应用程序层?或者,是否有另一种设计可以让我避免这个问题?
我有一个表,其中一列source_id
的值应该是另一个表的主键,尽管它是哪个表会因记录而异。每条记录都必须有一个用于source_table
指定源记录表的值,以及一个用于source_id
指定源表中行的值。
有没有办法利用数据库的外键约束和验证来实现这一点?或者我是否必须将我的验证逻辑移动到应用程序层?或者,是否有另一种设计可以让我避免这个问题?
外键约束只能引用一张目标表。基于其他字段引用不同目标表的“条件”外键在 SQL 中不可用。正如@OMG Ponies在下面的评论中指出的那样,您可以在同一列上有多个外键,引用多个表,但这意味着该列的值必须存在于所有引用的表中。我想这不是你所追求的。
对于一些可能的解决方案,我建议查看@Bill Karwin对这个问题的回答:
总的来说,我喜欢“超级表”的方法。您可能还想查看这篇文章以获取另一个示例:
我认为以前的答案确实很好地回答了问题的第一部分。但是,丹尼尔推荐的链接仅在引用的“源”表数量相当少的情况下提供了解决方案。如果您决定增加“源”表的数量,该解决方案将无法轻松扩展。
要推荐一个更好的策略,最好有更多关于任务是什么的详细信息,以及“源”表是否有任何共同点可以将它们组合起来。
在当前结构中(据我可以从问题中推断出),我会颠倒这种关系:
缺点:您必须同时管理 AllSources 和“源”表,以确保如果您在 AllSources 中创建记录,您还会在适当的“源”表中创建相应的记录,这实际上并不难。