栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Java

数据库设计三范式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据库设计三范式

数据库设计三范式 一、什么是设计范式?

数据冗余

我们在设计数据库时如果如果不按照一定的规范去设计很容易会出现数据冗余,即有多余的数据重复重现,浪费内存。
例如:学生-老师的表设计如下

snosnametnotnamet_tel
001李四002黄老师138****90
002王五001张老师137****23
003赵柳002黄老师138****90
004宋毅001张老师137****23

如果这样设计,因为一个老师对应很多个学生,所以老师的id和他的相关信息就要重复存很多次,造成资源浪费。
为了解决这个问题,可以使用三范式(3NF),它是设计表的依据,按照这个三范式设计的表不会出现数据冗余。

二、三范式都有哪些

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

首先是主键,主键是表的行的唯一标识的关键字。举个例子,如下面的表

idnamehobbytel
001李四游泳138****90
002王五跑步137****23
001赵柳跑步138****90
002宋毅漫画137****23

id就是这张表的主键,001可以标识第一行的数据。通俗点说就是,id是001的只有李四,然后可以根据id为001来选择我们所需的name,hobby或tel的信息。但是如果用habit做主键,并不能唯一标识这一行的数据,如hobby为跑步的,不仅仅是王五,赵柳也是,所以如果hobby不能是主键,因为它没办法标识某一行。姓名也不行,因为会有重名的存在。

主键一般是一个,也有多个的复合主键。

其次是每一个字段原子性不可再分,就是每一列都是不可再分的,例如:

idnamehobby联系方式
001李四游泳138*90,30222@qq.com
002王五跑步137*23,30222@qq.com
001赵柳跑步138*90,30222@qq.com
002宋毅漫画137*23,30222@qq.com

这个样子就不符合原子性,因为联系方式还可以划分为电话和邮箱。但是不要钻牛角尖(因为当时我就是)认为,姓名也可以拆分呀,拆成姓和名。虽然是可以,但是没有必要,意义不大。

表的设计满足有主键,并且每一列需要符合原子性,则称为满足第一范式。

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

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

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

解决方法:将表格拆分为两张基础表和一张练习表

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

关系表

学生编号(PK) fk学生表的学生编号教师编号(PK) fk教师表的教师编号
1001001
1002002
1003001
1001002

第三范式:建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖

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

从上表可以看出,班级名称字段存在冗余,因为班级名称字段没有直接依赖于主键,班级名称字段依赖于班级编号,班级编号依赖于学生编号,那么这就是传递依赖。

解决的办法是将冗余字段单独拿出来建立表,如

学生信息表

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

班级信息表

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

三范式总结

第一范式:有主键,具有原子性,字段不可分割
第二范式:完全依赖,没有部分依赖
第三范式:没有传递依赖
数据库设计尽量遵循三范式,但是还是根据实际情况进行取舍,有时可能会拿冗余换速度,最终用目的要满足客户需求。

三、常见表设计方法

一对一:主键共享和外键唯一

  1. 主键共享

t_user_login 用户登录表

id(pk)usernamepassword
1zs123
2ls456

t_user_detail 用户详细信息表

id(pk+fk)realnametel
1张三138***90
2李四168***44
  1. 外键唯一
    t_user_login 用户登录表
id(pk)usernamepassword
1zs123
2ls456
id(pk+fk)realnameteluserid(fk+unique)
1张三138***901
2李四168***442

一对多

如班级和学生就是一对多的情况,设计思路是两张基础表,多的加外键

班级t_class

cno(pk)cname
1班级一
2班级二

学生t_student

sno(pk)snameclassno(fk)
101张11
102张21
103张32
104张42
105张52

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

多对多

两张基础表,一张关系表,两个外键

t_student学生表

sno(pk)sname
1张三
2李四
3王五

t_teacher 讲师表

tno(pk)tname
1王老师
2张老师
3李老师

t_student_teacher_relation 学生讲师关系表

id(pk)sno(fk)tno(fk)
113
211
322
423
531
633
转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1039447.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号