介绍了很多对数据库性能会带来的因素,包括服务器的硬件,操作系统,MYSQL服务器配置等等,但是总的来说,
对数据库性能影响最大的呢,实际上就是数据库的结构了
良好的数据库逻辑设计和物理设计是数据库设计获得高性能的基础,会要求我们在设计数据库时,不能只考虑
数据库需要,还要考虑我们将来,要怎样来使用我们数据库来编写,查询语句才能得到我们的数据,所以我们也要使用我们的
查询语句呢,来设计我们的数据库结构,结构的设计呢,最好是使得数据库的查询语句呢,尽量的简单,为了达到这个目的,
通常我们需要考虑很多的因素,如果我们根据查询对表进行反范式化的设计,那么可能是可以加快一些语句的查询速度的,
范式又会对其他查询语句造成性能上的影响,所以我们在进行数据库设计时,一定要平衡各方面的利益,以达到最好的效果,
总的来说呢,我们进行数据库设计呢,希望可以达到以下几个目的的,首先我们进行数据库结构设计呢,期望达到的第一个
目的呢,减少数据的冗余,那么什么是数据冗余呢,数据冗余就是指,相同的数据,在多个地方呢存在,或者说,表中的某个列呢,
由其他列来计算得到,这样的数据呢就是冗余,这应该很好理解,但是有一点需要注意,我们这里说的是要尽量减少数据的冗余,
而不是要完全的没有冗余的数据,因为在一些情况下呢,必要的数据冗余呢,也是必须的,在我们的下面数据设计中呢,大家就会
看到,数据库设计的第二个目的呢,就是要避免在数据维护中,出现插入,更新,删除异常,对于数据维护的异常呢,理解起来就不
像数据冗余那么容易了,我们可能需要分别来为大家讲解一下,所谓插入异常呢,从定义上来看呢,是这样的,如果表中的某个实体,
随着另一个实体的存在而存在,也就是说,如果缺少了某个实体,就无法表示另一个实体,那么这样设计出来的表呢,插入异常,是不太
好理解,我们来看一个实际的表就清楚了
我们进入到dbs数据库
use dbs;
这里呢我们有这样的一张表
show create table selectcourse\G
现在这个selectcourse的表结构,这张表记录了每一个学生,和讲课的名称,和学分,其中学号和课程名称呢,
是这个表的主键,也就是说,一个学生只能选择相同的课程一次,我们下面来看一下这个表的数据,这样理解起来可能就会
更加的直观
select * from selectcourse;
现在这个表中一共存在了4行数据,首先大家可以看到这个表是存在数据冗余问题的,其中多次出现了学生的姓名,生日这些信息,
另外没门课程的学分呢,也是冗余的,那么什么是插入异常呢,如果我们要新增加一门课程,语文,并且学分是10分,但是还没有任何
学生来选择这门课程,那么我最后可以单独的把这个信息插入到这个表中,我们可以来看一下,我们insert into,selectcourse这张表,
其中我们只想插入课程信息,课程的名称和课程的学分,比如我们要插入语文课,他的学分是10分
insert into selectcourse(course_name,course_point) values('语文',10);
可以看到,这里就爆出了一个异常,学号这一列是没有默认值的,并且由于学号是我们主键的一部分,所以不能为空,
所以这里就产生了刚才所说的插入异常,在没有学生选择这门课的情况下,是无法把新插入的课程,插入到表中的,
搞清楚了数据的插入异常,继续往下看,那么什么是数据的更新异常呢,更新异常是这样子的,如果更改表中的某个
实体的单独属性时,需要对多行进行更新,那么这个表就存在更新异常,依然让人不太好理解,还是回到我们的演示系统中
来看一下
如果这个时候要更新数学的学分为15,那么我们要同时更新多少行数据呢,我们来看一下,现在我们数学这门课程的学分,
等于15分
update selectcourse set course_point = 15 where course_name = '数学';
这个时候我们同时更新了两行数据,如果我们选择这门课程的学生越多,表更新的数据也会越多,这就是更新异常的
表现,可以看到数据的更新异常,数据的冗余,是有很大的联系的,那最后我们再来看看什么是删除异常,其实删除异常和
插入异常,看上去差不多,如果我们删除了某一个表中的实体,则会导致其他实体的消失,这就是删除异常,以我们的演示
来说吧,如果我们删除了选择数学的选课记录,那是不是数学这么课程的相关信息也就不存在了呢,是这样的,这就是删除数据
的异常体现,那我们对数据库进行设计呢,就要尽量避免上面所说的异常,如果要想避免这些数据的异常,那么最好的方法呢,
按照范式化来对表进行设计,这个呢我们会说到,我们对数据库结构优化的第三个目的是什么
节约数据库的存储空间,那这个就比较好理解了,如果我们减少了数据冗余,就必然会节约很多的存储空间,
不要小看存储空间,对于大的数据库来说,可能是可以节约很多空间的,当然了,我们对数据库设计那就是提高
查询的效率,这一点在项目当中一定会有引用,这里就不多说了