1.总览
- 范式(1NF, 2NF ,3NF) 和各自的作用
- 设计一个数据库
- 数据存储和查询
- 事务管理
- mysql中的存储引擎 myisam 和 innoDB
- 分布式数据库
2.范式
什么是范式?
一个场景给你 怎么来把表设计好, 初学者一般都会把所有的东西都堆在一个表里面.
在一个表有什么问题? 这个一般都会有修改困难,(修改 自己的名字,需要全部都要修改) 插入困难,删除困难
那么为了解决这些问题就出现了范式 .
范式越高. 数据的冗余程度越低, 同样的 修改困难,插入困难 ,删除困难,等等这些问题就越少.
规范化的过程: 将大的表通过投影的方法,切分成很多张小的表. 通过这些表中的 公共的关联列, 通过自然连接 还原出大的表.
- 第一范式(1NF): 所有属性(列)均为简单属性, 每个属性都是不可再分的.
- 第二范式(2NF): 消除部分 子函数依赖.
- 第三范式(3NF): 属性不依赖于其它非主属性。不存在传递函数依赖
第一范式很容易理解,简单来说就是每个表里面的属性都是要是不可再分的, 也不能存在一个列里面有多个属性那种.
第二范式, 是建立在第一范式上面, 同时要消除部分子函数依赖,子函数依赖? 是什么?(就是关键词,比如码 ,码组合中 各自可以对应 不同的属性)
比如:(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)这个数据库表不满足第二范式,因为存在如下决定关系:(课程名称) → (学分)(学号) → (姓名, 年龄)
这些都是子函数依赖. 如果不满足第二范式的时候就可能出现一些列的问题.
- 数据冗余: 同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。
- 更新异常: 若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。
- 插入异常: 假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。
- 删除异常: 假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。
第三范式: 在第三范式中不应该存在
关键字段 → 非关键字段x → 非关键字段y
不满足第三范式也会存在数据冗余、更新异常、插入异常和删除异常的情况