【问题标题】:Foreign Keys are evil? [closed]外键是邪恶的? [关闭]
【发布时间】:2014-03-28 00:45:20
【问题描述】:

很抱歉以假名发帖,但由于公司限制,为了保护无辜者,我必须保持匿名。

我从事专业开发人员大约有 18 年了,虽然我不是 DBA,但多年来我一直与他们密切合作,并形成了我认为什么是好的什么是不好的相当不错的感觉数据库实践。我刚加入一家公司,有两个开发人员负责数据库模式,我发现他们非常反对使用外键约束。

据我所知,他们的推理是 (1) 由于涉及额外的数据设置,它使单元测试存储过程更加困难,并且 (2) 外键可能会引发错误,因为顺序很重要。他们实际上更喜欢孤立数据而不是停止应用程序。

这对我来说似乎是一种不好的做法,但他们的立场坚定不移。我们提出了外键在数据完整性、查询性能、生成数据库图表等方面提供的优势,但无济于事。

我在这里没有看到什么吗?有什么建议吗?

【问题讨论】:

  • 第 (1) 点听起来很容易解决。第 (2) 点可以通过简单地按顺序插入数据来解决,这通常不难做到。
  • 这是一个征求意见,因此,对于本网站来说不是一个适当的问题。
  • 你可能想给他们看this list of pros and cons

标签: database-design foreign-keys sql-server-2012 database-schema


【解决方案1】:

如果您所描述的确实是开发人员对外键的一般方法,我认为他们是误导或幼稚的。当然,外键约束不能或不应该应用于任何给定系统中的某些特定属性,这很有可能是有充分理由的。也许这就是表面上的言辞背后的真正原因。

我的建议。如果您是相关系统的利益相关者,那么不要与开发人员交谈,与开发经理或任何拥有该系统的人交谈。用具体的例子来支持你的案例,说明缺乏参照完整性会产生不利影响或构成未来风险。

如果您当前没有与 RI 相关的问题,那么您的主要关注点大概是为未来的工作改进政策或开发方法。与数据库管理员、DBA 或负责标准和信息风险的人员交谈。考虑为开发团队的利益投资一些培训、指导或咨询。

【讨论】:

    【解决方案2】:

    我设计数据库系统已有 30 多年了。这是我的看法——你可能不会喜欢它。在设计封闭系统时,您的引用完整性可能会内置到应用程序的用户界面中。您只能在需要颜色的地方添加产品实体记录 - 由用户界面强制执行。那么为什么要有外键呢?我不做任何人都可以做任何事情的开放数据库 - 所以您的典型后端将有数千行前端代码来保护数据的完整性。用螺栓固定的外键只会妨碍您,不会为您提供任何真正的服务。这不像外键会引发异常,然后您将捕获该异常并向用户发布消息。没有人,我的意思是没有人那样编码。我们所有的程序员都喜欢冲进去,把所有很酷的东西直接放在用户界面中。但就像我说的,我在开发者规则的封闭系统中工作。另一方面,索引 - 非常重要。先处理那个。外键 - 只是语法绒毛。

    【讨论】:

    • FK 可以节省时间和维护成本:当需求发生变化时,您只需在一个地方而不是每个应用程序都更改一次约束。 FK 提高查询性能:优化器可以使用它们来重写和优化执行计划。 FK 是声明性的而非程序性的:它们始终适用于所有数据,而不仅仅是在它们在应用程序中生效的时候。 FK 支持与其他工具和流程、ETL、开发和管理工具、代码生成和许多其他东西的集成。 FKs 不是语法绒毛!!
    • 我认为您可能会将外键与索引混淆。
    • 嗨,斯科特。我不是。通常情况下,外键属性是索引的良好候选者,但我当然不会在我的回答和评论中假设这一点。无论外键列是否被索引,外键约束都很重要且有用。
    • 我很乐意同意不同意。您的 cmets 非常好,我强烈建议任何阅读它们的人注意。这就是为什么我赞成他们。但我相信里程会随着计算机界的所有智慧和经验法则而变化。
    • 如果您了解它们的用途和作用,外键将非常有用。它们将以最常见的措辞提供强制数据完整性。换句话说,一个值不能插入到其他地方不存在的表中,例如,据说您不需要为每个可能的值都有一个表,但必须在数据库级别酌情使用以确保数据与您预期的一样具体,否则跳过外键。
    猜你喜欢
    • 2010-11-26
    • 2010-12-23
    • 2010-11-22
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 2010-10-02
    相关资源
    最近更新 更多