数据库三范式
数据库设计的三大范式
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。
在实际开发中最为常见的设计范式有三个:
1.第一范式
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
理解:列不可重复、列不可分。
|
编号 |
姓名 |
性别sex |
性别 sex |
年龄 |
联系电话 |
详细地址 |
|
1 |
张红欣 |
男 |
1 |
1991 |
0378-23459876,13641131494 |
河南 开封朝阳区新华路23号 |
|
2 |
李四平 |
女 |
0 |
1990 |
0751-65432584,18070508592 |
广州 广东白云区天明路148号 |
如下表所示。
用户信息表
|
编号 |
姓名 |
性别 |
年龄 |
联系电话 |
省份 |
城市 |
详细地址 |
|
1 |
张红欣 |
男 |
26 |
0378-23459876 |
河南 |
开封 |
朝阳区新华路23号 |
|
2 |
李四平 |
女 |
32 |
0751-65432584 |
广州 |
广东 |
白云区天明路148号 |
上表所示的用户信息遵循了第一范式的要求,这样在对用户使用城市进行分类的时候就非常方便,也提高了数据库的性能。
2.第二范式
第二范式在第一范式的基础之上更进一层。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一的区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。要 求实体的属性完全依赖于主关键字。
理解:行必须被唯一。
学生成绩表
|
姓名 |
年龄 |
课程编号 |
课程名 |
教材 |
成绩 |
|
小芳 |
18 |
1 |
PHP |
《PHP&&Mysql入门》 |
98 |
|
小明 |
17 |
2 |
MySQL |
《Mysql开发案例》 |
68 |
|
小芳 |
16 |
1 |
PHP |
《PHP&&Mysql入门》 |
100 |
解决方案:
|
学号 |
姓名 |
年龄 |
课程编号 |
课程名 |
教材 |
成绩 |
|
001 |
小芳 |
18 |
1 |
PHP |
《PHP&&Mysql入门》 |
98 |
|
002 |
小明 |
17 |
2 |
MySQL |
《Mysql开发案例》 |
68 |
|
003 |
小红 |
18 |
1 |
PHP |
《PHP&&Mysql入门》 |
|
3.第三范式
第三范式在第二范式的基础上更进一层。第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
理解:消除存在传递依赖。即:除主键外,其他字段必须依赖主键。
例如,下图一个部门信息表(3-1),其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在图3-2的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。
部门信息表(3-1)
|
部门编号 |
部门名称 |
部门简介 |
|
10001 |
外交部 |
公司经济命脉 |
|
10002 |
技术部 |
公司核心团队 |
员工信息表(3-2)
|
员工编号 |
员工名称 |
所属部门 |
部门名称 |
员工性别 |
否党员 |
联系方式 |
|
000001 |
小红 |
10001 |
财务部 |
女 |
否 |
100101201 |
|
000002 |
小明 |
10002 |
技术部 |
男 |
否 |
955610086 |
浙公网安备 33010602011771号