数据库的三范式
在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
第一范式:所有字段值都是不可分解的原子值
1、每一列属性都是不可再分的属性值,确保每一列的原子性
2、两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据。
name class
小明 高一三班
换成
name senior class
小明 高一 三班
---满足第一范式不一定满足第二范式
第二范式:
每一行的数据只能与其中一列相关,即一行数据只做一件事。只要数据列中出现数据重复,就要把表拆分开来。
学生证 名称 学生证号 学生证办理时间 借书证号 借书证名称 借书证办理时间
x1 小明 123456 20191018 js1 xx借书 20191020
改成2张表如下:
学生证表
学生证 名称 学生证号 学生证办理时间
x1 小明 123456 20191018
借书证表
借书证号 借书证名称 借书证办理时间
js1 xx借书 20191020
这里面分明有两个主体信息,学生 证 和 借书证,我们不能讲借书证的信息挂到学生证上,所以要拆分。
这样的好处是学生表和借书证表是完全独立的表,并无直接的关系,方便扩展,比如老师也可以借书,或者外校的人也可以借书,需要一个中间表关联
订单编号 房间号 联系人 联系人电话号码 身份证号码
A1 501 小明 2216888 xxx
A2 502 小明 2216888 xxx
一个人同时订几个房间,就会出来一个订单号多条数据,这样子联系人都是重复的,就会造成数据冗余。我们应该把他拆开来。
订单编号 房间号 联系人编号
A1 501 B1
A2 502 B1
联系人编号 联系人 联系人电话号码 身份证号码
B1 小明 2216888 xxx
---满足第二范式不一定满足第三范式
第三范式:每一列数据都和主键直接相关,而不能间接相关。
比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)
这样一个表结构,就存在上述关系。 学号--> 所在院校 --> (院校地址,院校电话)
这样的表结构,我们应该拆开来,如下。
(学号,姓名,年龄,性别,所在院校)--(所在院校,院校地址,院校电话)
---所以第一范式,第二范式,第三范式都是有区别的。
三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库。