【Mysql】数据库设计的那些事

【Mysql】数据库设计的那些事

  • (1)需求分析
      • (1.1)数据库设计简介
      • (1.2)数据库设计的步骤
      • (1.3)需求分析重要性简介
      • (1.4)需求分析举例
          • (1)实例讲解
          • (2)模块分析
          • (3)表之间关系分析
  • (2)逻辑分析
      • (2.1)ER图
      • (2.2)设计范式概要
      • (2.3)第一范式
      • (2.4)第二范式
      • (2.5)第三范式
      • (2.6)BC范式
  • (3)物理设计
      • (2.1)数据库物理设计要做什么
      • (2.2)选择哪种数据库
      • (2.3)mysql常用存储引擎
      • (2.4)数据库表和字段的命名规则
      • (2.5)数据库字段类型选择原则
      • (2.6)数据库如何具体选字段类型
      • (2.7)数据库设计其它注意事项
      • (2.8)反范式化表设计
  • (4)维护优化
      • (2.1)数据库维护和优化要做什么
      • (2.2)数据库如何维护数据字典
      • (2.3)数据库如何维护索引
      • (2.4)数据库中适合的操作
      • (2.5)数据库表的垂直和水平拆分

(1)需求分析

(1.1)数据库设计简介

(1.2)数据库设计的步骤

(1.3)需求分析重要性简介

(1.4)需求分析举例

(1)实例讲解

一个小型的电子商务网站,核心模块:用户模块、商品模块、订单模块、购物车模块、供应商模块

(2)模块分析

(2)用户注册模块
包括属性:用户名、密码、电话、邮箱、身份证号、地址、姓名、昵称…
可选唯一标识性属性:用户名、身份证、电话
存储特点:随系统上线时间逐渐增加,需要永久存储
(3)商品模块
包括属性:商品编码、商品名称、商品描述、商品品类、供应商名称、重量、有效期、价格…
可选唯一标识性属性:商品编码、商品名称、供应商名称
存储特点:对于下线商品可以归档存储
(4)订单模块
包括属性:订单号、用户姓名、用户电话、收货地址、商品编号、商品名称、数量、价格、订单状态、 支付状态、订单类型…
可选唯一标识性属性:订单号
存储特点:永久存储(分表、分库存储)
(5)购物车模块
包括属性:用户名、商品编号、商品名称、商品价格、商品描述、商品分类、加入时间、商品数量…
可选唯一标识性属性:用户名、商品编号、加入时间、购物车编号
存储特点:不用永久存储(设置归档、清理规则)
(6)供应商模块
包括属性:供应商编号、供应商名称、联系人、电话、营业执照号、地址、法人…
可选唯一标识性属性:供应商编号、营业执照号
存储特点:永久存储

(3)表之间关系分析

【Mysql】数据库设计的那些事_第1张图片一对多关系:把一表的主键放进多表中作为外键
多对多关系:创建中间关联表,放进两个多表的主键

(2)逻辑分析

(2.1)ER图

(1)逻辑设计做什么
1-把需求转化为数据库的逻辑模型
2-通过ER图的形式展示逻辑模型
(2)ER图分析表之间的关系
【Mysql】数据库设计的那些事_第2张图片

(2.2)设计范式概要

(2.3)第一范式

定义:数据库表中的所有字段都是单一属性,不可再分,这个单一属性是由基本的数据类型所构成的,比如整数、浮点数、字符串等。换句话说,第一范式要求数据库中的表都是二维表
【Mysql】数据库设计的那些事_第3张图片

(2.4)第二范式

定义:数据库的表中不存在非关键字段对任意候选关键字段的部分函数依赖。
部分函数依赖是指存在着组合关键字中的某一关键字决定非关键字的情况。
换句话说:所有单关键字段的表都符合第二范式。
【Mysql】数据库设计的那些事_第4张图片所以上面的表是不符合第二范式要求的,会存在以下问题:
1-插入异常
2-删除异常
3-更新异常
4-数据冗余

