一、五种范式
1.第一范式:原子性——表的每一列都是不可分割的原子数据项。就是每个字段的信息不能拆分啦(例如三年一班就要拆为三年级和一班)~
2.第二范式:数据表里的所有数据都要和该数据表的主键有完全依赖关系。所以不符合第二范式发生在表有2个或以上主键中。就是非主键字段必须可以由唯一的主键字段组合确定啦(笔者自己的理解哈)。
例如
不符合第二范式(院系不完全依赖主键(学号,课程),知道学号或课程其中一个就可以知道院系了)
学号 | 课程 | 成绩 | 院系 |
1 | c语言 | 90 | 计算机 |
2 | c语言 | 80 | 计算机 |
3 | c语言 | 85 | 计算机 |
4 | c语言 | 70 | 计算机 |
符合第二范式(成绩由主键(学号,课程)唯一确定)
学号 | 课程 | 成绩 |
1 | c语言 | 90 |
2 | c语言 | 80 |
3 | c语言 | 85 |
4 | c语言 | 70 |
3.第三范式——属性不能传递依赖于主属性(非主键字段不能相互依赖)就是每列都要与主键有直接关系啦
不符合第三范式:学生-学院表(学号,姓名,所在学院,学院地址)
符合第三范式:学生表(学号,姓名,所在学院编号)
学院表(学院编号,学院名,学院地址)
4.BCNF范式——不允许出现有主键的一部分被主键另一部分或者其他部分决定
不符合BCNF经典例子:仓库管理表(仓库ID, 存储物品ID, 管理员ID, 数量)
这个数据库表中存在如下决定关系:
(仓库ID, 存储物品ID) →(管理员ID, 数量)
(管理员ID, 存储物品ID) → (仓库ID, 数量)
所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是仓库管理表的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:
(仓库ID) → (管理员ID)
(管理员ID) → (仓库ID)
也就是说,(仓库ID, 存储物品ID)这个主键中的仓库ID可以被管理员ID决定,同样(管理员ID, 存储物品ID)中管理员ID也可以被仓库ID决定,所以此表应该拆分。
5、第四范式——完全一一对应关系
二、E-R图转换成关系模式
1.实体间的三种联系——1:1、1:n、m:n
(1)1:1间的转换:把任一实体的主键添加到另一实体中
(2)1:n间的转换:把1方实体的主键添加到n方实体中年
(3)m:n间的转换:两个实体各自转换成关系模式后,用两个实体中的主键和联系的属性生成另一个关系模式
eg:R1(学号,姓名,性别)
R2(课程编号,课程名,课程时间,课程地点)
R3(学号,课程编号,成绩)
三、数据库优化方法
1.设计符合三范式
2.适当添加索引(主键索引,唯一索引,普通索引,全文索引)
3.适当添加存储过程,触发器,事物等
4.读写分离(主从数据库)
5.SQL语句优化(尤其是查询语句)
6.分表、分区
(1)分表:
①垂直分割:
内容主表+附加表:内容主表存储各种数据的一些公共信息,比如数据的名称,添加时间等,可以使用多个附加表,附加表存储一些数据的独特的信息。
②水平分割:通过id取模实现
(2)分区:把表存储到磁盘不同区域
①好处:a.增强可用性
b.维护方便
c.均衡I/O
d.改善查询性能
②实现:CREATE TABLE 表名(列1,列2......) DISTRIBUTED BY(列名)
PARTITION BY RANGE(分区键)
(PARTITION 分区1名 START(分区键值1)INCLUSIVE,
PARTITION 分区2名 START(分区键值2)INCLUSIVE,
PARTITION 分区3名 START(分区键值3)INCLUSIVE,
......
END(分区键值n)EXCLUSIVE);