mysql-210715-04---数据库设计三范式

mysql-210715-04—设计的范式


数据库设计的三范式

数据库三范式的目的就是解决数据冗余

在实际的开发中,以满足客户的需求为主,有时候会拿冗余换执行速度。

第一范式

数据库表中不能出现重复记录,每个字段是原子性的不能再分

不符合第一范式的示例

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

存在问题:

  • 最后一条记录和第一条重复(不唯一,没有主键)
  • 联系方式字段可以再分,不是原子性的
学生编号(pk)学生姓名email联系电话
1001张三zs@gmail.com1359999999
1002李四ls@gmail.com13699999999
1003王五ww@163.net13488888888

关于第一范式,每一行必须唯一,也就是每个表必须有主键,这是我们数据库设计的最基本要求,主要通常采用数值型或定长字符串表示,关于列不可再分,应该根据具体的情况来决定。如联系方式,为了开发上的便利行可能就采用一个字段了。


第二范式

第二范式是建立在第一范式基础上的,另外要求所有非主键字段完全依赖主键,不能产生部分依赖

多对多?	三张表,关系表两个外键
	学生表t_student
	教师表t_teacher
	学生与教师关系表t_student_teacher_relation
一个学生对应着多个老师,
一个老师对应着多个学生。

示例:

学生编号学生姓名教师编号教师姓名
1001张三001王老师
1002李四002赵老师
1003王五001王老师
1001张三002赵老师

确定主键:

学生编号(PK)教师编号(PK)学生姓名教师姓名
1001001张三王老师
1002002李四赵老师
1003001王五王老师
1001002张三赵老师

以上虽然确定了主键,但此表会出现大量的冗余,主要涉及到的冗余字段为“学生姓名”和“教师姓名”,出现冗余的原因在于,学生姓名部分依赖了主键的一个字段学生编号,而没有依赖教师编号,而教师姓名部门依赖了主键的一个字段教师编号,这就是第二范式部分依赖。

解决方案如下:

学生信息表

学生编号(PK)学生姓名
1001张三
1002李四
1003王五

教师信息表

教师编号(PK)教师姓名
001王老师
002赵老师

教师和学生的关系表

id(pk)学生编号(fk) fk->学生表的学生编号教师编号(fk) fk->教师表的教师编号
11001001
21002002
31003001
41001002

如果一个表是单一主键,那么它就复合第二范式,部分依赖和主键有关系

以上是一种典型的“多对多”的设计


第三范式

建立在第二范式基础上的,非主键字段不能传递依赖于主键字段。(不能产生传递依赖)

一对多?  两张表,多的表加外键
	班级t_class
	学生t_student
一个班级对应多个学生
学生编号(PK)学生姓名班级编号班级名称
1001张三01一年一班
1002李四02一年二班
1003王五03一年三班
100403一年三班

从上表可以看出,班级名称字段存在冗余,因为班级名称字段没有直接依赖于主键,班级名称字段依赖于班级编号,班级编号依赖于学生编号,那么这就是传递依赖,解决的办法是将冗余字段单独拿出来建立表,如:

学生信息表

学生编号(PK)学生姓名班级编号(FK)
1001张三01
1002李四02
1003王五03
100403

班级信息表

班级编号(PK)班级名称
01一年一班
02一年二班
03一年三班

以上设计是一种典型的一对多的设计,一存储在一张表中,多存储在一张表中,在多的那张表中添加外键指向一的一方的主键


一对一设计

一对一设计有两种方案:
	1)主键共享
	2)外键唯一
主键共享

t_user_login(用户登录表)
		----------------------------------------
        id(pk)		username		password
        ----------------------------------------
        1			zs				111
        2			ls				222

t_user_detail(用户详细信息表)
		-----------------------------------------------------
		id(pk+fk)		realname		tel			...
		-----------------------------------------------------
						张三			11111111111
  						李四			22222222222	
外键唯一

t_user_login(用户登录表)
        ----------------------------------------
        id(pk)		username		password
        ----------------------------------------
        1			zs				111
        2			ls				222

t_user_detail(用户详细信息表)
        ---------------------------------------------------------------------------------
        id(pk)		realname		tel				userid( fk + unique )		...
        ---------------------------------------------------------------------------------
                    张三			11111111111			2
                    李四			22222222222			1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值