【问题标题】:Foreign key constraint that points to one of several tables指向多个表之一的外键约束
【发布时间】:2011-04-02 04:28:25
【问题描述】:

我有一张表,其中有一列 source_id 的值应该是另一个表的主键,尽管 哪个 表会因记录而异。每条记录都必须有一个 source_table 的值来指定源记录的表,以及一个 source_id 的值来指定源表中的行。

有什么方法可以利用数据库的外键约束和验证来实现这一点?或者我是否必须将我的验证逻辑移动到应用程序层?或者,是否有其他设计可以让我避免这个问题?

【问题讨论】:

    标签: sql sqlite foreign-keys polymorphic-associations


    【解决方案1】:

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

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

    总的来说,我喜欢“超级表”方法。您可能还想查看这篇文章以获取另一个示例:

    【讨论】:

    • 您可以在一个列上定义多个外键,但这意味着插入该列的值必须存在于所有外表中
    • @OMG:是的,是的。让我改写我的答案更准确:)
    • 链接的问题正是我正在寻找的那种答案。不幸的是,这可能意味着我将重做我的架构。
    • @JSBangs:也看看这个:stackoverflow.com/questions/3383300/… :)
    【解决方案2】:

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

    要推荐一个更好的策略,最好能详细说明一下任务是什么,以及“源”表是否有任何共同点可以合并它们。

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

    1. 我将创建一个表(我们称其为 AllSources),该表将用作包含 source_id 和 source_table 列的所有可用源的存储库。两者都包含在主键中。
    2. 我将从引用 AllSources 表的每个“源”表创建外键,这样它们就可以只拥有已在其中注册的源。
    3. 然后,我将使用引用 AllSources 表(而不是单独的“源”表)的外键创建您在问题中提到的表。

    缺点:您必须同时管理 AllSources 和“源”表,以确保如果您在 AllSources 中创建记录,您还会在适当的“源”表中创建相应的记录,这实际上并不难。

    【讨论】:

    猜你喜欢
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    相关资源
    最近更新 更多