Mysql 6 业务设计(逻辑设计)+物理设计

 

一   数据库设计三大范式(用于逻辑设计)

1 第一大范式

  • 数据库表中所有的字段都只具有单一属性
  • 单一属性的列是由基本数据类型所构成
  • 设计出来的表都是简单的二维表

 

 2  第二大范式

要求表中只有一个业务主键,也就是说符合第二范式的表不能存在非主键列,只对部分主键的依赖关系

3 第三大范式

非主键列不能依赖其他表的非主键列。

错误范式:
订单与客户姓名关联
订单与客户编号关联
客户姓名和客户编号关联。
不应该将客户编号和客户姓名存放在订单中,如果修改用户表中的姓名和编号修改
则需要对订单中的客户编号和姓名进行修改。

 

使用范式设计后的表查询

 

二  反范式设计

为啥要有这个东西呢,就是因为如果过分的依赖于三大范式,设计出来的表虽然很符合规范,但是SQL的查询性能将会很差,所以才有了反范式设计

1  什么叫反范式化设计:

  • 反范式化是针对范式化而言的,在前面介绍的三大范式
  • 所谓的反范式化就是为了性能和读取效率的考虑而适当的对数据库设计范式的要求进行违反
  • 允许存在少量冗余,换句话来说反范式化就是用空间换时间

如订单表上按范式设计,只能由客户ID,关联到客户表,但是为了性能考虑,可以把经常需要查询的字段也放到订单表,如客户姓名,电话,地址等等

和上面纯范式设计相比,这个SQL查询关联的表少了很多,性能几何倍提升了

2 范式化设计和反范式化设计的优缺点

范式化设计的优点:

         1、可以尽量减少数据冗余

         2、范式化的更新操作比反范式化更快

         3、范式化的表通常比反范式化更小

范式化设计的缺点:

         1、对于查询需要对多个表进行关联   

         2、更难进行索引优化

反范式化设计的优点:

        1、可以减少表的关联

        2、可以更好的进行索引优化

反范式化设计的缺点:

        1、存在数据冗余及数据维护异常

         2、对数据的修改需要更多的成本

 

三 、物理设计

根据所选择的关系型数据库的特点对逻辑模型进行存储结构设计

1、定义数据库、表及字段的命名规范

 a、数据库、表及字段的命名要遵守可读性原则  

 b、数据库、表及字段的命名要遵守表意性原则 表的名字能够描述表的功能、模块等

 c、数据库、表及字段的命名要遵守长名原则 少用缩写 

   d. 数据库、 表、字段应使用英文或者拼音的专有名词。不要使用拼音。

 2、选择合适的存储引擎

3、为表中的字段选择合适的数据类型

4、建立数据库结构

为表中的字段选择合适的数据类型:

        当一个列可以选择多种数据类型时,应该优先考虑数字类型,其次是日期或二进制类型,最后是字符类型。对于相同级别的数据类型,应该优先选择占用空间小的数据类型。

如何选择正确的整数类型:

 

如何选择正确的实数类型:

(如果涉及金额,财务这块的实数,要用DECIMAL,因为其他类型会有数据计算不准和丢失的情况)

何选择varchar和char类型:

  varchar类型的存储特点:

       a、varchar用于存储变长字符串,只占用必要的存储空间。

      b、列的最大长度小于255则只占用一个额外字节用于记录字符串长度

      c、列的最大长度大于255则要占用两个额外字节用于记录字符串长度

varchar长度的选择问题:

      a、使用最小的符合需求的长度

      b、varchar(5)和varchar(200)存储MySQL字符串性能不同

varchar适用场景:

    a、字符串列的最大长度比平均长度大很多

    b、字符串列很少被更新

    c、使用了多字节字符集存储字符串

char类型存储特点:
    a、char类型是定长的

    b、字符串存储在char类型的列中会自动删除末尾的空格

    c、char类型的最大宽度为255

char类型适用的场景:

   a、cahr类型适合存储长度近似的值

   b、char类型适合存储短字符串

   c、char类型适合存储经常更新的字符串列

 

如何存储日期类型:

可以在表设计中勾选,字段更新timestamp列的值

 

区别 timestamp datetime
时区

和时区有关

mysql服务器的3种时区设置

  1. 系统时区 - 保存在系统变量system_time_zone
  2. 服务器时区 - 保存在全局系统变量global.time_zone
  3. 每个客户端连接的时区 - 保存在会话变量session.time_zone
无关
长度 4字节 8字节
范围 '1970-01-01 00:00:01.000000' to '2038-01-19 03:14:07.999999' '1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999'
默认值 current_timestatmp 系统当前时间 null

posted on 2020-07-25 21:52  鑫男  阅读(292)  评论(0编辑  收藏  举报

导航