数据库设计那些事

数据库设计

数据库设计主要分以下四个部分进行展开
需求分析->逻辑设计->物理设计->维护优化
优化:
1.新的需求进行建表
2.索引优化
3.大表拆分
“-------------------------------------------------”
需求分析
1.了解系统中需要存储的数据
2.了解数据的存储特点
3.了解数据的生命周期
‘----------------------------------------------------------------’

第一, 第二,第三范式 目前大多数数据库设计所要遵循的范式
减少操作异常:删除异常,更新异常,插入异常
第一范式:所有的字段都是不可再分的,单一属性是由基本的数据类型所构成的
第一范式要求数据库中的表都是二维表
第二范式:数据库中不存在非关键字对任一候选关键字段的部分函数依赖
所有单关键字的表都符合第二范式
例子:不符合第二范式的
数据库设计那些事
拆分成符合第二范式的:
数据库设计那些事
第三范式:
在第二范式之上的基础之上定义的,
如果数据表中不存在非关键字段,对任意候选关键字段的传递函数依赖
数据库设计那些事
数据库设计那些事
数据库设计那些事

设计实例
用户模块
属性:用户名 密码 电话 邮箱 身份证号 地址 姓名 昵称
可选唯一标识: 用户名 身份证 电话
存储特点 :岁系统上线时间逐渐增加 需永久存储

商品模块
包括属性:商品编码,商品名称 商品描述 商品品类 供应商名称 重量
有效期,价格
可选唯一标识 商品名称 供应商名称
存储特点:对于下线商品可以归档存储

订单模块
属性:订单号 用户姓名 用户电话 收货地址 商品编号
商品名称 数量 价格 订单状态 支付状态 订单类型
可选唯一标识 订单号
存储特点:永久存储(分表,分库储存)

购物车收藏模块
属性 用户名 商品编号 商品名称 商品何价格 商品描述 商品分类 加入时间 商品数量
可选唯一标识:用户名 商品编号 加入时间 购物车编号
存储特点:不用永久存储(设置归档,清理规则)

供应商or卖家模块
属性:供应商编号,供应商名称 联系人 电话 营业执照号 地址 法人
可选唯一标识:供应商编号,营业执照号
存储特点:永久储存

ER图

下划线标识主键
数据库设计那些事
数据库设计那些事

表内部结构设计

表名:下划线(模块名_名称_描述)
auth_user_base 含义:鉴权板块_用户_基础信息
auth_user_info 含义 :鉴权板块_用户_扩展信息
auth_role_menu 含义:鉴权板块_角色_菜单(关系表)

字段:驼峰式(大小写,单词简写组合)
soflSeqNr 含义:唯一标识符
legStsCd 含义:状态标签代码
UserName 含义:用户名

Tips:
1.太长的英文,可以简写,只要整体规范,一致就行,如:
Number:Num Sequence:Seq Datetime:Dt
2.单词组合简写.如:Schedule departure Datatime:schDepDt
3.不建议中文,拼音做表名或字段名,别人调用后一看就不够装也,
   同时,表设计为的是一次设计多次使用,需要形成一套规范

数据库字段类型的选择原则
例如对生日日期的选择
数据库设计那些事

列的数据类型一方面影响数据存储空间的开销,另一方面也会影响数据查询性能,当一个列可以选择多种数据类型时,应该优先考虑数字类型,其次是日期或二进制类型,最后是字符串类型,对于相同级别的数据类型,应该优先选择占用空间的数据类型

对于Birthday这个字段来说
Int > Datetime > Char >Varchar

数据库设计那些事

字段类型的选择原则
以上选择原则主要是从下面两个角度考虑

  1. 在对数据进行比较(查询条件,JSON条件及排序)操作时
    同样的数据,字符处理往往比数字处理慢
  2. 在数据库中,数据处理以页为单位,列的长度越小,利于性能提升

原则

  1. 如果列中要存储的数据长度差不多是一致的,则应该考虑用char,否则应该考虑用varchar

  2. 如果列中的最大数据长度小于50Byte,则一般也考虑用char如果这列很少用也可以用varchar(电话号码可以用char)大于十五个用varchar

  3. 一半不宜定义大于50Byte的char类型序列

  4. decimal用于存储精确数据,而float只能用于存储非精确数据。
    故精确数据只能选择用decimal类型

  5. 由于float的存储空间开销一般比decimal小,故非精确数据优先选择float类型

  6. 使用int来存储时间字段的优缺点
    优点:字段长度比datetime小
    缺点:使用不方便,要进行函数转换
    限制:只能存储到2038-1-19 11:14:07即2^32 为2147483648

  7. 需要存储的时间粒度
    年 月 日 小时 分 秒 周

如何选择主键

  1. 区分业务主键和数据库主键
    业务主键用于标识业务数据,进行表与表之间的关联
    数据库主键为了优化数据存储(Inndb会生成6个字节的隐含主键)
  2. 根据数据库的类型,考虑主键是否要顺序增长
    有些数据库是按主键的顺序逻辑存储的
  3. 主键的字段类型所占用的空间要尽可能的小
    对于使用聚集索引方式存储的表,每索引后都会附加主键信息

数据库中适合的操作
1. 批量操作VS逐条操作
2. 禁止使用select * 这样的查询
3. 控制使用用户自定义函数
4. 不要使用数据库中的全文索引

避免使用外键约束

  1. 降低数据导入的效率
  2. 增加维护成本
  3. 虽然不建议使用外键约束,但是相关联的列上一定要建立索引

反范式化:
为了性能和读取效率的考虑而适当的对第三范式的要求进行违反
而允许存在少量的数据冗余
使用空间来换取时间

符合范式化
数据库设计那些事
查询订单详情
数据库设计那些事
数据库设计那些事
为什么反范式化

  1. 减少表的数量
  2. 增加数据的读取效率
  3. 反范式化一定要适度

物理设计要注意的

  1. 选择合适的数据库管理系统
  2. 定义数据库,表及字段的命名规范
  3. 根据所选的DBMS系统选择合适的字段类型

MYSQL常用的存储:Innodb
数据库设计那些事

物理设计要注意的

  1. 选择合适的数据库管理系统
  2. 定义数据库,表及字段的命名规范
  3. 根据所选的DBMS系统选择合适的字段类型