UNIQUE 是一个索引,它使您的字段非常独特。但是,如果您在插入新数据之前已经在 PHP 中进行了验证,是否值得使用它?额外的 INDEX 并不是世界末日,但如果您在进行查询优化,那么 UNIQUE 就会妨碍您,对吗?
5 回答
如果你是一个好司机,为什么要系安全带,你可以节省两秒钟的总行程时间?
程序员要学习的最重要的一课是他是人,他会犯错误。 更糟糕的是,处理此代码的其他所有人也是人。
为什么存在 UNIQUE 约束?保护数据库不被人犯错误。关闭您的 UNIQUE 约束表示“您不必担心,数据库先生,我永远不会给您提供与我的意图不符的数据。”
如果你的代码发生了一些事情,以至于你的唯一性验证被破坏了怎么办?现在您的代码将重复记录转储到数据库中。但是,如果您对该列有一个 UNIQUE 约束,那么当您的前端代码停止工作时,您的查询就会爆炸。
你是人类。接受。让计算机完成它的工作并帮助保护您免受自己的伤害。
UNIQUE 不仅用于确保数据有效。主要目的是优化查询:如果数据库知道该字段是唯一的,它可以在找到第一条记录后立即停止搜索命中。您不能仅通过精心设计的查询将该信息传递到数据库。
这是一个有趣的问题。
- 您确定您的代码无法被绕过吗?
- 您确定除了 PHP 应用程序之外没有其他任何东西可以访问数据吗?
- 您确定在插入副本的情况下您的应用程序的其余部分不会失败吗?
- 有重复条目的含义是什么,这会对未来的参考或计算造成问题吗?
这是数据库级别的约束有助于解决的一些问题。
至于优化,约束不会使检索数据的过程明显变慢,实际上它可以在某些时候在执行计划中使用,因为它与索引有关。
所以不,它不会妨碍优化,它还会保护您的数据免受不一致的影响。
正如 pst 所提到的,在您开发的这个阶段,您无法开始优化您的数据库或有问题的应用程序。
在系统中添加额外的健全性检查通常不是一件坏事。是的,您对性能的影响只是那么一点点,但是任何用户都不会注意到额外的一两个 CPU 滴答声。
想一想:今天您在 php 中进行验证,但不要在数据库中断言唯一性。将来,您、您的同事或其他已经分叉您的项目的人会更改原始的 php 验证,破坏它,或者完全忘记它。此时,您可能希望在您的数据库中添加检查。
tl:博士;事务完整性(在数据库中)处理竞争条件(在应用程序中)。
这些 Rails 文档的并发和完整性部分通过示例场景解释了为什么这是必要的。
具有事务完整性的数据库通过隔离来保证唯一性,而应用程序实际上在事务隔离之外采取了几个单独的步骤(获取值,检查是否有其他值,然后保存值),这使它们容易受到竞争条件的影响,尤其是在规模上。