数据库设计的三范式
表的范式,是首先符合1NF,才能满足2NF,进一步满足3NF。
为了建立冗余较小,结构合理的数据库,设计数据库时必须遵循一定的规则,在关系性数据库中这种规则就称为范式。
范式是符合某一种设计要求的总结,要想设计一个结构合理的关系型数据库,必须满足一定的范式。
数据在数据库中会占用大量空间,为了节省空间,同时也为了让数据更安全合理,在设计表时要用三范式来规范一下。
在实际开发中最为常见的设计范式:
1. 第一范式(1NF):
字段不可再拆分,每个字段都是不可分解的原子级别的,不能说把id,姓名,班级等都塞在一个字段中,这是不合适的,对以后的应用会造成很大影响。
例:
编号 | 姓名 | 联系方式 |
---|---|---|
1 | 张三 | 15388888888 1732055555 |
上表不符合第一范式,联系方式列中有两个信息,一个是电话号码一个是QQ号,可以将上表更改为:
编号 | 姓名 | 电话号 | QQ号 |
---|---|---|---|
1 | 张三 | 15388888888 | 1732055555 |
2. 第二范式(2NF):
表中要有主键,非主键字段依赖主键(保证表中的记录是唯一的)
例:
姓名 | 性别 | 地址 |
---|---|---|
张三 | 男 | 尖草坪 |
张三 | 男 | 尖草坪 |
李四 | 女 | 小店 |
李四 | 女 | 小店 |
上表中张三和李四两条记录可能输入重复,也可能是现实中就是两个人,只是信息巧合,让人分辨不清楚,可以将上表更改为:
编号 | 姓名 | 性别 | 地址 |
---|---|---|---|
1 | 张三 | 男 | 尖草坪 |
2 | 张三 | 男 | 尖草坪 |
3 | 李四 | 女 | 小店 |
4 | 李四 | 女 | 小店 |
3. 第三范式(3NF):
表中不能有别的表的非主键列,表中不要有冗余数据,即表中的信息如果能够被推导出来,就不应该单独的设计一个字段来存放,第三范式需要确保数据表中的每一列数据都和主键直接相关,不能间接相关。
例:
stu表:
id | name | address | classId | className | depart |
---|---|---|---|---|---|
001 | 张三 | 山西省 | 101 | 一班 | 计算机系 |
001 | 李四 | 河北省 | 101 | 一班 | 计算机系 |
001 | 李四 | 山西省 | 101 | 二班 | 计算机系 |
class表:
classId | className | depart |
---|---|---|
101 | 一班 | 计算机系 |
101 | 一班 | 计算机系 |
201 | 二班 | 计算机系 |
上两表中stu表包含class表中的classId、className、depart三列数据,但是className、depart两列数据可以通过classId来推导出来,那么这两列数据在stu表中就多余了,可以更改为:
stu表:
id | name | address | classId |
---|---|---|---|
001 | 张三 | 山西省 | 101 |
001 | 李四 | 河北省 | 101 |
001 | 李四 | 山西省 | 101 |
4. 反3NF:
但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。
具体做法是: 在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。