知识卡片
函数依赖的精确定义及为何通常不需要专门声明
内容
函数依赖(FD)的精确定义:设A、B是关系变量R标题的子集,A→B在R中成立,当且
仅当R的任何合法取值里,两个元组只要A取值相同,它们的B取值也必然相同(读作
“A函数确定B”或”A指向B”)。[[超键与函数依赖恒成立]]里已说明超键到任意属性集合
的函数依赖是自动成立的”平凡”情形,本节补充:函数依赖本质上就是一种完整性
约束,只是它一般不是元组约束(判断它需要横向比较关系变量里所有元组)。约束
CX4”两个供应商编号相同则城市也必须相同”正是函数依赖{SNO}→{CITY}的具体
实例;如果换成假设性的约束”同城市的供应商状态必须相同”,则对应{CITY}→
{STATUS}。这里有一个值得记住的实践判断:虽然理论上函数依赖不等于候选键
(存在函数依赖但左边不是候选键的情况,比如上面的{CITY}→{STATUS}例子),
但作者明确反对为函数依赖单独引入专门的简写声明语法——因为在设计良好(完全
规范化)的数据库里,几乎所有真实存在的函数依赖,左边最终都会恰好是某个候选
键;反过来说,”在良好设计的数据库里很难声明出一个不是键的函数依赖”,这件事
本身恰恰构成了一条支持”规范化设计”的间接依据:如果发现自己确实需要显式声明
一个左边不是候选键的函数依赖,这往往就是关系变量没有被充分规范化的信号,
真正该做的是调整设计而不是给约束系统增加复杂度去迁就这种情况。
参考来源
- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第8章"SQL与约束"
8.3节"数据库约束"例4(源文件:OEBPS/text00091.html)
- 结论依据:原文明确"函数依赖(FD)A→B在R中成立,当且仅当(在R的任何合法
关系值中)两个元组A取值相同,则它们的B取值也必相同……并不是所有的函数
依赖都是键,但在数据库设计良好的情况下所有的函数依赖应该几乎总是键……
'在数据库设计很差的情况下很难声明函数依赖'首先可以看作是'避免对数据库
进行不良设计'的一个小依据"。
- 原始内容:函数依赖(FD)A→B在R中成立,当且仅当两个元组A取值相同,则它们
的B取值也必相同……在数据库设计良好的情况下所有的函数依赖应该几乎总是键。