正文开始 ----------
1. 数据库三大范式🙊
1)范式
必须保证数据库设计的合理性
数据库设计关系整个系统的架构,关系到后续开发效率和运行效率
数据库的设计主要包含了设计表结构和表之间的联系
什么是合理的数据库 ?
结构合理
冗余较小
尽量避免插入删除时修改异常
如何才能保证数据库设计水平
遵循一定的规则
在关系型数据库中这种规则就称为 范式。
• 什么是范式(NF= NormalForm)
范式是符合某一种设计要求的总结。
要想设计一个结构合理的关系型数据库,必须满足一定的范式。
2)范式分类
第一范式
• 第二范式
• 第三范式
• 各个范式是依次嵌套包含的
• 范式越高,设计质量越高,在现实设计中也越难实现
• 一般数据库设计,只要达到第三范式,即可避免异常的出现
3)第一范式
要求
最基本的范式
第一范式要求数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值
简单来说就是要确保数据的原子性。
第一范式的合理遵循需要根据系统的实际需求来定
• 示例
用户表(用户名,家庭地址)
用户表(用户名,省,城市,详细地址)
系(系名称,系主任,系高级职 称人数)
系(系名称,系主任,系教授人数,系副教授人数)
比方说学生信息:
字段名 | 值 | 字段名 | 值 | 字段名 | 值 | 字段名 | 值 |
姓名 | 张三 | 性别 | 男 | 民族 | 汉 | 出生日期 | 2000年x月x日 |
又比方说用户地址栏,一般情况下我们用一个varchar列来表示,其中值如下
字段名 | 值 |
家庭住址 | 湖北省武汉市武昌区某某街某某号 |
如果有相应的业务要求,这个字段就可以按第一范式进行拆分,这样在针对地址进行检索时更加精确方便
字段名 | 值 | 字段名 | 值 | 字段名 | 值 | 字段名 | 值 |
省份 | 湖北省 | 地市 | 武汉市 | 区名 | 武昌区 | 街道名 | 某某街道 |
若某一列有多个值,可以将该列单独拆分成一个实体,新实体和原实体间是一对多的关系。
比如:学生选课
张三选了计算机、高数、英语三门课。使用一个字段存放,这就违反了范式。
字段名 | 值 | 字段名 | 值 |
姓名 | 张三 | 成绩 | 计算机80,英语90,高数70 |
应该设计学生选课表,并对学生信息表产生1对多的关联
字段名 | 值 | 字段名 | 值 |
学生编号 | 123 | 学生姓名 | 张三 |
字段名 | 值 | 字段名 | 值 |
学科编号 | s1 | 学科名称 | 计算机 |
学科编号 | s2 | 学科名称 | 英语 |
学科编号 | s3 | 学科名称 | 高数 |
字段名 | 值 | 字段名 | 值 | 字段名 | |
学生编号 | 123 | 学科编号 | s1 | 成绩 | 80 |
学生编号 | 123 | 学科编号 | s2 | 成绩 | 90 |
学生编号 | 123 | 学科编号 | s3 | 成绩 | 70 |
在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
4)第二范式
要求
第二范式需要确保数据库表中的每一列都和主键相关,而不能只有一部分和主键相关(主要针对联合主键而言)。
即在一个数据库表中只能保存一种数据,不可以把多种数据保存到同一张表中。
实例
学号和课程编号作为联合主键
课程名称只依赖于课程编号,而和学号没有关系
解决
提取出学生表
提取成课程表
提取选课表,存放选课记录
学生表 选课表 课程表
5)第三范式
要求
第三范式确保数据表中的每一列数据都与主键相关,而不能间接相关。
属性不依赖其他非主属性.
示例1:学生班级表
学号(主键) | 学生姓名 | 班级编号 | 班级名称 | 班级信息 |
023145 | 张三 | 987654 | 3班 | 特招班 |
023146 | 李四 | 987654 | 3班 | 特招班 |
023147 | 王五 | 987655 | 4班 | 普通班 |
023258 | 赵六 | 987654 | 3班 | 特招班 |
完善之后的方案:
学号(主键) | 学生姓名 | 班级编号 |
023145 | 张三 | 987654 |
023146 | 李四 | 987654 |
023147 | 王五 | 987655 |
023258 | 赵六 | 987654 |
班级编号(主键) | 班级名称 | 班级信息 |
987654 | 3班 | 特招班 |
987655 | 4班 | 普通班 |
示例2: 订单明细表
编号(主键) | 图书id | 图书名称 | 价格 | 作者 | 出版社 | 出版日期 | 数量 |
023145 | 1 | 精通Java | 60.00 | 张三 | 清华出版社 | 2007 | 1 |
023146 | 2 | Oracle | 65.00 | 李四 | 机械出版社 | 2009 | 1 |
023147 | 3 | JSP | 87 | 王五 | 电子出版社 | 2014 | 3 |
023258 | 1 | 精通Java | 60.00 | 张三 | 清华出版社 | 2007 | 2 |
023259 | 2 | Oracle | 65.00 | 李四 | 机械出版社 | 2009 | 3 |
完善之后的方案:分割成图书表和订单表两种表
图书id | 图书名称 | 价格 | 作者 | 出版社 | 出版日期 |
1 | 精通Java | 60.00 | 张三 | 清华出版社 | 2007 |
2 | Oracle | 65.00 | 李四 | 机械出版社 | 2009 |
3 | JSP | 87 | 王五 | 电子出版社 | 2014 |
4 | Struts2 | 56 | 赵六 | 清华出版社 | 2005 |
编号(主键) | 图书id | 数量 |
023145 | 1 | 1 |
023146 | 2 | 1 |
023147 | 3 | 3 |
023258 | 2 | 2 |
023259 | 2 | 3 |
6)范式的优缺点
优点
结构合理
冗余较小
尽量避免插入删除修改异常
• 缺点
性能降低
多表查询比单表查询速度慢
数据库的设计应该根据当前情况和需求做出灵活的处理。
在实际设计中,要整体遵循范式理论。
如果在某些特定的情况下还死死遵循范式也是不可取的,因为可能降低数据库的效率,此时可以适当增加冗余而提高性能。
• 示例:
比如经常购物车条目的中除了条目编号,商品编号,商品数量外,可以增加经常使用的商品名称,商品价格等
图书表
图书id | 图书名称 | 价格 | 作者 | 出版社 | 出版日期 |
1 | 精通Java | 60 | 张三 | 清华出版社 | 2007 |
2 | Oracle宝典 | 65 | 李四 | 机械出版社 | 2009 |
3 | JSP | 87 | 王五 | 电子出版社 | 2014 |
4 | Struts2 | 56 | 赵六 | 清华出版社 | 2005 |
订单表中增加冗余列图书名称、价格,以空间换时间。
编号(主键) | 图书id | 图书名称 | 价格 | 数量 |
023145 | 1 | 精通Java | 60 | 1 |
023146 | 2 | Oracle宝典 | 65 | 1 |
023147 | 3 | JSP | 87 | 3 |
023258 | 1 | 精通Java | 60 | 2 |
7)总结
范式是指导数据库设计的规范化原则,可以保证数据库的设计质量。
第一范式 : 字段不能再分。
第二范式 : 不存在局部依赖(要和主键相关)。
第三范式: 不包含传递依赖(间接依赖)。
使用范式可以减少冗余,但是会降低性能。
特定的表可以违反第三范式,但是可以增加其性能。
2. ER图与实体🍢
ER图是我们建立概念数据模型的工具
数据模型是现实世界中数据特征的抽象。数据模型应该满足三个方面的要求:
01 能够比较真实地模拟现实世界
02 容易为人所理解
03 便于计算机实现
概念数据模型也称信息模型,它以实体-联系(Entity-RelationShip,简称E-R)理论为基础,并对这一理论进行了扩充。它从用户的观点出发对信息进行建模,主要用于数据库的概念级设计。
ER图图例
ER图分为实体、属性、关系三个核心部分。实体是长方形体现,而属性则是椭圆形,关系为菱形。
ER图的**实体(entity)**即数据模型中的数据对象,例如人、学生、音乐都可以作为一个数据对象,用长方体来表示,每个实体都有自己的实体成员(entity member)或者说实体对象(entity instance),例如学生实体里包括张三、李四等,实体成员(entity member)/实体实例(entity instance) 不需要出现在ER图中。
ER图的**属性(attribute)**即数据对象所具有的属性,例如学生具有姓名、学号、年级等属性,属性分为唯一属性( unique attribute)和非唯一属性,唯一属性指的是唯一可用来标识该实体实例或者成员的属性,用下划线表示,一般来讲实体都至少有一个唯一属性。
ER图的**关系(relationship)**用来表现数据对象与数据对象之间的联系,例如学生的实体和成绩表的实体之间有一定的联系,每个学生都有自己的成绩表,这就是一种关系。
ER图中关联关系有三种:
1对1(1:1) :1对1关系是指对于实体集A与实体集B,A中的每一个实体至多与B中一个实体有关系;反之,在实体集B中的每个实体至多与实体集A中一个实体有关系。
1对多(1:N) :1对多关系是指实体集A与实体集B中至少有N(N>0)个实体有关系;并且实体集B中每一个实体至多与实体集A中一个实体有关系。
多对多(M:N) :多对多关系是指实体集A中的每一个实体与实体集B中至少有M(M>0)个实体有关系,并且实体集B中的每一个实体与实体集A中的至少N(N>0)个实体有关系。
ER的实 实体还会细分为弱实体和强实体:
弱实体:一个实体必须依赖于另一个实体存在,那么前者是弱实体,后者是强实体,弱实体必须依赖强实体存在,例如上图的学生实体和成绩单实体,成绩单依赖于学生实体而存在,因此学生是强实体,而成绩单是弱实体。
弱实体和强实体的联系必然只有1:N或者1:1,这是由于弱实体完全依赖于强实体,强实体不存在,那么弱实体就不存在,所以弱实体是完全参与联系的,因此弱实体与联系之间的联系也是用的双线菱形。
**复合实体:**复合实体也称联合实体或桥接实体,常常用于实现两个或多个实体间的M:N联系,它由每个关联实体的主玛组成,用长方体内加一个菱形来表示。
下图就是一个典型的复合实体,因为只是举例,相对粗糙,用户和商品两个实体是M:N的关系,中间又订单这个实体联系,因此订单这个实体是一个复合实体,同时如果用户 实体不存在,就没有订单实体的存在,因此对于用户实体来讲订单是弱实体,同理商品实体如果不存在,同样不存在订单实体,因此对商品实体而言订单是弱实体,具体如图:
ER物理模型与数据建模
上面说的原生ER图,主要用于模型分析,实际上我们更常用的ER图的物理模型。
这里是一个在线免费ER图绘制网站,https://www.freedgo.com/erd-index.html,我们用这个工具来讲解一下ER图的分析绘制、及导出成SQL的过程。
进入页面,可以点击“格式”按钮,展现图例菜单。
我们可以选择实体关系/MySQL下的图标来完成学生班级课程模型模型。