MySQL 学习笔记
MySQL
三大范式
关系数据库中的关系必须满足一定的要求,即满足不同的范式。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。
第一范式
1NF 是对属性的原子性,要求属性具有原子性,不可再分解。
表:字段 1、字段 2(字段 2.1、字段 2.2)、字段 3 …
如学生(学号,姓名,性别,出生年月日),如果认为最后一列还可以再分成(出生年,出生月,出生日),它就不是一范式了,否则就是;
第二范式
2NF 是对记录的唯一性,要求记录有唯一标识,即实体的唯一性,即不存在部分依赖。
表:学号、课程号、姓名、学分;
这个表明显说明了两个事务:学生信息,课程信息;由于非主键字段必须依赖主键,这里学分依赖课程号,姓名依赖学号,所以不符合二范式。
可能会存在的问题:
- 数据冗余:每条记录都含有相同信息;
- 删除异常:删除所有学生成绩,就把课程信息全删除了;
- 插入异常:学生未选课,无法记录进数据库;
- 更新异常:调整课程学分,所有行都调整
正确做法:
- 学生:Student(学号,姓名);
- 课程:Course(课程号,学分);
- 选课关系:StudentCourse(学号,课程号,成绩)。
第三范式
3NF 是对字段的冗余性,要求任何字段不能由其他字段派生出来,它要求字段没有冗余,即不存在传递依赖。
表:学号,姓名,年龄,学院名称,学院电话
因为存在依赖传递:(学号) ➡ (学生) ➡ (所在学院) ➡ (学院电话)。
可能会存在问题:
- 数据冗余:有重复值;
- 更新异常:有重复的冗余信息,修改时需要同时修改多条记录,否则会出现数据不一致的情况。
正确做法:
学生:(学号,姓名,年龄,所在学院);
学院:(学院,电话)。
反范式化
一般来说,数据库只需要满足第三范式(3NF)就行了。
没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余,达到以空间换时间的目的
。
〖例〗:有一张存放商品的基本表,“金额”这个字段的存在,表明该表的设计不满足第三范式,因为 “金额” 可以由 “单价” 乘以 “数量” 得到,说明 “金额” 是冗余字段。但是,增加 “金额” 这个冗余字段,可以提高查询统计的速度,这就是以空间换时间的作法。
在 Rose 2002
中,规定列有两种类型:数据列和计算列。“金额”这样的列被称为 “计算列”,而“单价” 和“数量”这样的列被称为“数据列”。
范式化设计和反范式化设计的优缺点
优点 | 缺点 | |
---|---|---|
范式化 | 1. 可以尽量的减少数据冗余,数据表更新快体积小 < br />2. 范式化的更新操作比反范式化更快 < br />3. 范式化的表通常比范式化更小 | 1. 对于查询需要对多个表进行关联,导致性能降低 < br />2. 更难进行索引优化 |
反范式化 | 1. 可以减少表的关联 < br />2. 可以更好的进行索引优化 | 1. 存在数据冗余及数据维护异常 < br />2. 对数据的修改需要更多的成本 |
事务管理(ACID)
谈到事务一般都是以下四点
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency)
事务前后数据的完整性必须保持一致。
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
举个简单的例子理解以上四点
原子性(Atomicity)
针对同一个事务
这个过程包含两个步骤:
A:800 - 200 = 600
B:200 + 200 = 400
原子性表示,这两个步骤一起成功,或者一起失败,不能只发生其中一个动作
一致性(Consistency)
针对一个事务操作前与操作后的状态一致
操作前 A:800,B:200
操作后 A:600,B:400
一致性表示事务完成后,符合逻辑运算
持久性(Durability)
表示事务结束后的数据不随着外界原因导致数据丢失
操作