数据库结构优化的目的
- 减少数据冗余
- 尽量避免数据维护中出现更新,插入和删除异常
插入异常:表中的某个实体随着另一个实体而存在
更新异常:如果更改表中的某个实体的单独属性时,需要对多行进行更新
删除异常:如果删除表中的某一实体则会导致其它实体的消失
- 节约数据空间
- 提高查询效率
数据库结构设计的步骤
- 需求分析
1. 全面了解产品设计的存储需求
2. 存储需求
3. 数据处理需求
4. 数据的安全性和完整性
- 逻辑设计
1. 设计数据的逻辑与存储结构
2. 数据实体之间的逻辑关系,解决数据冗余和数据维护异常
- 根据所使用的数据库特点进行表结构设计
- 维护优化
根据实际情况对索引,存储结构等进行优化
范式
一般满足前三个范式
第一范式
1. 数据库表中所有字段都只有单一属性
2. 单一属性的列是由基本的数据类型所构成的
3. 设计出来的表都是简单的二维表
第二范式
要求一个表中只具有一个业务主键,也就是说符合第二范式的表中不能存在非主键列只对部分主键的依赖关系
第三范式
指每一个非主属性即不部分依赖也不传递依赖于业务主键。在第二范式的基础上消除了非主属性对主键的传递依赖
字段数据类型设计
首先考虑数字类型,其次是日期或二进制类型,最后是字符类型。
列类型 | 存储空间 | 是否精确类型 |
---|---|---|
float | 4个字节 | 否 |
double | 8个字节 | 否 |
decimal | 每4个字节存9个数字,小数点占一个字节 | 是 |
varchar 最大长度(65535)
varchar
1. varchar用于存储变长字符串,只占用必要的存储空间
2. 列的最大长度小于255则只占用一个额外字节用于记录字符串长度
3. 列的最大长度大于55则要使用两个额外字节用于记录字符串长度
varchar 长度的选择问题
1. 使用最小的符合需求的长度
2. varchar(5) 和 varchar(200)存储 'abcde'字符串性能不同
varchar 适用场景
1. 字符串列的最大长度比平均长度大很多
2. 字符串很少被更新
3. 使用了多字节字符集存储字符串
char
char
1. char类型是定长的
2. 字符串存储在char类型的列中会删除末尾的空格(varchar不会删除)
3. char类型的最大宽度为255
适合场景
1. 适合存储索长度近似的值
2. 适合存储短字符串
3. 适合存储经常被更新的字符串列
日期类型
datatime类型
datetime = YYYY-MM-DD HH:II:SS
datetime(6) = YYYY-MM-DD HH:II:SS.fraction
datetime 类型与时区无关,占用8个字节的存储空间
时间范围 1000-01-01 00::00:00 到 9999-12-31 23:59:59
TIMESTAMP类型
存储时间戳(记得之前一直用varchar类型)
时间戳类型占4个字节
时间范围1970-01-01 到 2038-01-19
timestamp类型显示依赖于所指定的时区
在行的数据修改时,可以自动修改timestamp列的值
date类型 YYYY-MM-DD
1. 占用的字节比使用字符串、datetime、int存储要少,使用date类型只需要3个字符串
2. 使用date类型还可以使用日期的时间函数进行日期之间的计算
时间范围 1000-01-01 --- 9999-12-31
time类型 HH:MM:SS 可存储微秒
存储时间数据的注意事项
1. 不要使用字符串类型来存储日期时间数据
1. 日期时间类型通常比字符串占用的存储空间小
2. 日期时间类型在进行查找过滤时可以利用日期来进行对比
3. 日期类型有着丰富的处理函数,可以方便的对时间类型进行日期计算
2. int存储日期时间不如使用timestamp类型