前引
以下均建立在看书的基础上,我的理解
一. 函数依赖
1.1 理解是什么
就是约束,规定了某些元组不能出现。
对于模式中的属性A和属性B,B函数依赖于A,记为A -> B。对于任意一个元组对t1,t2:
有t1[A] = t2[A],则t1[B] =t2[B]。
因此不允许出现属性A相同,但属性B不相同的元组。
上面的两个等式可以理解为A的值确定,则B的值就确定。因此有映射这一概念,故称之 函数 依赖
码也是一种函数依赖:对于码,记为属性集K ,有全体属性集R函数依赖于K,即K ->R在关系模式 r(R)上成立。 因为作为码的属性集K可以唯一标识一个元组,全体属性集R自然可以确定。(码还有not null,不能重复的特性)
1.2 用来干什么
说明关系中的约束
现在我创建了一个关系instructor,有属性ID,name,department。要求有以下三点约束
- ID唯一标识一位instructor
- 一位instructor只能有一个name
- 一位instructor只能关联一个department
以上均约束均可以用函数依赖表明,我们想表达当一个ID被确定时,其 name 和department 也被确定:
ID → R
等价于把ID设置为主码(不同的表述)
二. 范式
2.1 理解是什么
就是规范,是设计出优秀的数据库设计要遵循的标准。
通过遵循范式,我们可以减少数据存储的冗余,避免数据不一致的风险。
2.2 第一范式 1NF
满足第一范式的关系模式R的所有属性的域,一定是atomic,是不可分的。也就是说,域是原子域。
因此关系模式R不允许出现多值属性和复合属性。
关系模式中多值属性与复合属性:
复合属性,包含多个子属性,因此在关系模式中表现为多个属性。
多值属性,包含多个值,在关系模式在表现为新的模式,即我们创建新的模式以表示多值属性。
2.3 BCNF范式
消除所有基于函数依赖下的冗余
两个条件:
2.4 第三范式 3NF
因为通过强制性满足BCNF范式,可能会消除一些我们所期望的函数依赖。因此引入第三范式,
三个条件:
四. 问题
- 一个只有主码约束的关系模式一定是BCNF范式
答: 是的,因为只有一个函数依赖 K →R ,且K是超码