4

UNIQUE 是一个索引,它使您的字段非常独特。但是,如果您在插入新数据之前已经在 PHP 中进行了验证,是否值得使用它?额外的 INDEX 并不是世界末日,但如果您在进行查询优化,那么 UNIQUE 就会妨碍您,对吗?

4

5 回答 5

12

如果你是一个好司机,为什么要系安全带,你可以节省两秒钟的总行程时间?

程序员要学习的最重要的一课是他是人,他会犯错误。 更糟糕的是,处理此代码的其他所有人也是人。

为什么存在 UNIQUE 约束?保护数据库不被人犯错误。关闭您的 UNIQUE 约束表示“您不必担心,数据库先生,我永远不会给您提供与我的意图不符的数据。”

如果你的代码发生了一些事情,以至于你的唯一性验证被破坏了怎么办?现在您的代码将重复记录转储到数据库中。但是,如果您对该列有一个 UNIQUE 约束,那么当您的前端代码停止工作时,您的查询就会爆炸。

你是人类。接受。让计算机完成它的工作并帮助保护您免受自己的伤害。

于 2013-01-20T08:30:44.167 回答
4

UNIQUE 不仅用于确保数据有效。主要目的是优化查询:如果数据库知道该字段是唯一的,它可以在找到第一条记录后立即停止搜索命中。您不能仅通过精心设计的查询将该信息传递到数据库。

于 2013-01-20T08:26:14.277 回答
4

这是一个有趣的问题。

  • 您确定您的代码无法被绕过吗?
  • 您确定除了 PHP 应用程序之外没有其他任何东西可以访问数据吗?
  • 您确定在插入副本的情况下您的应用程序的其余部分不会失败吗?
  • 有重复条目的含义是什么,这会对未来的参考或计算造成问题吗?

这是数据库级别的约束有助于解决的一些问题。

至于优化,约束不会使检索数据的过程明显变慢,实际上它可以在某些时候在执行计划中使用,因为它与索引有关。

所以不,它不会妨碍优化,它还会保护您的数据免受不一致的影响。

于 2013-01-20T08:30:12.883 回答
3

正如 pst 所提到的,在您开发的这个阶段,您无法开始优化您的数据库或有问题的应用程序。

在系统中添加额外的健全性检查通常不是一件坏事。是的,您对性能的影响只是那么一点点,但是任何用户都不会注意到额外的一两个 CPU 滴答声。

想一想:今天您在 php 中进行验证,但不要在数据库中断言唯一性。将来,您、您的同事或其他已经分叉您的项目的人会更改原始的 php 验证,破坏它,或者完全忘记它。此时,您可能希望在您的数据库中添加检查。

于 2013-01-20T08:29:04.290 回答
0

tl:博士;事务完整性(在数据库中)处理竞争条件(在应用程序中)。

这些 Rails 文档并发和完整性部分通过示例场景解释了为什么这是必要的。

具有事务完整性的数据库通过隔离来保证唯一性,而应用程序实际上在事务隔离之外采取了几个单独的步骤(获取值,检查是否有其他值,然后保存值),这使它们容易受到竞争条件的影响,尤其是在规模上。

于 2013-01-22T18:07:37.643 回答