目录
数据库优化的目的
数据库结构设计的步骤
数据库设计范式
数据库第一范式
数据库第二范式
数据库第三范式
数据库设计的目的
实战
需求说明
需求分析及逻辑设计
需求分析及逻辑设计-反范式化设计
反范式化设计总结
范式化设计和反范式化设计优缺点
数据库的物理设计介绍
物理设计涉及的内容
定义数据库表、及字段命名规范
选择适合的存储引擎
物理设计-数据类型的选择
不同数据类型在Mysql服务器上的体现
如何选择VARCHAR和CHAR类型
应该如何确定VARCHAR的宽度
VARCHAR的实用场景
如何选择varchar和char类型
CHAR类型的适用场景
物理设计-如何存储日期类型
如何存储日期数据
timestamp在Mysql的时区不同的体现
datetime、timestamp是如何存储微秒值
查看timestamp自动更新特征
Timstamp数据结果操作结论
date类型和time类型
存储日期时间数据注意的事项
物理设计——本章节总结
存储引擎的最好选择
InnoDB存储引擎的选择注意事项
如何为Innodb选择主键
数据库设计的整个过程
问:那么什么是数据冗余呢?
答:指相同的数据在多个地方的存在,或者说表中的某个列的,可以由其他列来计算得到,这样的数据就是冗余的。这里所说的,那是要尽量减少数据的冗余,而不是说要完全的没有冗余的数据,因为在一些情况下,必要的数据冗余也是必须的。
例子:
分析:
每一列不可拆分,所有列由基本的数据类型组成,是二维表(但是还是存在冗余【反范式】)
例子:show creat table selectcourse;
分析:学号课程名称组成符合组件,有可能不满足第二范式要求的,学分只和课程名称名称关联也就是上面的第二个,总结是不符合。
拆分成符合:
分成:《学分表》《课程表》《学生选课关系表》
show create table study\G
show create table course\G
前两种表只有一个主键so满足第二范式要求;
show create tablestudycourse\G
第三张表不存在非主键的依赖关系也是符合第二范式。
修改结果
已满足第二范式看是否满足第三范式。
例子:
分析:但是学院的地址和学院又有依赖关系,那就是说学院地址和学院具有传递依赖关系。
拆分改造:《学生信息表》《学院信息表》
结论:第三范式该造后不会有数据冗余和数据维护异常。
按下面的需求,设计一个电子商务网站的数据结构
用户登录及用户管理功能
只有一个业务主键,一定是符合第二范式;
没有属性和业务主线存在传递依赖关系,符合第三范式
商品展示及商品管理功能
供应商管理功能
在线销售功能
问:这样的设计已经符合了范式化的要求,但是数据库处理来说,是否是高效的呢?
答:前面我们已经说过,在数据库设计时不仅要考虑到范式化,同时也要考虑到查询性能的要求!
问:编写SQL查询出每一个用户的订单总额?
答:
首先这个查询关联四张表,关于MySQL而言关联表越多性能越差,虽然说四张表并不算多,但是这样的查询可能会非常的频繁,所以如果能减少关联表的数量,能提高性能!
问:现在只在商品表中记录了价格,一旦商品发生价格变动,会产生什么样的问题呢?
答:这样会导致历史订单的价格也会发生变化,我们恰恰是不想要看到的。
假设下单用户就是商品的收货人,我们在发货前一定要查询出每个订单的下单人信息,而这些信息全部记录在用户信息表中。
问:编写SQL查询出下单用户和订单详情?
答:
结论:完全符合范式化的设计,有时并不能得到良好的SQL查询性能(即反范式化设计)。
问:什么叫做反范式化设计?
答:反范式化是针对范式化而言的,在前面介绍了数据库设计的方式,所谓的反范式化就是为了性能和读取效率的考虑,而适而适当的对数据库设计范式的要求进行违反,而允许存在少量的数据冗余,换句话来说,办事话就是利用空间来换取时间。
图书在线销售网站数据库的反范式化改造
反范式化改造后的查询
问:编写SQL查询出每一个用户的订单总额?
答:
问:编写SQL查询出下单用户和订单详情?
答:
问:什么是数据库的物理设计?
答:根据所选择的关系型数据库的特点,对逻辑模型进行存储结构设计。
为表中的字段选择合适的数据类型
当一个列可以选择多种数据类型时,应该优先考虑数字类型,其次是日期或二进制类型,最后是字符型,对于相同级别的数据类型,应该优先选择占有空间小的数据类型。
问:如何选择正确的整数类型?
答:
问:如何选择正确的实数类型?
答:
1、表结构:
2、查询表内容:select * from t_double
3、对上述数据进行汇总操作 select i,sum(d1) as a,sum(d2) as b from t_double group by i having a<>b;
结论:21.40000000..6意味着double是非精确的值,两个double汇总和直接结果是有差异的,DECIMAL是精确地实数类型,但是所占用存储空间比上述2个大——财务数据,其他可以用double和float。
VARCHAR的存储特点
1、设置时区
set time_zone='+10:00';
2、创建表
create table t(d1 datetime,d2 timestamp);
3、插入时间值
insert into t values(new(),now());
4、插入结果
5、修改当前时区后查询变化是什么呢?
结论:timestamp数据显示和时区有关。
timestamp具有自动更新的功能,但是第二个却不能就能发现,在MySql中只有第一个Timestamp类型具有自动跟新的。
在mysql 5.7之前的操作如上,mysql5.7 以后的版本直接使用date类型