首先范式是什么:
是对设计数据库提出的一些规范,设计数据库时遵循一定的规则,建立冗余较小、结构合理的数据库更便于查找数据。
第一范式(1NF):
强调列的原子性,原子性即最小单位,不可再拆分,也就是数据库建的表的列是不可拆分的;
举个例子:
people表
user |
张三,189……9030,男 |
这个表格很明显列是可以拆分为name ,tel ,gender;
所以它不满足第一范式:
正确建表如下:
user表
name | tel | gender |
张三 | 189……9030 | 男 |
现在的每列都无法继续拆分成更小单元了,即满足了第一范式。
第二范式(2NF):
首先第二范式是要满足第一范式的基础上需要遵循的规范:
要求主键列与非主键列遵循完全函数依赖关系,而不能只与主键的某部分相关(主要针对联合主键)。
完全依赖关系是什么:
通俗来说,完全依赖关系就是,假如X的值确定,必然可以推出Y的值的时候,那么就是Y完全依赖于X;
类比函数的定义:凡相关的两数X与Y,对于每个X值,都只有一个Y的对应值。这种对应关系就表示Y是X的函数。
函数依赖关系中,不存在俩个Y依赖于一个X,也就是说一个X不能推出俩个Y。
举个例子:
学号 成绩(不是完全函数依赖关系)(学号不能够直接推出成绩)
学号 + 课程名 成绩(是函数依赖关系)(学号+课程名可以推出成绩,而且只有一个唯一的成绩与之对应)
主键(主码)是什么:
主键就是被挑选出来,作表的行的唯一标识的候选关键字。
主键的作用有四个:可以保证实体的完整性;能够加快数据库的操作速度;在表中添加新记录时,会自动检查新记录的主键值,不允许该值与其他记录的主键值重复;自动按主键值的顺序显示表中的记录,但如果没有定义主键,则按输入记录的顺序显示表中的记录。
举个例子:
订单详情表
订单ID | 产品ID | 单价 | 折扣 | 数量 | 产品名称 |
1001 | 002 | 8888 | 0.99 | 100 | 电脑 |
折扣,数量,完全依赖主键订单ID,但是单价,产品名称依赖于产品ID。
所以这个表不满足第二范式
应该拆分为如下俩表:
订单详情表
订单ID | 产品ID | 折扣 | 数量 |
1001 | 002 | 0.99 | 电脑 |
产品表
产品ID | 单价 | 产品名字 |
002 | 8888 | 电脑 |
重点分析下面俩表,首先我们找到主键;
订单详情表中的主键是:订单ID;产品ID,折扣,数量依赖于产品ID
产品表中的主键是:产品ID;单价,产品名字依赖于产品ID。
第三范式(3NF):
在第二范式的基础上,规定了第三范式。
第三范式确保主键列之间没有传递函数依赖关系,也就是消除传递依赖。
举个例子:
people表
旅游订单ID | 游客ID | 游客姓名 | 游客地址 | 旅游城市 | 日期 |
001 | 1001 | 张三 | XX市 | 海南 | 2023 |
这个表,游客ID,游客姓名,游客地址,旅游城市,日期;都依赖于旅游订单ID。
但是这里游客姓名,游客地址依赖于游客游客ID,第三范式就是消除这种传递依赖。
所以我们将其拆分为俩个表
旅游订单ID | 游客ID | 旅游城市 | 日期 |
001 | 1001 | 海南 | 2023 |
游客ID | 游客姓名 | 游客地址 |
1001 | 张三 | XX市 |