数据库设计那些事
数据库设计
数据库设计主要分以下四个部分进行展开
需求分析->逻辑设计->物理设计->维护优化
优化:
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
字段类型的选择原则
以上选择原则主要是从下面两个角度考虑
- 在对数据进行比较(查询条件,JSON条件及排序)操作时
同样的数据,字符处理往往比数字处理慢 - 在数据库中,数据处理以页为单位,列的长度越小,利于性能提升
原则
-
如果列中要存储的数据长度差不多是一致的,则应该考虑用char,否则应该考虑用varchar
-
如果列中的最大数据长度小于50Byte,则一般也考虑用char如果这列很少用也可以用varchar(电话号码可以用char)大于十五个用varchar
-
一半不宜定义大于50Byte的char类型序列
-
decimal用于存储精确数据,而float只能用于存储非精确数据。
故精确数据只能选择用decimal类型 -
由于float的存储空间开销一般比decimal小,故非精确数据优先选择float类型
-
使用int来存储时间字段的优缺点
优点:字段长度比datetime小
缺点:使用不方便,要进行函数转换
限制:只能存储到2038-1-19 11:14:07即2^32 为2147483648 -
需要存储的时间粒度
年 月 日 小时 分 秒 周
如何选择主键
- 区分业务主键和数据库主键
业务主键用于标识业务数据,进行表与表之间的关联
数据库主键为了优化数据存储(Inndb会生成6个字节的隐含主键) - 根据数据库的类型,考虑主键是否要顺序增长
有些数据库是按主键的顺序逻辑存储的 - 主键的字段类型所占用的空间要尽可能的小
对于使用聚集索引方式存储的表,每索引后都会附加主键信息
数据库中适合的操作
1. 批量操作VS逐条操作
2. 禁止使用select * 这样的查询
3. 控制使用用户自定义函数
4. 不要使用数据库中的全文索引
避免使用外键约束
- 降低数据导入的效率
- 增加维护成本
- 虽然不建议使用外键约束,但是相关联的列上一定要建立索引
反范式化:
为了性能和读取效率的考虑而适当的对第三范式的要求进行违反
而允许存在少量的数据冗余
使用空间来换取时间
符合范式化
查询订单详情
为什么反范式化
- 减少表的数量
- 增加数据的读取效率
- 反范式化一定要适度
物理设计要注意的
- 选择合适的数据库管理系统
- 定义数据库,表及字段的命名规范
- 根据所选的DBMS系统选择合适的字段类型
MYSQL常用的存储:Innodb
物理设计要注意的
- 选择合适的数据库管理系统
- 定义数据库,表及字段的命名规范
- 根据所选的DBMS系统选择合适的字段类型