【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。

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

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

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

修改之后应该如下:

相关推荐
啦啦啦_99991 分钟前
Redis-0-业务逻辑
数据库·redis·缓存
自不量力的A同学33 分钟前
Redisson 4.2.0 发布,官方推荐的 Redis 客户端
数据库·redis·缓存
Exquisite.36 分钟前
Mysql
数据库·mysql
全栈前端老曹1 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
R1nG8631 小时前
CANN资源泄漏检测工具源码深度解读 实战设备内存泄漏排查
数据库·算法·cann
阿钱真强道1 小时前
12 JetLinks MQTT直连设备事件上报实战(继电器场景)
linux·服务器·网络·数据库·网络协议
逍遥德2 小时前
Sring事务详解之02.如何使用编程式事务?
java·服务器·数据库·后端·sql·spring
笨蛋不要掉眼泪2 小时前
Redis哨兵机制全解析:原理、配置与实战故障转移演示
java·数据库·redis·缓存·bootstrap
Coder_Boy_2 小时前
基于SpringAI的在线考试系统-整体架构优化设计方案
java·数据库·人工智能·spring boot·架构·ddd
fen_fen10 小时前
Oracle建表语句示例
数据库·oracle