数据库逻辑设计
前面我们讲了第二范式,我们知道还有第三范式,那么第三范式的特点到底是什么呢?下面我们来一起看看。
主码、候选码、码
ps:元组理解为一张表的某一行,属性理解为一张表的某一列,属性名就是列的名字(字段)。
1(码):码是可以确定一个元组的所有信息的属性名或属性名组。
例如在 { a, b, c, d } 中,
假设知道 a 的值就能确定 a, b, c, d 的值,
假设知道 c, d 的值就可以确定 a, b, c, d 的值,
那么 { a } 就是码,{ c, d } 就是码。
并且 { a, b }, { a, c }, { a, b, c }, { a, b, c, d } 等也都是码,因为它们也可以确定一个元组的所有值,即使很多余。
2(候选码):候选码的真子集中不存在码,候选码可以有多个。
就上面的例子而言,{ a } 是候选码,{ c, d } 是候选码,因为它们的真子集中不存在码。
而诸如 { a, b } 并不是候选码,因为它的真子集中含有 { a }, 且 { a } 是码。里面包括主码,以及我们的非主属性
3(主码):主码就是主键的意思,主码是任意一个候选码。
还是上面的例子,主码是候选码 { a }, { c, d } 中的其中一个。
既可以是 { a }, 也可以是 { c, d }。
第一范式
首先我们回顾一下什么是第一范式:第一范式就是如果关系模式R,其所有属性都是不可再分的基本数据项,则称R属于第一范式,R∈1NF。简而言之,就是要求数据库里面的表字段都是单一属性,不可再分的。也就是原子性的关系。
学号 姓名
123 王小王
456 王小王-123,王小王-456
显然上面不满足第一范式的要求,那么我们如何修改了,来达到我们的第一范式的特点,如下
学号 姓名
123 王小王
456 王小王-123
456 王小王-456
第二范式
第二范式就是每个非主属性完全依赖于主键,就是我们的表中的其他字段要完全的依赖于我们的主键,如果有一个不依赖或者依赖于多个,那么也不是第二范式。
如果我们的主码是单一的属性,那么我们的肯定是完全依赖函数关系,那么就是第二范式,如果存在多个主码,我们需要考虑的是主码的约束性,是否是完全依赖函数关系,也就是说我们的属性是否与主码是否是一一对应的关系。我们看看下面的这个例子
学号 身份证号 姓名 家庭住址
818 500237 王小王-123 重庆
017 500103 小小冷-123 重庆
我们观察到我们的这张表里面我们,候选码也就是主属性是{学号,身份证号},但是,我们的学号可以决定决定班级,身份照号决定家庭住址,我们的家庭住址部分函数依赖于我们的身份照号,所以它不符合第二范式。
我们需要对这个表进行拆分,如下的两个表格
学号 姓名
818 王小王-123
017 小小冷-123
身份证号 姓名 家庭住址
500237 王小王-123 重庆
500103 小小冷-123 重庆
第三范式
在第二范式的基础之上(非主属性必须完全依赖于候选码,也就是主属性)不能够存在传递依赖的函数关系,我们称之为第三范式。如果存在,我们就需要消除这种关系:一个非主属性依赖于另外一个非主属性。
学号 所选课程 学分
818 大数据 4
017 C语言 4
有小伙伴问,这到底符合第几范式?是否是第三范式。首先我们判断它是第一范式,其次我们判断他还是第二范式,因为主码是学号,而其他的两个非主属性是完全依赖于主属性的。但是他是不是第三范式呢?答案是:NO!!因为我们的学分是依赖于所选课程的,而所选课程优势依赖于学号,所以构成了a-b-c,也就是a-c的模式,这样是不能满足的。
拆分变成两个表
学号 所选课程
818 大数据
017 C语言
所选课程 学分
大数据 4
C语言 4
这样就可以解决我们数据冗余情况
巴斯-科德范式
首先,要满足前面的三个范式,这是必然的要求
在第三范式的基础之上,任何非主属性不能对主键的子集依赖(在第三范式的基础上,消除对主码子集的依赖)
对于第巴斯-科德范式,说实话有点不好理解
R属于3NF,不一定属于BCNF,如果R属于BCNF,一定属于3NF
假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:
(仓库ID, 存储物品ID) →(管理员ID, 数量)
(管理员ID, 存储物品ID) → (仓库ID, 数量)
所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:
仓库ID → 管理员ID
管理员ID→ 仓库ID
即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。
第四范式
第四范式就是消除表中的多值依赖,以消除表中的信息冗余,达到一对一的关系,最终达到我们的数据效率。
姓名 性别 年龄
王小王-123 男 20
小小冷-123 女 20
拿到这个表格,首先我们判断它是满足第一范式,第二范式,第三范式,巴斯-科德范式,那么是否满足第四范式呢?我们可以看出年龄和性别都是依赖于姓名的,那么就出现了多值依赖,那么什么是多值依赖呢?就是多个值依赖于一个主属性,那就是姓名。这样是满足我们的第四范式的,我们需要完全的一一对应的关系。至于修改那就十分的简单了,两张表就可以了!
每文一语
沉得下心,才能远行