我对数据库这个主题很陌生,因此听起来似乎很无知,但是我很好奇为什么应该在表中将键显式化。这主要是为了告诉用户给定的列值(希望)在每一行中都是唯一的吗?即使没有提及,唯一性仍然应该存在。
我对数据库这个主题很陌生,因此听起来似乎很无知,但是我很好奇为什么应该在表中将键显式化。这主要是为了告诉用户给定的列值(希望)在每一行中都是唯一的吗?即使没有提及,唯一性仍然应该存在。
Answers:
您显然建议CONSTRAINT
数据库中的s应该由/访问哪个数据库的应用程序强制执行?
这是一个坏主意的原因有很多。
1)如果您正在构建“自己拥有”约束“引擎”(即在您的应用程序代码中),那么您只是在模仿Oracle / SQL Server / MySQL / PostgreSQL / <。whoever ...>花费了什么年写作。这些年来,他们的CONSTRAINT代码已经过数百万最终用户的测试。
2)在对您和您的团队的所有应有的尊重下,即使在几年内,您也无法做到这一点-从这里开始,仅MySQL代码就花费了4000万美元。MySQL是上述3台服务器中最便宜的,并且它们甚至都没有实现CHECK CONSTRAINT。显然,要使RI(参照完整性)完全正确是很困难的。
我曾经经常参加Oracle论坛,但我无法告诉您一些可怜的经理/程序员向他施加项目的次数,以前曾任职的天才有“聪明”的想法来做您建议的事情。
乔纳森·刘易斯(Jonathan Lewis)(他撰写了550页有关Oracle优化器基础知识的书)给出了否定的答案。他的另一本《设计灾难》中的2本(《橡树桌子的故事》-橡树桌子是一组Oracle专家)是
- 我们将在应用程序级别检查数据完整性,而不是利用Oracle的约束检查功能。
3)即使您可以奇迹般地正确实现RI,您也必须一次又一次地完全实现与该数据库相关的每个应用程序的RI-如果您的数据很重要,那么新的应用程序就可以了。选择这种模式将使您和您的其他程序员(更不用说支持人员和销售人员)过着不断的灭火和痛苦的生活。
您可以在此处,此处和此处了解更多有关为何在应用程序级别实现数据约束的疯狂之处的更多信息。
具体回答您的问题:
到底为什么要声明它们?看起来很有帮助,但是实际上有必要建立一个可以正常运行的数据库
其原因KEY
S(或者PRIMARY
,FOREIGN
,UNIQUE
或只是普通的INDEX
ES)声明的是,虽然它是不是严格必需的数据库,让他们为它的功能,它是绝对必要为他们被宣布为它的功能很好。
我将在现有的出色答案中增加一个方面:文档。通常,很重要的一点是要查看可用于识别实体的密钥类型。唯一列的任何组合都是候选键。
在实践中,主键往往是一个特别有用的概念。
无论您是否强制执行密钥(您可能应该这样做),文档本身都是有价值的。
FOREIGN KEY
定义以获取对系统的感觉”。我的查询返回了邮政编码!!!为确保我的SQL一定是错误的,我向一位高级程序员提到了这一点。他自豪地(毫不逊色)宣布(好像他正在生一个新生儿子一样)该系统没有任何FK,因为“所有搜索都在PRIMARY KEY
s上”(无关紧要)。<Doh ...>荷马·辛普森!