改进如下:
把一张表中的多对多关系查分,拆成三张表,一张表中只存储一个实体类信息,在多对多关系之间插入一格关联表,形成两个一对多的关系。
【Mysql】数据库设计的那些事_第5张图片

(2.5)第三范式

定义:第三范式是在第二范式的基础上定义的,如果数据表中不存在非关键字段,对任意候选关键字段的传递函数依赖则符合第三范式。
【Mysql】数据库设计的那些事_第6张图片
改进如下:
【Mysql】数据库设计的那些事_第7张图片

(2.6)BC范式

定义:在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数的依赖则符合BC范式。
也就是说如果是复合关键字,则复合关键字之间不能存在函数依赖关系。
【Mysql】数据库设计的那些事_第8张图片
改进如下:
【Mysql】数据库设计的那些事_第9张图片

(3)物理设计

(2.1)数据库物理设计要做什么

(2.2)选择哪种数据库

(2.3)mysql常用存储引擎

(2.4)数据库表和字段的命名规则

(1)可读性原则:使用大写和小写来格式化的库对象名字以获得良好的可读性。例如使用CustAddress而不是custaddress,可以使用下划线命名法,也可以使用驼峰命名法
(2)表意性原则:对象的名字应该能够描述它所标识的对象。例如,对于表,表的名称应该能够体现表中存储的数据内容;对于存储过程,存储过程名称应该能够体现存储过程的功能。
(3)长名原则:尽可能少使用或者不使用缩写

(2.5)数据库字段类型选择原则

(1)举个例子:日期数据
1-使用char(10):‘1978-03-01’
2-使用varchar(20):‘1978-03-01’
3-使用Datetime:1978-03-01
4-使用Int:257529600(时间戳,只能存储到2037年)
(2)字段类型的选择原则
1-列的数据类型一方面影响数据存储空间的开销,另一方面也会影响数据查询性能。
2-当一个列可以选择多种数据类型时,应该优先考虑数字类型,其次是日期或者二进制类型,最后是字符类型。
所以上面的类型选择顺序是:int>Datetime>char(10)>varchar(20)
3-对于相同级别的数据类型,应该优先选择占用空间小的数据类型。

(3)常见类型的存储空间
【Mysql】数据库设计的那些事_第10张图片(4)字段类型选择的两个角度考虑
1-在对数据进行比较(查询条件where、连接条件on、排序order by)操作时:同样的数据,字符处理往往比数字处理慢
2-在数据库中,数据处理以页为单位,列的长度越小,利于性能提升(从IO瓶颈考虑)

(2.6)数据库如何具体选字段类型

(1)char和varchar如何选择
1-如果列中要存储的数据长度差不多是一致的,则应该考虑用char;否则应该考虑用varhcar
2-如果列中的最大数据长度小于50byte,则一般也考虑用char。当然,如果这个列很少用,则基于节省空间和减少IO的考虑,还是可以选择用varchar
3-一般不宜定义大于50byte的char类型列

(2)decimal和float如何选择
1-decimal用途存储精确数据,而float只能用于存储非精确数据,所以精确数据只能选择用decimal类型
2-由于float的存储空间开销一般比decimal小,精确到7位小数只需要4个字节,而精确到15位小数只需要8字节
所以,非精确数据优先选择float类型

(3)时间类型如何存储
1-使用int来存储时间的优缺点
优点:字段长度比datetime小
缺点:使用不方便,要进行函数转换
限制:只能存储到2038-1-19
2-需要存储的时间粒度
年-月-日-小时-分-秒-周
3-如果是经常用到的日期就用datetime存储,如果是不经常用到的日期就用时间戳存储

(2.7)数据库设计其它注意事项

(2.8)反范式化表设计

(4)维护优化

(2.1)数据库维护和优化要做什么

(2.2)数据库如何维护数据字典

(2.3)数据库如何维护索引

(2.4)数据库中适合的操作

(2.5)数据库表的垂直和水平拆分

你可能感兴趣的:(Java基础与算法,数据库,python,mysql,java,编程语言)