数据库设计
转载:https://www.cnblogs.com/cxyyh/p/11148991.html
一、数据库优化包括哪些方面
数据库优化是一个综合型的技术,并不是通过某一种方式让数据库效率提高很多,而是通过多方面的提高,从而使得数据库效率提高很多。
优化主要包括:
1.表的设计合理化(三范式)
2.给表要添加合适的索引
3.分表技术(水平分割、垂直分割)
4.定时清除垃圾数据,定时进行碎片整理
5.对mysql的配置进行一些优化
6.读写分离
二、数据库的设计
2.1 良好数据库与糟糕数据库的对比
良好的数据库:
1.节省存储空间
2.保证数据完整性
糟糕的数据库
1.数据冗余,存储空间的浪费
2.产生数据不完整
2.2 设计数据库的步骤
2.2.1 充分了解需求
2.2.2 标识实体:具体存在的对象,名词
对象如下
用户
发帖
回帖
版块
2.2.3 标识属性
2.2.4 标识关系
一对多:主键和非主键之间的关系,在多的一方创建一个字段作为外键指向一的一方的主键
多对多:创建一个第三种表,中间表至少需要2个字段分别作为外键指向多对多双方的各自主键
一对一:
唯一外键对应:假设一对一的双方是一对多的关系,在多的一方创建外键指向一的一方的主键,需要在外键
上添加一个unique约束
主键对应:将一对一的双方的主键建立映射
2.3 数据库规范化
表设计出来以后,我们需要通过范式对表进行规范化。范式有六大范式,常用3种范式对表进行规范化。
2.3.1 第一范式:确保每列的原子性
第一范式用来规范字段,所有的字段都不可再分,两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据。
例如地址这个字段,如果不分类汇总,不排序,仅仅是起一个字符串的作用,此时我们可以不拆分,反之需要拆分成省份-城市-街道地址。
上图所示的用户信息遵循第一范式的要求,这样对用户的省份和城市进行分类以及修改的时候就非常方便,提高了数据库的性能。
2.3.2 第二范式:非主键字段必须依赖于主键字段,每个表只描述一件事
第二范式在满足第一范式的前提下,需要确保数据库表中每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。
也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键,如下图。
这个表中是以订单编号和商品编号作为联合主键,这里产生一个问题:在该表中商品名称、单位、商品价格等信息不与该表的订单主键相关,
而仅仅是与商品编号主键相关。依据第二范式的设计原则,我们需要对这个订单信息表进行拆分,把商品信息分离到另一个表中,把订单项目
表也分离到另一个表中,就非常完美了,如下图。
这里这样设计,很大程度上减小了数据库的冗余,如果要获取订单的商品信息,使用商品编号到商品信息表中查询即可。
2.3.3 第三范式:消除传递依赖
在满足第二范式的基础上,第三范式要求任何非主键属性不依赖于其他非主键属性。
比如,已经存在一个客户信息表,包含客户编号、客户名称、所属公司和联系方式,那么在设计订单信息表的时候,字段中就没必要再添加除客户编号外的字段信息了,这样就造成数据的冗余, 第三范式就是表格的非主键属性不依赖与其他表格的非主键属性。
如下面这两个表所示的设计就是一个满足第三范式的数据库表。
这样在查询订单信息的时候,就可以使用客户编号来关联客户信息表中的记录,而不必在订单信息表中多次输入客户信息的内容,减小了数据冗余。
2.3.4 反三范式
没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。
具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余,
达到以空间换时间的目的
。
2.3.5 规范化和性能
1. 数据库性能比规范化数据库更重要
通过在给定的表中添加额外的字段,以减少需要从中搜索信息所需要的时间
通过在给定的表中插入计算列(查询总分),以方便查询
2. 进行规范化的同时,还需要综合考虑数据库性能
2.3.6 范式化设计和反范式化设计的优缺点
1. 范式化
优点
缺点
2. 反范式化
优点
缺点