MySql学习笔记12——数据库设计三范式

数据库设计三范式

第一范式:要求任何一张表必须有主键,每一个字段原子性不可再分。

第二范式:建立在第一范式之上,要求所有非主键字段必须完全依赖主键,不能部分依赖

第三范式:建立在第二范式之上,要求所有非主键字段必须直接依赖主键,不要产生传递依赖

按照三范式设计数据库,可以避免表中数据的冗余,造成空间不必要的浪费。

三种基本关系:

第一范式

必须有主键,并且每一个字段都是原子性不可再分。

sql 复制代码
	学生编号 	学生姓名 		联系方式
	------------------------------------------
	1001		张三		zs@gmail.com,1359999999
	1002		李四		ls@gmail.com,13699999999
	1001		王五		ww@163.net,13488888888

不满足第一范式:没有主键,并且联系方式可再分

修改:

sql 复制代码
	学生编号(pk) 		学生姓名	  邮箱地址		   联系电话
	---------------------------------------------------------
	1001				张三		zs@gmail.com	1359999999
	1002				李四		ls@gmail.com	13699999999
	1003				王五		ww@163.net		13488888888

第二范式

要求所有非主键字段必须完全依赖主键,不要产生部分依赖。

sql 复制代码
	学生编号 		学生姓名  教师编号   教师姓名
-----------------------------------------------------
	1001			张三		001		王老师
	1002			李四		002		赵老师
	1003			王五		001		王老师
	1001			张三		002		赵老师

不满足第一范式:

sql 复制代码
	学生编号+教师编号(pk)		     学生姓名  		 教师姓名
	----------------------------------------------------
	1001			001				张三			王老师
	1002			002				李四			赵老师
	1003			001				王五			王老师
	1001			002				张三			赵老师

但是由于复合主键,导致部分依赖主键:"张三"依赖1001,"王老师"依赖001,显然产生了部分依赖。数据冗余了。空间浪费了。"张三"重复了,"王老师"重复了。

对于这种多对多关系,我们采取"建立三张表,关系表两外键"的方式

sql 复制代码
		学生表
		学生编号(pk)			学生名字
		------------------------------------
		1001					张三
		1002					李四
		1003					王五
		
		教师表
		教师编号(pk)		教师姓名
		--------------------------------------
		001					王老师
		002					赵老师

		学生教师关系表
		id(pk)				  学生编号(fk)			    教师编号(fk)
		------------------------------------------------------------
		1						1001						001
		2						1002						002
		3						1003						001
		4						1001						002

第三范式

要求所有非主键字典必须直接依赖主键,不要产生传递依赖。

sql 复制代码
	  学生编号(PK)        学生姓名   班级编号       班级名称
	---------------------------------------------------------
		1001				张三		01			一年一班
		1002				李四		02			一年二班
		1003				王五		03			一年三班
		1004				赵六		03			一年三班

一年一班依赖01,01依赖1001,产生了传递依赖。

对于这种一对多的关系,我们采取建立两张表,多的表加外键

sql 复制代码
		班级表:一
		班级编号(pk)				班级名称
		----------------------------------------
		01								一年一班
		02								一年二班
		03								一年三班

		学生表:多

		学生编号(PK)      学生姓名     班级编号(fk)
		-------------------------------------------
		1001				张三			01			
		1002				李四			02			
		1003				王五			03			
		1004				赵六			03	

总结

  • 一对多

    两张表,多的表加外键

  • 多对多

    三张表,关系表两个外键

  • 一对一

    对于一些巨大的表,需要对表进行拆分,拆成两张表,外键唯一

数据库设计三范式是理论上的。

实践和理论有的时候有偏差。

最终的目的都是为了满足客户的需求,有的时候会拿冗余换执行速度。

因为在sql当中,表和表之间连接次数越多,效率越低。(笛卡尔积)

有的时候可能会存在冗余,但是为了减少表的连接次数,这样做也是合理的,并且对于开发人员来说,sql语句的编写难度也会降低。

面试的时候把这句话说上:他就不会认为你是初级程序员了!

相关推荐
MonolithIoT1 小时前
实战方案|设备备件无人值守仓库:连续化产线运维备件 7×24 小时数字化管控方案
运维·网络·数据库
瞬间&永恒~2 小时前
【MySQL】4-6:在同一个主机上使用 systemd 运行多个 MySQL服务器
服务器·数据库·mysql
心机之蛙qee2 小时前
Redis的主从、哨兵及集群
数据库·redis·缓存
gwf2163 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
AAA@峥3 小时前
CentOS7 源码编译安装 MySQL5.7|SQL 基础操作 + 备份恢复完整实战
运维·数据库·sql·centos
xixingzhe23 小时前
spring ai简单使用skills
数据库·人工智能·spring
caimouse3 小时前
protoc-gen-c 支持 proto3 `optional` 关键字修改记录
c语言·学习
憧憬成为java架构高手的小白3 小时前
黑马八股--中间件学习之MQ(RabbitMQ)
学习·中间件
Fu2067213 小时前
数据库第三次作业
数据库
AI多Agent协作实战派4 小时前
AI多Agent协作系统实战(二十三):Agent读HEARTBEAT.md不读AGENTS.md——openclaw的文件加载之谜
前端·数据库·人工智能·uni-app