【Mysql】数据库三大范式

数据库三范式

:数据库三范式是指关系型数据库设计中的三种规范化设计原则,旨在减少数据冗余、提高数据一致性和可维护性。

第一范式:规定表中的每一列都应该是不可分割的最小单元。

为什么要这样实现呢?

:举个栗子,大家可能都用过淘宝,京东,在填写收件地址的时候,是不是都要逐一填写 :省、市、区、详细地址。以上其实就是数据库中的某个字段。这就是第一范式的具体应用,如果某一天,政府下了批文,修改了某个区的名字,这样就可以直接在该字段上修改即可。如果全部都写到一起的话,修改就比较麻烦,可能会涉及正则表达式。

第二范式:是在满足第一范式的基础上,规定表中的非主键列不存在对主键的部分依赖。

在满足第一范式的基础上,表中不存在部分依赖,非主键列要完全依赖于主键。(主要是说在联合主键的情况下,非主键列不能只依赖于主键的一部分)

如下学生成绩表(score):

stu_id(学生id)、course_id(课程id)、score(分数)、course_name(课程名)

primary key(stu_id, course_id)

stu_id course_id score course_name
001 1011 88 高数3-1
001 1022 69 计算机组成原理
002 1011 92 高数3-1

表中主键为stu_id和course_id组成的联合主键。满足1NF;非主键列score完全依赖于主键,stu_id和course_id两个值才能决定score的值;而course_name只依赖于course_id,与stu_id没有依赖关系,它不完全依赖于主键,只依赖于主键的一部分,不符合2NF。

修改使表满足2NF后:

成绩表(score)   primary key(stu_id)

stu_id course_id score
001 1011 88
001 1022 69
002 1011 92

课程表(kc)   primary key(course_id)

course_id course_name
1011 高数3-1
1022 计算机组成原理

将原来的成绩表(score)拆分为成绩表(score)和课程表(kc),而且两个表都符合2NF。

第三范式是在满足第一范式和第二范式的基础上,规定表中的列不存在对非主键列的传递依赖。

传递依赖关系指的是:指的是在一个关系(表)中,一个非主键列依赖于另一个非主键列,而那个被依赖的列本身依赖于主键。

该表中,订单编号为主键,顾客名称依赖于顾客编号,这就是对非主键列的传递依赖。

修改之后应该如下:

相关推荐
bgy66663 分钟前
MariaDB 数据库 基础详解
数据库·mariadb
自动化监测Learner6 分钟前
QGIS 把geojson数据导入 PostgreSQL/PostGIS 的完整流程
数据库·postgresql
虎虎(_ _)。゜zzZ30 分钟前
Qdrant向量数据库工程实战
数据库·人工智能·大模型·向量数据库·rag·qdrant
ZGG0031 小时前
线程池详解:从 7 大参数到生产避坑
java·数据库·后端
龙亘川1 小时前
数智赋能退役军人服务:V1.0 系统搭建全生命周期闭环服务体系
大数据·数据库·人工智能
zhangguojia72 小时前
权限弹窗点击允许的授权流程
运维·服务器·数据库
jnrjian2 小时前
Postgres 序列(sequence)的权限
数据库·postgresql
风禾万里2 小时前
【无标题】
数据库
镜舟科技2 小时前
为什么 Text-to-SQL 总是停在 Demo?
数据库·sql·demo·text-to-sql·镜舟科技·mip·语义视图
人生苦短1282 小时前
Oracle RAC 日常管理+排错命令大全
数据库·oracle