数据库设计三大范式
一、数据库的设计三范式,也就是数据库设计的三大原则(Normalization)是关系型数据库设计的一种标准化过程,目的是消除冗余数据,提高数据存储的效率和数据查询的性能。它包括第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。
【1】第一范式(1NF):确保每一列具有原子性,即每一列的数据都是不可分割的。例如,一个订单表格中,每个订单只能有一个订单号,不能存在一列同时存储多个订单号。
即: 第一范式就是属性不可分割,每个字段都应该是不可再拆分的。
即每一个字段应该是最小单位,不能被拆分成多个字段,否则它就是可分割的,不符合第一范式。
比如学生表(Student)中有个字段为姓名(name),在国内的话通常理解都是姓名是一个不可再拆分的单位,这时候就符合第一范式;但是在国外的话还要分为FIRST NAME和LAST NAME,这时候姓名这个字段就是还可以拆分为更小的单位的字段,就不符合第一范式了。
【2】第二范式(2NF):确保表格中的每一行数据只与该表格的主键有关系,即非主键列必须完全依赖于主键。例如,一个订单表格中,每个订单只能对应一个客户,客户信息不应该存储在订单表格中,而应该单独建立一个客户表格。
第二范式:是在第一范式的基础上更进一步。第二范式就是要求表中要有主键,表中其他字段都依赖于主键,因此第二范式只要记住主键约束就好了。
比如在学生表(Student)中,姓名(name)可以作为主键吗?不可以!因为学生的姓名可能会同名,这样就不唯一了。所以需要学号这样的唯一值作为主键才行。
而表中其他字段都依赖于主键,意思是学生表中 “张三” 同学的年龄和性别等字段,不能存储别人的年龄性别,必须是和他自己相关的。因为张三的学号就决定了,这行记录归张三所有,不能给无关人员使用。
【3】第三范式(3NF):确保非主键列之间没有传递依赖关系,即不存在一个非主键列依赖于另一个非主键列。例如,一个订单表格中,商品名、商品价格和商品数量应该分别存储在一个商品表格中,而不是存储在订单表格中。
第三范式:就是确保数据表中的每一列数据都和主键直接相关,而不能间接相关。也就是要消除传递依赖,方便理解,可以看做是消除冗余,因此第三范式只要记住外键约束就好了。
比如在设计一个学生表的时候,可以将班主任的主键编号作为一个外键和学生表建立相应的关系,而不可以在学生表中添加关于班主任其它信息(比如姓名、年龄等)的字段。
这样在查询学生信息以及学生的班主任信息的时候,就可以使用班主任编号来引用班主任表中的数据,也不必在学生表中多次输入班主任信息的内容,减小了数据冗余。
举个例子,一个员工表格包括员工号、姓名、部门号和部门名称等字段。如果按照三范式进行设计,则应该将部门名称字段剥离出员工表格,建立一个部门表格,并通过部门号建立员工表格和部门表格之间的关联关系,这样可以消除重复数据,提高数据存储的效率和数据查询的性能。
在使用数据库设计三范式时,需要注意以下几点:
1.遵循范式的设计原则可以提高数据库的性能和可维护性,但过度规范化可能会影响查询性能。
2.范式设计并不一定是最优的设计方案,需要结合具体业务需求和数据特点来进行设计。
3.三范式设计不适用于所有场景,例如数据仓库和一些面向对象的数据库设计中,可能需要采用其他的设计原则。
二、数据库三大范式的作用
范式可以避免数据冗余,减少数据库的空间,减轻维护数据完整性的麻烦。但是操作困难,因为需要联系多个表才能得到所需要数据,而且范式越高性能就会越差。要权衡是否使用更高范式是比较麻烦的,一般在项目中,用得最多的也就是第三范式。
实际上设计任何一种数据库应用系统,不论是基于何种数据模型的,都会遇到如何构造合适的数据模式即逻辑结构的问题。
由于关系模型有严格的数学理论基础,并且可以向别的数据模型转换。所以要设计合适的关系模式,使其逻辑结构更加符合要求,出现了规范化理论。
而三大范式即第一、第二和第三范式就是规范化理论重要部分,是为了在设计中更好的解决数据冗余,数据有效性检查,提高存储效率。
三、结合实际理解
一、第一范式(1NF):列的原子性
第一范式是指数据库表中的每个字段都是原子性的,即不可再分的。
例如,假设我们有一个学生表,其中包含学生的姓名、电话和学校所在省县。考虑到第一范式,应该将学校所在省县拆分分学校所在省和学校所在县两列

应拆分分

二、第二范式(2NF):消除部分依赖
在满足1NF的前提下,表中不存在部分依赖,非主键列要完全依赖于主键。(主要是说在联合主键的情况下,非主键列不能只依赖于主键的一部分)
如下学生成绩表:

表中主键为“学生ID”和“课程ID”组成的联合主键。满足1NF;非主键列课程得分完全依赖于主键,“学生ID”和“课程ID”两个值才能决定“课程得分”的值;而“课程名称”只依赖于“课程ID”,与“学生ID”没有依赖关系,它不完全依赖于主键,只依赖于主键的一部分,不符合2NF。
修改使表满足2NF后:


将原来的成绩表(score)拆分为成绩表(score)和课程表(kc),而且两个表都符合2NF。
三、第三范式(3NF):消除传递依赖
第三范式是在满足第二范式的基础上,消除非主键字段之间的传递依赖。它要求每个非主键字段只依赖于主键,而不依赖于其他非主键字段。
例如,假设我们有一个员工表,其中包含员工ID、员工姓名、所属部门和部门负责人。在第三范式下,我们应该将所属部门和部门负责人拆分为独立的表,以避免员工表中的冗余数据,并确保每个非主键字段只依赖于员工号。

修改表使之满足3NF后:


浙公网安备 33010602011771号