数据库范式学习

数据库范式学习

1. 概念

数据库范式主是用来指导数据库设计的,但是在实际的设计过程中不会完全遵循范式要求,可能遵循一部分,也可能违反一部分。
数据库的范式只要有三种范式,第一第二第三范式,注意高级的范式是依赖与低级别的,即不满足低级别范式的要求不可走高级别范式的设计。

2. 第一范式

第一范式最简单,表示属性不可分割,即每一列在数据库表中都不可分割

3. 第二范式

第二范式,首先需要满足第一范式,即数据库总每一列或行必须唯一的被区分。
每个非主属性的完全函数依赖于键码,可通过分解来实现。
分解前

Sno Sname Sdept Mname Cname Grade
1 学生-1 学院-1 院长-1 课程-1 90
2 学生-2 学院-2 院长-2 课程-2 80
2 学生-2 学院-2 院长-2 课程-1 100
3 学生-3 学院-2 院长-2 课程-2 95

以上学生课程关系中,{Sno, Cname} 为键码,有如下函数依赖:

  • Sno -> Sname, Sdept
  • Sdept -> Mname
  • Sno, Cname-> Grade

Grade 完全函数依赖于键码,它没有任何冗余数据,每个学生的每门课都有特定的成绩,所以可将Grade分解出来。
Sname, Sdept 和 Mname 都部分依赖于键码,当一个学生选修了多门课时,这些数据就会出现多次,造成大量冗余数据,这里注意这里的完全函数只是部分依赖于键码,并不是完全依赖,所以在第二范式中不可分割。

分解后的关系

关系1

Sno Sname Sdept Mname
1 学生-1 学院-1 院长-1
2 学生-2 学院-2 院长-2
3 学生-3 学院-2 院长-2

有以下函数依赖:

  • Sno -> Sname, Sdept
  • Sdept -> Mname

关系2

Sno Cname Grade
1 课程-1 90
2 课程-2 80
2 课程-1 100
3 课程-2 95

有以下函数依赖:

  • Sno, Cname -> Grade

3. 第三范式

第三范式首先需要先满足第一和第二范式,其次要求非主函数不传递属性依赖于键码,上线的关系1,Sname -> Sdept -> Mname,传递函数。
所以可以将上述的分解为:

关系-11

Sno Sname Sdept
1 学生-1 学院-1
2 学生-2 学院-2
3 学生-3 学院-2

关系-12

Sdept Mname
学院-1 院长-1
学院-2 院长-2

第三范式还隐含着数据表中不包含已在其他表中已包含的非主键关键字信息。意味着可以包含其他表中的关键字信息。上面的关系11包含的Sdept就是关系12表中的关键字信息,即属性不依赖于其他的非主属性,即可以依赖于主属性。

你可能感兴趣的:(学习)