【问题标题】:Should I really use foreign keys? [closed]我真的应该使用外键吗? [关闭]
【发布时间】:2012-01-06 07:20:34
【问题描述】:

我应该在每个相关表中使用外键还是不应该? 如果我应该使用,为什么?

【问题讨论】:

标签: database


【解决方案1】:

“所有相关的表”并不总是很清楚,所以这不是一个明显的情况。可能有一些表有一个共同的列,但可能永远不会互相看到。

但是,它可以方便地防止错误越过您的主要防御,并允许输入不易追踪的数据。

如果您有适当的索引,它们无助于提高查询效率,而且一个好的应用程序会过滤足够的输入,以至于永远不需要它们。但错误时有发生,它们是廉价的防线。

如果您只是对设计数据库感到满意,那么一旦您建立了基本的父/子关系,就不需要花费大量时间来担心和细化它们。

这里有一些背景——

What's wrong with foreign keys?

【讨论】:

    【解决方案2】:

    你应该。主要有三点:

    • 根据您的数据库系统,您可以获得更好的性能
    • 外键确保数据完整性,例如可以帮助避免孤儿记录等
    • 它们是一种记录数据库结构的显式方式,可供可视化、代码生成等工具使用。

    【讨论】:

      【解决方案3】:

      使用外键是关系数据库的主要概念之一(如果不是唯一的话)。你当然应该在需要的地方使用外键。因为这有助于:

      1. 确保数据验证和完整性
      2. 节省大量额外空间

      第一个意思是不要手动将值添加到将要为其他记录重复的字段,您只需从相关的主键表中选择。如果您尝试在另一个表中输入不存在的主键作为主键,您将被拒绝(但在某些数据库中,您可以调整此行为)。

      第二个意思是不用每次都写“United States of America”,这比写“United States of America”的ID要占用更多的空间。

      【讨论】:

        【解决方案4】:

        目前,实际上越来越远离基于外键的关系数据库。诸如 MongoDB 之类的文档数据库系统正变得越来越流行。这主要是因为世界正变得更加分布在云中。

        这意味着假设即时数据一致性有时是不合理或不可行的。

        如果您有兴趣,请阅读基于 NoSQL 的数据库、MongoDB CouchDB 和最终一致性。

        对于我们受过关系训练的头脑来说,这有点奇怪,但许多大型 Web 解决方案需要牺牲一致性以实现可用性或分区容错。

        【讨论】:

        • 从 Mongo 到 Postgres 也确实让我心烦意乱。我不习惯这整个 id 事情,不得不“预先考虑”我的数据库才能正确处理它......
        【解决方案5】:

        是的,您应该这样做。外键只是帮助您建立关系并确保您的数据库中有正确信息的约束。您应该使用它们来防止任何错误的数据输入。

        【讨论】:

          【解决方案6】:

          是的。但处于中等水平。这在您查询数据时很有帮助。它有助于索引您的数据,因此查询速度更快。它还有助于维护实体之间的关系。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-12-22
            • 2010-10-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-23
            • 1970-01-01
            相关资源
            最近更新 更多