MySql的复习(十):数据库的三大范式

MySql的复习(十):数据库的三大范式

设计范式:

设计表的依据。按照这三个范式设计的表不会出现数据冗余。

第一范式

  • 任何一张表都应该有主键,并且每一个字段原子性不可再分。

不符合第一范式的示例

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

问题所在

  1. 最后一条记录和第一条重复。没有主键
  2. 联系方式字段可以再分,不是原子性

正确表示

学生编号(pk)学生姓名email联系电话
1001张三zs@gmail.com1359999999
1002李四ls@gmail.com13699999999
1003王五ww@163.net13488888888

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

第二范式

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

示例

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

确定主键

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

问题:学生姓名部分依赖了主键的一个字段学生编号,而没有依赖教师编号,而教师姓名部门依赖了主键的一个字段教师编号,这就是第二范式部分依赖。

解决方案

  1. 学生信息表
学生编号(PK)学生姓名
1001张三
1002李四
1003王五
  1. 教师信息表
教师编号(PK)教师姓名
001王老师
002赵老师
  1. 教师和学生关系表
学生编号(PK) fkà学生表的学生编号教师编号(PK) fkà教师表的教师编号
1001001
1002002
1003001
1001002

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

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

第三范式

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

示例

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

问题:

班级名称字段存在冗余,因为班级名称字段没有直接依赖于主键,班级名称字段依赖于班级编号,班级编号依赖于学生编号,那么这就是

传递依赖,解决的办法是将冗余字段单独拿出来建立表。

解决方案

  1. 学生信息表
学生编号(PK)学生姓名班级编号(FK)
1001张三01
1002李四02
1003王五03
100403
  1. 班级信息表
班级编号(PK)班级名称
01一年一班
02一年二班
03一年三班

一对多的设计,一存储在一张表中,多存储在一张表中,在多的那张表中添加外键指向一的一方的主键

总结

第一范式:有主键,具有原子性,字段不可分割

第二范式:完全依赖,没有部分依赖

第三范式:没有传递依赖

数据库设计尽量遵循三范式,但是还是根据实际情况进行取舍,有时可能会拿冗余换速度,最终用目的要满足客户需求。

一对一设计

主键共享

t_user_login 用户登陆表
id(pk)       username        password
----------------------------------------
 1             zs                123
 2             ls                456
 t_user_detail 用户详细信息表
 id(pk+fk)         realname          tel          ...
 ----------------------------------------------------
 1              张三            11111111112234
 2	            李四            12112523432412

外键唯一

t_user_login 用户登陆表
id(pk)       username        password
----------------------------------------
 1             zs                123
 2             ls                456
 t_user_detail 用户详细信息表
  id(pk)         realname          tel            userid(fk+unique)      
 ----------------------------------------------------
   1                张三         111111114          2
   2	            李四         121432412          1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值