zoukankan      html  css  js  c++  java
  • 数据库设计

    转载: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. 反范式化

    优点

    缺点

  • 相关阅读:
    html5的键盘事件
    阻止滑屏
    JS 复制到黏贴板上
    最新拖动原理
    方法——<37>
    验证——正则<37>
    《高级程序设计》 9 客户端检测
    《高级程序设计》8 BOM
    《高级程序设计》7 函数表达式
    《高级程序设计》6 面向对象的程序设计
  • 原文地址:https://www.cnblogs.com/testlearn/p/12450497.html
Copyright © 2011-2022 走看看