指向多个表之一的外键约束

时间:2010-08-22 03:38:44

标签: sql sqlite foreign-keys polymorphic-associations

我有一个包含一列source_id的表,其值应该是另一个表的主键,不过​​哪个表会因记录而异。每条记录必须具有source_table的值,用于指定源记录的表,以及source_id的值,用于指定源表中的行。

有没有办法实现这一点,以利用DB的外键约束和验证?或者我是否必须将验证逻辑移到应用程序层?或者,还有另一种设计可以让我避免这个问题吗?

2 个答案:

答案 0 :(得分:4)

外键约束只能引用一个目标表。 SQL中不提供基于某些其他字段引用不同目标表的“条件”外键。正如下面评论中提到的@OMG Ponies,您可以在同一列上有多个外键,引用多个表,但这意味着该列的值必须存在于所有引用的表中。我想这不是你想要的。

对于一些可能的解决方案,我建议您查看@Bill Karwin's这个问题的答案:

我喜欢一般的“超级”方法。您可能还想查看此帖子以获取另一个示例:

答案 1 :(得分:1)

我认为以前的答案确实很好地回答了问题的第一部分。但是,Daniel推荐的链接仅为引用的“源”表的数量相当小的情况提供了解决方案。如果您决定增加“源”表的数量,解决方案将无法轻松扩展。

为了推荐一个更好的策略,最好有一些关于任务是什么的详细信息,以及“源”表是否有任何共同点可以将它们组合起来。

在目前的结构中(据我可以从问题推断),我会改变这种关系:

  1. 我会创建一个表(我们称之为AllSources),它将作为包含source_id和source_table列的所有可用源的存储库。两者都包含在主键中。
  2. 我会从引用AllSources表的每个“source”表创建外键,以便它们只能在其中注册源。
  3. 然后,我将使用引用AllSources表的外键(而不是单独的“源”表)创建您在问题中提到的表。
  4. 缺点:您必须同时管理AllSources和“source”表,确保如果您在AllSources中创建记录,您还可以在适当的“源”表中创建相应的记录,实际上并不那么难。