数据库设计那些事课程学习
学习目标
1、了解数据库设计的重要性
2、如何设计出简洁高效的数据库结构
3、如何对数据库结构进行优化调整
-
数据库设计是什么?
根据需要为业务系统构造出的最优的(有效存储,高效访问)数据存储模型,eg MySQL
-
为什么要设计?
让系统稳定,为以后的开发做铺垫
-
设计步骤?
需求分析(什么数据,数据属性)->逻辑设计(ER图逻辑建模)->物理设计->维护优化(对新需求建表,索引优化,大表拆分)
-
需求分析:了解核心数据和不常用数据,要搞清实体和实体之间的关系,属性,可以唯一标识实体的属性(存储呀,增长量呀等等)
举例:电子商务网站。用户模块(属性:用户名,密码…;唯一标识属性:用户名,电话;存储特点:随系统上线时间增加,需要永久存储),商品模块(属性:商品编码,价格;唯一标识属性:商品名称和供应商组合属性;存储特点:对于下线商品可以归档存储),订单模块,购物车模块…
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RFuVnvE6-1626754757388)(C:\Users\86131\AppData\Roaming\Typora\typora-user-images\image-20210617202609747.png)] -
逻辑设计:需求转化为模型。
操作异常:插入异常(实体B随着A存在而存在);更新异常(更新A的单独属性需要多行更新);删除异常(删除A导致B的信息丢失)
数据冗余:相同数据多个地方存在,或某个列可以由其他列计算得到
数据库范式:
-
第一范式(1NF):单一属性,不可再分,表示二维表
-
第二范式(2NF):不能存在部分函数的依赖关系,只有单关键字肯定符合(只有一个“可乐”)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7WERLlzO-1626754567938)(C:\Users\86131\AppData\Roaming\Typora\typora-user-images\image-20210617203717713.png)]
-
第三范式(3NF):不能有传递依赖(商品名称“可乐”决定了分类”酒水饮料“,也决定了分类描述”碳酸饮料“)
-
BC范式(BCNF)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0pPP3rEK-1626754567942)(C:\Users\86131\AppData\Roaming\Typora\typora-user-images\image-20210617204349633.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IuyYmzuq-1626754567943)(C:\Users\86131\AppData\Roaming\Typora\typora-user-images\image-20210617204452126.png)]
-
-
物理设计:选择合适的数据管理系统,定义数据库,字段的命名规范,根据DBMS系统选择合适的字段类型,反范式化设计。
-
常见DBMS系统:商业(适合企业级):Oracle,SQLServer;开源(适合互联网项目):MySQL,PgSQL
-
MySQL常用存储引擎【注:引擎相当于数据库强大的文件系统,除了基本的存取功能,还有事务,锁定,备份和恢复,优化等功能】
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X5taV3hq-1626754567944)(C:\Users\86131\AppData\Roaming\Typora\typora-user-images\image-20210617210035593.png)]
-
字段类型选择原则:优先选择数字类型(优先占用空间小的数据类型),其次日期或二进制类型,最后字符类型。因为数据查找字符处理比数字慢,数据处理以页为单位,列的长度越小,利于性能提升。
小数:decimal(精确),float(开销小);日期:int(字长小),datetime(使用方便)
-
避免外键,避免触发器,严禁预留字段【注:主键,数据的一列】
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jSmLj7RL-1626754567945)(C:\Users\86131\AppData\Roaming\Typora\typora-user-images\image-20210617212245170.png)]
-
反范式化:为了性能,空间换时间,适当违背3NF,减小表的关联数量
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gMMlELId-1626754567946)(C:\Users\86131\AppData\Roaming\Typora\typora-user-images\image-20210617212429801.png)]
-
-
设计维护:数据字典,索引,表结构,适当水平/垂直拆分
-
索引保持合适的数量,维护索引碎片,不要使用强制索引关键字
-
数据库适合批量操作,禁止Select *这样的查询,控制使用用户自定义函数,不要使用数据库中的全文索引
-
垂直拆分:列很多,拆分提高I/O效率,警察一起查询的列放在一起,text,blob等大字段拆分出到附加表
水平拆分:通过hash key
-
-