良好的数据库逻辑设计和物理设计是数据库获得高性能的基础
1. 数据库结构优化的目的
- 减少数据冗余
- 尽量避免数据维护中出现更新,插入和删除异常
- 插入异常:如果表中的某个实体随着另一个实体而存在
- 更新异常:如果更改表中某个实体的单独属性时,需要对多行进行更新
- 删除异常:如果删除表中的某一个实体,则会导致其他实体的消失
- 节约数据库的存储空间
2. 数据库设计步骤
- 需求分析:全面了解产品设计的存储需求、数据处理需求、数据安全性和完整性
- 逻辑设计:设计数据的逻辑存储结构,数据实体之间的逻辑关系,解决数据冗余和数据维护异常
- 物理设计:根据所使用的数据库特点进行表结构的设计。
- 关系型数据库:Orcle、SQLServer、MySQL、postgresSql
- 非关系型数据库:MongoDB、Redis、Hadoop
- 存储引擎:InnoDB、MyISAM
- 维护优化:根据实际情况对索引、存储结构等进行优化
3. 数据库设计范式
设计出没有数据冗余和数据维护异常的数据库结构
1. 数据库设计的第一范式
- 数据库表中的所有字段都只具有单一属性
- 单一属性的列是由基本的数据类型所构成
- 设计出来的表都是简单的二维表
2. 数据库设计的第二范式
- 要求一个表中只具有一个业务主键,也就是说符合第二范式的表中不能存在非主键列只对部分主键的依赖关系。
3. 数据库设计的第三范式
- 指每一个非主属性既不部分依赖也不传递依赖于业务主键,也就是在第二范式的基础上消除了非主属性对主键的传递依赖。
4. 范式化设计的优缺点
优点:
- 可以尽量的减少数据冗余
- 范式化的更新操作比反范式化更快
- 范式化的表通常比反范式化更小
缺点:
- 对于查询需要对多个表进行关联
- 更难进行索引优化
5. 反范式化设计
反范式化是针对范式化而言的,为了性能和读取效率的考虑而适当的对数据库设计范式的要求进行违反,而允许存在少量的数据冗余,换而言之,就是空间换时间。
6. 反范式化的优缺点
优点:
- 可以减少表的关联
- 可以更好的进行索引优化
缺点:
- 存在数据冗余及数据维护异常
- 对数据的修改需要更多的成本
4. 字符串类型的选择
当一个列可以选择多种数据类型时,应该优先考虑数字类型,其次是日期或二进制类型,最后才是字符类型。
对于同级别的数据类型,优先选用占用空间小的数据类型。
1. 选择VARCHAR和CHAR类型
- VARCHAR用于存储边长字符串,只占用必要的存储空间。(UTF-8一个字符占用三个字节)(VARCHAR是以字符为单位)
- 列的最大长度小于255则只占用一个额外字节用于记录字符串长度
- 列的最大长度大于255则要占用两个额外字节用于记录字符串长度
2. VARCHAR适合场景
- 字符串列的最大长度比平均长度大很多
- 字符串列很少被更新
- 使用了多字节字符集存储字符串
3. 如何选择VARCHAR
- 使用最小的符合需求的长度
- VARCHAR(5)和VARCHAR存储字符串性能不同
4. CHAR类型存储特点
- CHAR类型时定长
- 字符串存储在CHAR类型的列中会删除末尾的空格
- CHAR类型的最大宽度为255
5. CHAR适合场景
- CHAR类型适合存储长度近似的值(比如固定的手机号,身份证号码)
- CHAR适合存储短字符串(比如男,女)
- CHAR适合存储经常被更新的字符串列
4. 日期类型的选择
1. DATATIME类型
- DATATIME类型与时区无关
- 占用8个字节存储空间
2. TIMESTAMP类型
- 时间戳,以
YYYY-MM-DD HH:MM:SS.[微秒]格式显示 - 占用4字节
- 时间范围只能保存1970-01-01到2038-01-19
- 依赖时区
3. DATE类型和TIME类型
- 比如存储用户生日,选择DATE即可
DATE优点 - 占用字节数比字符串、datetime、int要少
- date只占3个字节
- 使用Date类型还可以使用日期时间函数进行日期之间的计算
注意事项 - 不要使用字符串类型来存储日期时间数据
- 使用Int存储日期时间不如Timestamp类型