为什么要明确一个键?

dsa*_*ton 15 primary-key unique-constraint

我对数据库这个主题很陌生,所以这可能听起来很无知,但我很好奇为什么应该在表中明确显示一个键。这主要是为了告诉用户给定的列值(希望)保证在每一行中都是唯一的?即使没有提到它的独特性,它也应该仍然存在。

Vér*_*ace 32

您显然建议CONSTRAINT数据库中的s 应该由访问该数据库的应用程序强制执行?

这是一个糟糕的(糟糕的,糟糕的......)想法的原因有很多

1) 如果您正在构建一个“自己动手”的约束“引擎”(即在您的应用程序代码中),那么您只是在模拟 Oracle/SQL Server/MySQL/PostgreSQL/<.whoever...> 花费的内容写作。这些年来,他们的 CONSTRAINT 代码已经过数百万最终用户的测试。

2) 恕我直言,即使在数年之内,您也不会做对 - 从这里开始,仅 MySQL 代码就花费了 4000 万美元。MySQL 是上述 3 个服务器中最便宜的,它们甚至没有实现 CHECK CONSTRAINT。显然,让 RI(参照完整性)完全正确是很困难的。

我曾经经常参加 Oracle 论坛,但我无法告诉你有多少次,一些糟糕的经理/程序员将一个项目强加于他,而以前工作过的天才有“聪明”的想法去做你的建议.

Jonathan Lewis(他写了一本关于Oracle 优化器基础知识的 550 页书)给出了否定的答案。他在另一本书中的 2 设计灾难(“橡木桌的故事”——橡木桌是一组 Oracle 专家)是

  1. 我们将在应用程序级别检查数据完整性,而不是利用 Oracle 的约束检查能力。

3) 即使奇迹般地您可以正确实施 RI,您也必须一次又一次地为涉及该数据库的每个应用程序完全重新实施它 - 如果您的数据很重要,那么新的应用程序也会如此。选择它作为范式将导致您和您的程序员同事(更不用说支持人员和销售人员)过着不断灭火和痛苦的生活。

您可以在此处此处此处阅读有关为什么在应用程序级别实现数据约束简直是疯狂的更多信息

具体回答你的问题:

只是为什么他们被宣布?看起来很有帮助,但实际上有必要拥有一个可以运行的数据库吗?

其原因KEYS(或者PRIMARYFOREIGNUNIQUE或只是普通的INDEXES)声明的是,虽然它是不是严格必需的数据库,让他们为它的功能,它是绝对必要为他们被宣布为它的功能很好

  • 阅读几本书(Date、Garcia-Molina...),如果您有 ** 特定** 问题(过于宽泛的问题在这里被认为是题外话),请回来找我们。ps 欢迎来到论坛:-) (2认同)

nvo*_*gel 10

当您在数据库中创建键时,DBMS 引擎会对键属性强制执行唯一性约束。这至少用于三个相关目的:

  • 数据完整性:关键属性中不能输入重复数据。因此可以保证对密钥的任何依赖性。
  • 身份识别:用户可以依靠密钥作为准确识别和更新数据的手段。
  • 优化:关于哪些属性是唯一的信息(元数据)可用于 DBMS 查询优化器。此信息允许优化器以某些方式简化查询执行,以便更快地执行查询。


boo*_*ife 8

我将为现有的优秀答案添加一个方面:文档。通常,重要的是要了解可以使用哪些类型的键来标识实体。唯一列的任何组合都是候选键。

主键在实践中往往是一个特别有用的概念。

无论您是否强制执行密钥(您可能应该),文档本身都是有价值的。


Tho*_*anz 5

您应该使用 CONSTRAINT 而不是某些内部应用程序代码的另一个原因:

如果开发人员/dba 使用插入/更新/删除语句直接修改数据库中的数据会发生什么?在这种情况下,所有基于引用完整性的优秀应用程序都将毫无用处。我知道,有些开发人员喜欢直接修改数据的可能性,而不必理会 RI,因为他们知道自己在做什么 - 至少大部分时间(但并非总是如此)

PS:当然你可以创建触发器,但它们通常非常慢(与约束相比)。