【问题标题】:Are the FK always related to the field "id" of the parent table? Is a bad practice point to another field?FK 是否总是与父表的字段“id”相关?不好的做法是否指向另一个领域?
【发布时间】:2010-12-07 14:14:36
【问题描述】:

假设我有一个表 Nation(名称,iso_code_3,语言,..)和一个表 Culture(语言),其中包含字段(名称,...)。现在我必须在国家表中创建一个指向表文化的外键(字段语言)(你知道,每个国家都说一种语言)。

所以现在我想知道国家表中的外键,应该引用字段“id”还是我可以直接引用字段“名称”(在这两种情况下,表文化)? ?

我的意见:例如,如果我想检索包含所说语言的 Nation 行,最好引用字段“name”。这样我就可以避免使用 INNER JOIN 子句。

问候

贾维

【问题讨论】:

  • 顺便说一句,命名字段 ID 是一种不好的做法。它可能导致查询错误并且是报告的痛苦。请改用 tableNameID。

标签: database-design foreign-keys


【解决方案1】:

外键通常应该引用另一个表的主键。是的 - 直接绑定到实际数据字段可能看起来很诱人 - 但如果这不是唯一的,不清楚你指的是哪一行??

外键必须始终引用被引用表中至少为 UNIQUE 的列 - 主键始终是 UNIQUE,因此当然是主键。

不要试图走捷径 - SQL 数据库非常擅长解决 JOIN - 不要为了“快速”获胜而牺牲数据完整性.....

【讨论】:

    【解决方案2】:

    您可以将其指向任何唯一的字段。如果将其指向具有字符串类型数据的字段,则连接将比将其指向整数代理键(特别是如果字符串数据很长)要慢。

    【讨论】:

    • 视情况而定。字符串连接不一定比整数连接慢。无论如何,OP 已经说过,通过引用他希望完全避免进行连接的名称。
    【解决方案3】:

    从您的描述中不清楚“文化”和“语言”是否是同一个概念。例如,可以说西班牙和秘鲁具有不同的文化,但两者都有西班牙语。西班牙也有加泰罗尼亚语和巴斯克语。秘鲁也有盖丘亚语。

    一旦您清除了这一点,您可能会发现您正在执行多对多连接,而不是在任一表中使用 PK。如果这是正确的,那么它与名称与识别号码的关系远不止于此。

    作为另一个领域的示例,邮件系统经常对邮政编码进行连接,即使数据库中没有邮政编码主表。这真的是一个多对多的连接。有时这是正确的做法,但很少。最常见的是,正确的做法是为识别的实体(在您的情况下为“语言”)建立一个主表,然后执行两个普通的旧 FK-PK 连接。不用担心三向连接。只有几百行,延迟不值得考虑。

    【讨论】:

      【解决方案4】:

      外键可以引用它所引用的表中的任何候选键。为简单起见,通常为每个表选择一个键(通常指定为“主”键)以一致地用于对该表的所有外键引用 - 但如果你有一个没有绝对理由必须这样做这样做的合理理由。选择要使用的密钥的良好标准是:Familiarity, Simplicity and Stability

      “Id”对于任何列来说都是一个糟糕的名称 - 键与否。

      【讨论】:

        【解决方案5】:

        可以在强制唯一性的其他表的任何列上创建外键。主键或唯一索引。
        在您的情况下,如果您使语言独一无二,那么将其指向语言是一个好主意。

        【讨论】:

          【解决方案6】:

          在您的示例中,您有 多对多关系,因为 1 个国家/地区可能会说多种语言,因此可能会在多个国家/地区使用 1 种语言。
          因此,您实际上应该由一个关系表来表示,它表示您的 m-to-m 关系。
          该表必须包含其他两个表的 PK。
          根据定义,这 2 个 FK 的组合就是 CountryLanguage 表的 PK。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-12-04
            • 2017-04-27
            • 1970-01-01
            • 2015-10-02
            相关资源
            最近更新 更多