3.数据库结构优化,设计,范式介绍
1.数据库路结构优化目的
(1)减少数据冗余
(2)尽量避免数据维护中出现更新,插入和删除异常
插入异常:如果表中的某个实体随着另一个实体而存在;
更新异常:如果更改表中的某个实体的单独属性时,需要对多行进行更新;
删除异常:如果删除表中的某一个实体则会导致其他实体的消失。
(3)节约数据存储空间
(4)提高查询效率
2.数据库设计步骤
(1)需求分析:全面了解产品设计的存储需求;存储需求;数据处理需求;数据的安全性和完整性
(2)逻辑设计阶段:设计数据的逻辑村塾结构;数据实体之间的逻辑关系,解决数据冗余和数据维护异常
(3)物理设计:根据使用诗剧苦特点进行表结构设计(1).关系型(2)非关系型
(4)维护优化:跟据实际情况对索引,存储进行优化。
3.数据库设计范式
(1)第一范式
在关系模型中,所有的域都应该是原子性的,即数据库表的每一列是不可分割的原子数据项,而不是集合,数组,记录等非原子数据项。
数据库中的所有字段都只具有单一属性;单一属性的列是由基本的数据类型所构成的;设计出来的表都是简单的二维表。
(2)第二范式
必须建立在第一范式之上,要求数据库表中的每个实例或记录必须可以被唯一地区分,选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。
要求一个表中只具有一个业务主键,实体的属性完全依赖于主关键字,所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。
(3)第三范式
在第二范式上,任何主属性不依赖于其他非属性。要求一个关系中不包含已在其它关系已包含的非主关键字信息。
例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性,也就是在满足2NF的基础上,任何非主属性不得传递依赖于主属性。
4.范式化与反范式化
范式化
(1)优点:
可以尽量的减少数据冗余(数据表更新快体积小)
范式化的更新操作比反反范式化更快
范式化的表通常比反范式化更小。
(2)缺点:
对于查询需要对多个表进行关联;
更难进行索引优化。
反范式化
(1)优点
可以较少表关联;
可以更好的进行索引优化。
(2)缺点
存在数据冗余及数据维护异常;
对数据的修改需要更多的成本。
5.物理设计:
(1)定义数据库,表及字段的命名规范
可读性原则
表意性原则
长名原则(尽量不适用缩写)
(2)选择合适的存储引擎
(3)为表中字段选择合适的数据类型
1.当一个列可以选择多种数据类型时,应该优先考虑数字类型,其次是日期或二进制类型,最后选择字符类型,对于相同级别的数据类型,应先选择占用空间小的数据类型;
实数类型:float(非精确),double(非精确),decimal(精确,财务方面业务)
整数财务数类型:tinyint,smallint,mediuint,int,bigint
2.varchar:用于存储变长字符串,只占用必要的存储空间;列的最大长度小于255只占用一个额外字节用于记录字符串长度;列的长度大于255则要占用两个额外子节记录;
使用最小的符合需求的长度(中国姓名:不大于10)
varchar(5)和varchar(200)存储“mysql”字符串性能不同;
适用场景:
1.字符串列的最大长度比平均长度大很多
2.字符串列很少被更新;
3.使用了很多字节字符集存储字符串
3.char类型:是定长的;字符串存储在char类型的列中会删除末尾的空格;char类型的最大宽度是255,
使用场景:char适合存储长度近似的值;适合存储短字符串;适合存储经常更新的字符串
4.如何存储日期类型
Datetime:与时区无关,占用8个字节,时间范围:1000-01-01 00:00:00 ~9999-12-31 23:59:59
Timestamp:依赖所指定时区;占用4个字节;时间范围:1970-01-01 ~2038-01-19,在行的数据修改时可以自动修改timestamp列的值
Date:只保存日期,占3个字节,对比整数类型(4)和字符串类型(8)占用空间最少
Time:只保存时间
存储日期时间数据的注意事项:
(1)不要使用字符串类型来存储日期时间数据;日期时间类型通常比字符串占用的存储空间小;日期时间类型在津项查找过滤时可以利用日期来进行对比;日期事件类型还有着丰富的处理函数,可以方便的对时期类型进行日期计算。
(2)使用Int存储日期时间不如使用timestamp类型,timestamp在数据库中显示的日期为时间格式,而int则显示的时数字。
(3)如何为Innodb选择主键
1.主键应该尽可能小
2.主键应该是顺序增长的
3.Innodb的主键和业务主键可以不同