一、规范化设计
范式:来自英文Normal Form,简称NF
(可以近似理解成一张数据表的表结构所符合的某种设计标准的级别)
六种范式:
1、第一范式(1NF):
属于第一范式关系的所有属性不可再分,即数据项不可分。
- 每一列属性都是不可再分的属性值,确保每一列的原子性;
- 两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据;
- 单一属性的列为基础数据类型构成;
- 设计出来的表都是简单的二维表。
不符合第一范式的:
修改后:
2、第二范式(2NF):
是在第一范式的基础上建立起来的,即满足第二范式必须先满足第一范式,第二范式要求实体的属性完全依赖于主关键字。
3、第三范式(3NF):
必须先满足第二范式;第三范式要求一个数据库表中不包含已在其他表中包含的非主关键字信息,即数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系。
不符合第三范式:已经存在产品ID了,不能再存在产品名称
纠正:应该将产品名称这个属性单独放在一个表,只关联主键产品ID
巴斯-科德范式(BCNF)
第四范式(4NF)
第五范式(5NF,完美范式)
二、反规范化设计及实现
反范式化设计:
- 为了性能和读取效率而适当的违反对数据库设计范式要求;
- 为了查询的性能,允许存在部分(少量)冗余
三、字段数据类型优化-整数与实数
1、基本原则:
- 更小的通常更好
- 简单就好
- 尽量避免NULL
2、整数类型:
- tinyint、smallint、mediumint 、int 、bigint
3、实数类型:
- float(4字节)、double(8字节) 、decimal(cpu不支持这个数据类型)
四、字段数据类型优化-字符串与日期
1、字符串类型:
- char(定长) 、varchar(不定长) 、blob 、text 、enum 、set
2、日期和时间类型:
- datetime、timestamp(时间跨度不一样)
五、命名规范
- 可读性原则
- 必须使用小写字母或者数字
- 不使用复数名词
- 禁止使用保留字
- 索引命名
六、B+树与二分查找
索引:帮助MYSQL高效获取数据的数据结构
哈希索引:缺点:不能范围查找,只能精确查找;不能排序(数据库一般不使用)
B+树:通过二叉查找树,再由平衡二叉树、B树演化而来。
七、树、二叉树、AVL树、B+树
二叉树:
为什么MYsql不用B树而使用b+树?
- B数据每个节点都存储数据,每次查询的数据大小固定,就会造成每次查询返回的数据条数变少,相同数据规模的情况下B树会增加io次数,而B+树数据量较少,一次可以返回多条记录,io次数较少
- 范围查找B+树明显优于B树
B+树的作用
- 在磁盘设备上,通过B+树可以有效的存储数据;
- 所有记录都存储在叶子结点上,非叶子节点存储索引信息,而且记录按照索引列的值由小到大排好了序;
- B+树含有非常高的扇出,通过超过100,在查找一个记录时,可以有效的减少IO操作;