数据库设计的三大范式
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。
在实际开发中最为常见的设计范式有三个:
1.第一范式
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
理解:列不可重复、列不可分
例如下表格没有遵循第一范式:
编号 | 用户ID | 性别1 | 性别2 | 年龄 | 联系电话 | 详细地址 |
---|---|---|---|---|---|---|
1 | 1 | 男 | 1 | 1991 | 0394-76571989,13268009800 | 山东 青岛海湾路101号 |
2 | 2 | 女 | 0 | 1990 | 0394-82157081,13535456679 | 北京 海淀区安宁庄东路123号 |
解决方案:
编号 | 用户ID | 性别 | 年龄 | 联系电话 | 省份 | 城市 | 详细地址 |
---|---|---|---|---|---|---|---|
1 | 1 | 男 | 28 | 0378-23459876 | 河南 | 开封 | 朝阳区新华路23号 |
2 | 2 | 女 | 29 | 0394-82157081 | 北京 | 海淀区 | 安宁庄东路123号 |
上表所示的用户信息遵循了第一范式的要求,这样在对用户使用城市进行分类的时候就非常方便,也提高了数据库的性能。
2.第二范式
第二范式在第一范式的基础之上更进一层。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一的区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。要求实体的属性完全依赖于主关键字。
理解:行必须被唯一
例如下表格没有遵循第二范式:
职工姓名 | 年龄 | 性别 | 联系方式 | 邮箱 |
---|---|---|---|---|
张三 | 18 | 男 | 13309340534 | 29770713@qq.com |
李四 | 28 | 男 | 18210393967 | ygz@sina.com |
张三 | 29 | 女 | 18801397899 | san@163.com |
解决方案
职工编号 | 职工姓名 | 年龄 | 性别 | 联系方式 | 邮箱 |
---|---|---|---|---|---|
001 | 张三 | 18 | 男 | 13309340534 | 29770713@qq.com |
002 | 李四 | 28 | 男 | 18210393967 | ygz@sina.com |
003 | 张三 | 29 | 女 | 18801397899 | san@163.com |
3.第三范式
第三范式在第二范式的基础上更进一层。第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
理解:消除存在传递依赖(即:除主键外,其他字段必须依赖主键)。
例如,下图一个部门信息表(1-1),其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在1-2的职工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入这个职工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。
部门信息表(1-1)
部门编号 | 部门名称 | 部门简介 |
---|---|---|
1001 | 技术部 | 解决公司电脑宽带等各方面奇数问题 |
1002 | 人事部 | 负责招聘,统计职工信息计算考勤薪资等 |
职工信息表(1-2)
职工编号 | 职工姓名 | 所属部门 | 部门名称 | 年龄 | 性别 | 联系方式 | 邮箱 |
---|---|---|---|---|---|---|---|
001 | 张三 | 1001 | 技术部 | 18 | 男 | 13309340534 | 29770713@qq.com |
002 | 李四 | 1002 | 人事部 | 28 | 男 | 18210393967 | ygz@sina.com |
003 | 张三 | 1001 | 技术部 | 29 | 女 | 18801397899 | san@163.com |