数据库结构优化的目的
【减少数据冗余】
【避免数据库维护中出现更新,插入,删除异常】
【节约数据的存储空间】
【提高查询效率】
数据库设计步骤
【需求分析】: 全面了解产品设计的存储需求
存储需求
数据处理需求
数据安全性和完整性
【逻辑设计】: 设计数据的逻辑存储结构
数据实体之间的逻辑关系,解决数据冗余和数据维护异常
【物理设计】:根据所使用的数据库特点进行表结构设计
关系型数据库 :oralce,mysql,sqlserver
非关系型数据库:mongo,redis
存储引擎:
【维护优化】:根据实际情况对索引,存储结构进行优化
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
数据库设计范式
【第一范式】:
1.数据库中的所有字段都只具有单一属性
2.单一属性的列是由基本的数据类型所构成的
3.设计的表都是简单的二维表
【第二范式】:一个表中只具有一个业务主键,也就是说符合第二范式的表中不能存在非主键列 只对部分主键的依赖
【第三范式】:每一个非主属性既不部分依赖,也不传递依赖于业务主键,也就是在第二范式基础上消除了非主属性对主键的传递依赖
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
数据库反范式化设计:使用存储空间换区更小的时间
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
物理设计:
【定义数据库,表,字段命名规范】
【选择合适的存储引擎】
myisam:非事务,支持并发插入的表级锁
【为表中的字段选择合适的数据类型】
当一个列可以选择多种数据类型时,应该优先考虑数字类型,其次是日期或是二进制类型,最后是字符型。
对于相同级别的数据类型,应优先选择占用空间小的数据类型
【正确选择整数类型】
类型 存储空间 取值范围
tinyint 1字节 255
samllint 2字节 65535
mediumint 3字节 16777215
int 4字节 4293967295
bigint 8字节 18446744073709551615
【正确选择实数类型】
(非精确)float 4字节
(非精确)double 8字节
(精确)decimal 每4字节存9个数字,小数点占一个字节
【varchar和char】
varchar: 1.字符串最大长度比平均长度大很多
2.字符串很少被更新
3.使用了多字节字符集存储字符串(中文,utf8)
varchar用于存储变长字符串的,只占用必要的存储空间。字符为单位,1字符=3字节。
列的最大长度小于255则只占用1个额外字节记录字符串长度
列的最大长度大于255则要占用2个额外字节记录字符串长度
【如何确定varchar宽度】:
使用最小的符合需求的长度
varchar(5)和varchar(255)存储mysql字符串性能不同(会消耗内存)
char: 1.长度近似
2.短字符串
3.经常更新的字符串列
类型是定长的(char(50),哪怕只存了1个字符,也在内存中消耗50)
字符串存储char类型的列中会删除末尾空格
最大宽度255
【存储日期数据】: 不要使用字符串存储日期
日期类型比字符串空间小
日期类型在查找过滤时可以用日期进行对比
日期类型有丰富的处理函数
需求时间范围满足的情况下,使用timestamp格式存储时间戳
datetime: 同市区无关,占用8个字节的存储空间
YYYY-mm-dd HH:II:ss
timestamp: 依赖所指定的时区。时间戳,占用4个字节
date: 保留日期部分(3个字节) YYYY-mm-dd
time: 保留时间部分()HH:MM:SS
【为innodb选择主键】
1.主键尽可能小
2.主键应该是顺序增长