《数据库系统概论》学习总结

一、知识概要与收获:

通过该课程的学习和对数据库的设计与实践,收获到很多东西:
1.了解了数据库系统的结构和基本组成以及数据库系统的发展历程,关系数据库理论的形成和关系数据库系统逐渐由理论走向成熟的演变过程。
2.在学习关系数据库系统的发展历程中,认识到数据模型的相关概念,了解了层次模型、网状模型、关系模型等模型的相关概念及其完整性、优缺点等,同时也以关系模型为例,掌握了关系数据库中数据结构的形式化定义和其基本操作(关系代数语言(用关系的运算来表达查询)和SQL语言),能够熟练运用以传统集合关系运算和专门关系运算为基础的关系代数语言和SQL语言进行转化和对相关数据进行操作。同时也了解到一些关于关系演算的相关知识,比如基于元组关系演算的元组关系语言ALPHA和基于域关系演算的域关系演算语言QBE,这一部分内容作为了解内容,以数理逻辑中的谓词演算为基础,实际上已经基本被我们最为常见的结构化查询语言SQL所取代。
3.通过学习基本掌握了SQL语言的基本使用,认识到SQL语言的强大,作为计算机专业的学生,SQL语言的熟练掌握是最基本的条件。通过学习让我加深了对SQL语句的理解,使自己更加熟练地掌握了基础的SQL语句(增删查改,多表查询等);同时也让我更加清晰地辨析出SQL通用数据类型之间的不同与使用;理解了SQL约束、SQL外键之间的不同与使用;了解到了SQL的一些高级特性,关键字的使用,索引、视图的操作,基于派生表的查询,触发器、函数等。
4.在学习关系数据理论的过程中,我们根据不同的关系属性依赖对关系规范化程度进行了划分,并能熟练地判断和设计出不同规范化程度的数据库(规范化程度高并不意味着数据库设计完美,我们要根据需求合理地对关系进行规范化),在规范化过程中,掌握了函数依赖及其转化以及求最小函数依赖、求主码等严格推导过程,了解了多值依赖的概念和数据依赖的公理化系统,掌握了既保持无损连接又保持函数依赖连接的模式分解准则。
5.认识到数据库安全性的重要性,数据库存在诸多不安全因素,而为保证数据安全我们需采取一定的安全控制方式,通过理论学习了解到信息产品的安全等级评估标准和一些基本的(常见的)数据库安全控制方式,同时也引申出一些高级的安全控制方式来进一步防止不合法使用造成的数据泄露、更改或破坏。
6.认识到完整性约束的必要性,明确了数据库安全性和数据库完整性之间的不同概念,完整性是为了防止一些不合语义的数据进入数据库造成数据库数据的不正确性(不一致性),显而易见完整性约束是必要的,但是完整性约束条件的建立和检查处理会造成一定程度下的系统性能下降,因此在设计数据库时我们要把握好系统性能和完整性之间的一个合理的平衡点。
7.通过实践练习基本掌握了数据库的设计过程和运维使用方式,从最初的需求分析到ER图的概念结构设计(概念分析),再由ER图转化为数据库关系和结构的设计(逻辑结构设计),(物理结构设计一般交由DBMS自动处理),以及后续的数据库实验阶段到最后的运行和维护,有时候每一个阶段都是艰难的,需求分析作为整个设计的基础,是最困难、最耗时的一步,概念结构设计也是数据库设计的关键,在数据库系统设计实验以及Java web设计实验等过程中都深有体会,需求分析的遗漏和概念设计的不合理性均可能导致数据库的重构,这也让我深刻地理解到数据库分析与设计的重要性,同时在实践的过程中,提高了我的系统开发能力;另一方面有时候很多东西老师讲过了就觉得明白了,但是实际在实践过程中还会产生这样或那样的问题,只有实践才能出真知。纸上得来终觉浅,绝知此事要躬行。同时在逻辑设计阶段和物理设计阶段认识到数据模型的优化问题和存取方法的选择问题以及如何确定数据库的存储结构等问题。
8.数据库建立完成之后,对于查询处理等相关操作,了解到关系查询处理和查询优化的必要性,学习了代数优化和物理优化的相关概念,同时对逻辑设计阶段、物理设计阶段的优化和代数优化、物理优化进行了区别:一个是设计阶段对逻辑和结构关系的优化,一个是查询阶段采用不同方式进行操作的优化。
9.数据库管理系统都建立了完备的数据库恢复子系统,保证数据库运行之后能够从某一错误状态恢复到已知的某一正确状态,确保数据库的正确性(一致性)。数据恢复子系统是数据库管理系统的重要组成部分。当然我们对数据库进行恢复是因为数据库系统出现了故障,通过学习我们了解到数据库系统中一些故障的种类。数据库恢复技术是以事务为基本组成单位的,是以数据转储和登记日志文件等建立冗余数据的方式实现对数据库的恢复。同时了解到恢复的一些策略和具有检查点的恢复技术。
10.通过上述的学习和联系,我们对单机处理系统的数据库有了一定的了解,但是我们所接触的数据库大部分还是多机的,存在着并行操作,这就容易产生并行操作冲突,导致操作和数据库数据的不正确性。数据库管理系统通过对事务的并发控制来保证事务的隔离性和一致性(事务是并发控制的基本单位)(数据库恢复技术保证事物的原子性、一致性和持久性)。并发控制机制存在多种控制方式,我们主要学习了封锁技术。通过对并发控制的学习,了解了封锁的概念、封锁粒度的概念以及相关的封锁协议,当然封锁的方***产生死锁和活锁两类问题,我们采用不同的策略来进行(诊断和)解决,同时了解了两段锁协议对封锁的相关要求,并了解了意向锁的相关概念。了解了可串行化调度的概念。
11.关于SQL的实践:数据库编程。SQL编程技术可以有效克服SQL语言实现复杂应用方面的不足,提高应用系统和数据管理系统间的互操作性。要锻炼了在多种不同语言情况下连接操作数据库的能力。嵌入式SQL:将SQL嵌入到高级语言中混合编程,SQL语句负责操作数据库,高级语言负责控制逻辑流程。过程化SQL:SQL程序的基本结构是块,过程化SQL程序由块组成,这些块之间可以相互嵌套,每个块完成一个逻辑操作。对于嵌入式SQL语言,学习过程中以C++、C#等为高级语言进行混合编程。通过课本和资料了解了ODBC编程和OLEDB编程等多种编程方式。掌握了基本的嵌入式SQL和过程化SQL编程,了解了游标的使用。现在对SQL语句的使用普遍采取框架的方式将SQL语句直接嵌入到高级语言中实现功能,在实验阶段,以ADO.NET为切入点进行了控制台应用程序和可视化编程实验(Java web实验和数据库系统设计实验采用了JDBC对SQL语句进行嵌入),基本掌握了SQL语句的基本使用。
上述收获是翻阅教材目录大体可以在脑中想象的到的,只列出了对于技术和概念方面的感悟,对于知识点的内容没有具体进行展开,因为那样可能就是对书本的复制和复述,意义不大,且由于篇幅限制,也不可能将所有知识点描述的面面俱到,因此不对其进行具体展开。具体概念在今后不明白或者需要重新对课本进行再次阅读时,可再浏览一遍相关概念和内容。但是对于相关概念和解题方式在这里还是要展开一下(并不一定是考试重点,也并不一定是教材重点,但是是在理解的过程中需要注意的一些方面)(时间和篇幅原因,内容并不全面,这里仅写给自己。):
附件一:部分知识点及解题方式概要
附件二:基本SQL语句知识点概要
附件三:基本关系代数简单例题
附件四:ADO.NET实现数据库操作(控制台应用程序+可视化应用程序)

二、课程优点:

老师讲的知识点都非常细致,基本覆盖了教材对本科生要求的内容,在问题答疑方面都是有问必应,同时引导学生积极学习,认真思考,主动提出问题并集体讨论使学生共同学习,共同进步。同时对教材的一些知识进行了扩展,让我们学到了很多东西,也引起了学生的学习积极性和学习兴趣:
通过老师的指导和对教材的学习我挺想进一步了解DBMS的工作原理和架构设计,如何实现数据库各个对象的不同定义,存储,控制和操作以及采用的底层算法和实现是什么。
在引入关系数据库的数据结构及其形式化定义、关系模式的概念、关系的基本操作、传统的集合运算和专门的关系运算等关系代数及关系演算的章节;关系数据理论和属性间依赖关系及其规范化、公理系统及模式分解的章节;查询优化及代数优化等章节,通过关系让数据库和离散数学之间建立了联系(关系数据库),这也是离散数学对信息技术的应用,之前学离散数学不理解关系,集合和代数运算等有什么具体应用,现在学完关系数据库概论有了一个大致的了解。同时对离散数学上的一些关系优化和关系演算产生了一定的兴趣。这也在一定程度上证实了任何学科的发展都离不开数学,比如操作系统二进制的逻辑表示和物理表示,电子信息的基本电子部件的构造关系,数据库系统的理论和实现,机器学习、深度学习等人工智能的数学基础,通信网络的建立和实现等等,几乎各种底层算法的实现都依赖于数学,数学的高度往往决定了一个人在科研方面的水平,甚至是一个国家的水平。因此对于数学的学习是重要的、必要的。
在学习数据库逻辑结构设计和物理结构设计时,充分认识到数据模型优化的重要性和必要性,也同时被关系模式存取方法选择的实现方式所吸引,可能是之前学习C++留下的‘后遗症’,对某些未知概念上的算法实现总是充满好奇,比如DBMS如何自动在某些属性(集合)上建立索引,建立什么样的索引,在哪些属性(集合)上建立索引,待查询操作执行时如何选择较优方式进行执行,何时基于规则的自启发式优化,何时进行代价评估并两者结合等等。
充满好奇的心理有时候会帮助我们进一步学习,驱动着我们向未知的世界探索,但是有时候也会适得其反,有时候我们在没有基础的情况下对某些事物产生了好奇,学习(学会)新鲜事物花费的代价太大了,很多时候我们的时间周转不过来,而对于新的事物领域又学的不太明白,容易忘记,这样就造成了时间浪费了,想学的东西也没有学会,在保持好奇和专于专业学习的两个方面上,我还没有找到最合适的平衡点,这也是接下来我要不断调整的一个地方。老师说,要分清事情的轻重缓急,最迫切的事情先做(比如明天有场考试),其次是那些重要的但是需要长期进行的(比如考研或者英语的学习等等),再然后才是那些可缓一缓且不太重要的(某些兴趣爱好,闲暇的时候喜欢去打打羽毛球等等)。我想接下来的一年中就是要把握好专业课学习和考研准备、某些专业相关知识的学习(非课程要求,比如Python(爬虫,机器学习,深度学习)(数学基础)、数学建模等)的平衡点,在不耽误专业学习的情况下去进行其他方面的学习。(虽然我可能也学不太好,也可能在我以后的学习和工作中用不太到,但是我觉得我还是会根据自己的兴趣去进行,毕竟我比较喜欢探究相关专业知识和新事物的学习,而且来自优秀学长学姐的经验就是没有白学的东西,早晚有一天某个时刻会用到,有三分钟热度,就有三分钟收获,不要害怕学而无用,just do。)

三、课程建议:

对于实验部分,在注重基础SQL语句实现的基础上可适当增加一些关于SQL语句的中高级部分:比如关键字的使用,字符匹配(转义字符的使用),聚集函数的使用,(左/右)外连接,带有谓词的查询(比如IN、NOT IN、ANY、ALL、EXISTS、 NOT EXISTS(将全称量词、蕴含转化为SQL表示)等),基于派生表的查询,视图的创建、查询、更新(注意更新限制条件)、删除等操作;在数据库安全性问题上的授权和回收操作;在完整性约束问题上的约束条件,断言,触发器等操作;SQL函数;数据表(库)转储等等。(一般来说,数据库基本操作如CURD会在java web等课程中进行多次练习和实践。)当然,这会对课程造成很大压力,课程时间往往是不允许的,但可以引导学生去进行这些操作的实践,因为熟练掌握SQL操作是学生后续编程的基础,十分重要。不过这一部分内容被划分到Oracle编程实践指导的课程中,学生还可以继续学习这一部分的相关内容。
对于ADO.NET编程实践,课本知识没有涉及,但考验了学生自己搜索资料(ADO.NET与ADO,.NET,ODBC,OLEDB等具体概念和联系)并进行实践(如何利用ADO/ADO.NET结合C#可视化界面(窗口应用程序)进行编程)的能力。
当然也可能存在一部分同学采用了C++的Qt去实现C++的可视化。(个人感觉C++利用MFC等连接数据库并采用Qt进行可视化展示难度相对较大,因为同学们没有接触过这两个方面的内容,ADO.NET因为同JDBC类似且VS提供了便捷的窗口应用程序创建相对容易上手。)
不采用JDBC+Web展示虽然使很多同学觉得不方便,但是增强了学生自己搜索资料并进行实践编码的能力。
对于理论部分,老师讲的很细致,个人感觉非常好。

四、写在最后:

有时候我觉得程序员就是在改bug中进步的,不断coding才能不断进步。我们在写代码的过程中往往会遇到分析设计思路中未曾料想到的问题,进而对之前的设计思路和结构作进一步调整,在不断的磨练调整中,我们的系统开发能力和思维能力就会得到巨大的提升和转变。在改bug的过程中,我们写代码的能力也将得到进一步提高,很多时候我们不用再去谷歌百度,我们甚至已经知道了bug产生的种种来源,逐个分析解决并捕获可能出现的异常就可以完善系统。我想人生亦是如此,总是在不断失败的过程中寻找正确的方向。数据结构老师说:“我们不要去害怕失败,搞科研搞学术···总是经历一次又一次失败,有时候可能做过成百上千次失败的实验才能取得成功!我们不应该去畏惧,保持一颗平常心,继续努力就好!”。
不断Coding,不断学习,不断进步,加油!
最后感谢老师一个学期的指导,这学期学到了很多东西,谢谢老师指导和陪伴!

很认真的做了数据库的实验课设计报告,但是由于标准参考项有变,老师却把原先的优秀撤销为良好~ 伤心~

附件一(部分知识点及解题方式概要):

数据库求候选码的算法:

【例1】关系模型R<U,F>,U={A,B,C,D},F={B→D,AB→C},求R候选码。

在求解之前先要明白一些定理。我们把函数依赖集中F中的属性分为四类:
L类:所有依赖关系中仅出现在函数依赖左部的属性。
R类:所有依赖关系中仅出现在函数依赖右部的属性。
LR类:所有依赖关系中即出现在函数依赖左部又出现在函数依赖右部的属性。
N类:所有依赖关系中没有出现的属性。

定理一:对于给定的关系模式R及其函数依赖集F,若X(X∈U)是L类属性,则X必为R的任一候选码的成员。
定理二:对于给定的关系模式R及其函数依赖集F,若X(X∈U)是R类属性,则X不在任何候选码中。
定理三:对于给定的关系模式R及其函数依赖集F,若X(X∈U)是LR类属性,则X可能在候选码中。
定理四:对于给定的关系模式R及其函数依赖集F,若X(X∈U)是N类属性,则X必包含在R的任一候选码中。

第一步:先判断属性集U中所有属性属于哪一类。A仅出现在AB→C左边,属于L类。B仅出现在B→D左边和AB→C左边,属于L 类。C仅出现在AB→C右边,属于R类。D仅出现在B→D右边,属于R类。
第二步:由定理可知,A,B必在候选码中,C,D必不在候选码中。因为不知道是否还有其他属性,假定目前候选码K=AB。
第三步:求K=AB的闭包。根据闭包算法(具体请见闭包求法)得,AB+ =ABCD,发现AB的闭包等于属性集U。可以得出结论K=AB就是R的候选码,且是唯一候选码。

但如果第三步中,求得的闭包不等于U,便要继续算下去,看例2。
【例2】关系模型R<U,F>,U={A,B,C,D},F={BCD→A,A→C},求R候选码。
第一步:同样对U中属性进行分类,得出A是LR类,B是L类,C是LR类,D是类。
第二步:由定理可知,B,D必在候选码中,A,C可能在候选码中。假定目前候选码K=BD。
第三步:求K=BD的闭包。根据闭包算法得,BD+=BD,并不等于U。这时,我们从LR类中取一个属性,和BD组成临时候选码K。
第四步:先从LR类中取A,得到K=ABD。再求K=ABD的闭包,得到ABD+=ABCD,正好等于U,说明K=ABD是R的一个候选码。再从LR类中取C,得到K=BCD。再求K=BCD的闭包,得到BCD+=ABCD,也等于U,说明K=BCD也是R的一个候选码。所以R的候选码K={ABD,BCD}。
最后,如果第四步中在LR类中取一个属性的组合都不满足K的闭包等于数据集U,则从LR类中取2个,3个,……n个,分别组合,直到选出一个数据集K的闭包等于属性集U,K就是R的一个属性集。

数据库求属性集闭包的算法:

【例】关系模式R<U,F>,其中U={A,B,C,D,E},F={AB→C,B→D,C→E,EC→B,AC→B},求(AB)+

第一步,令X(0)=AB。
第二步,求X(1)。先列出X(0)的非空子集,即AB的非空子集为{A,B,AB}。然后扫描F集合,寻找{A,B,AB}可能存在的函数依 赖,就可以得到:AB→C,B→D。于是就可以求得X(1)=X(0)∪C∪D=ABCD。然后判断X(0)如果等于X(1)就结束,所求即为答案,如果X(0)不等于X(1)就继续计算。
第三步,求X(2)。同第二步求X(1)得非空真子集,然后在F中一次寻找函数依赖,可以得到:AB→C,B→D,C→E,AC→B。求 得X(2)=X(1)∪C∪D∪E∪B=ABCDE。这时候发现X(2)已经等于全部属性集U了,就结束计算,得出(AB)+ =ABCDE。
注:如果计算的X(2)不等于U,并且仍然不等于X(1),则继续计算下去。直到满足X(i)=X(i-1)或X(i)=U时停止,此时所求闭包为X(i)。

数据库求最小函数依赖集:

【例1】关系模型R<U,F>,U={A,B,C,D,E},F={A→BC,ABD→CE,E→D},求F的最小依赖集。

第一步:将F中所有函数依赖的右边化为单一属性。得到F1={A→B,A→C,ABD→C,ABD→E,E→D}。
第二步:将第一步得到的F1去除其中的冗余依赖关系。假设A→B是冗余依赖关系,去除后F1’={A→C,ABD→C,ABD→E,E→D},我们求A对F’的闭包(算法详见闭包算法)得,A(F1’)+ =AC,不包含B,所以A→B不是冗余依赖关系,不能删除。依次判断F1中的所有函数依赖,去除冗余依赖关系。就得出F2={A→B,A→C,ABD→E,E→D}。
第三步:对第二步所得F2去除其冗余属性。我们只关注函数依赖关系左边为多个的情况(一个必不可能为冗余属性),即观察ABD→E是否包含冗余属性。观察F2发现A→B,所以ABD中B是冗余属性可以删除,得到AD→E,最终得到了F的最小依赖关系F3={A→B,A→C,AD→E,E→D},也可以合并为F3={A→BC,AD→E,E→D}。

数据库中转化为3NF的几个分解算法:

【例】关系模型R<U,F>,U={A,B,C,D,E},F={A→BC,ABD→CE,E→D}
算法一:将关系R转化3NF的保持函数依赖的分解
第一步:首先计算出F的最小依赖集(算法详见最小函数依赖),得到F’={A→BC,AD→E,E→D}。
第二步:观察U中是否有属性不在F’中的出现,如果有,则这个个属性组成一对关系R,并在原来的U中删除这些属性。而例子中U中的属性都出现在F中,则可以跳过这一步。
第三步:对F’中的函数依赖,把左边的相同分为一组,一组中出现的所有属性为一个关系。如F={A→B,A→C,……},左边都为A的分为一组,出项的所有属性组为一个关系R{A,B,C,……}。例题中左边都不相同,所以一个函数依赖组为一个关系得到转化为3NF的保持依赖分解R1{A,B,C},R2{A,D,E},R3{E,D}。

算法二:将关系R转化3NF的既有无损连接性又保持函数依赖的分解
第一步:先将R转化3NF的保持函数依赖的分解,由算法一得出R1{A,B,C},R2{A,D,E},R3{E,D}。
第二步:求出F的候选码(算法相见候选码算法)得出候选码X为AD和AE。
第三步:将候选码单独组成关系得R4{A,D}和R5{A,E},然后与保持函数依赖后的分解取并集。得R1{A,B,C},R2{A,D,E},R3{E,D},R4{A,D},R5{A,E}。
第四步:观察新组成的分解模式中,是否存在包含关系,有则去掉被包含的。如R3{E,D},R4{A,D},R5{A,E}都包含于R2{A,D,E},则删去,最终得到转化3NF的既有无损连接性又保持函数依赖的分解R1{A,B,C},R2{A,D,E}。

有关系R=ABC, 依赖关系{A–>B}那么下面哪个是无损分解:
A. {R1(AB),R2(AC)}
B.{R1(AB),R3(BC)}

首先看选项A,R1∩R2=A,R1-R2=B,R1U R2–>(R1-R2).所以它是无损分解
选项B, R1∩R2=B, R1-R2=A, R2-R1=C,
所以它不是无损分解

判断无损分解的方法
对两个集合先求集合的∩,然后求集合的差(2个集合有两个差的结果)
如果集合的∩–>集合的差(得到差结果的任意一个)成立那么就是无损分解

在数据库的安全性控制中,授权的数据对象的(A ),授权子系统就越灵活。
A. 范围越小 B. 约束越细致
C. 范围越大 D. 约束范围大

E-R模型中,“基数”是指( D )。

A.实体集的实体数目的最小值和最大值
B.实体中的属性数目的最小值和最大值
C.与一个实体集有联系的实体集数目的最小值和最大值
D.与一个实体有联系的实体数目的最小值和最大值

实体基数
某学校规定,每一个班级至多有50名学生,至少有10名学生;每一名学生必须属于一个班级。在班级与学生实体的联系中,学生实体的基数是( B )
A(0, 1)
B(1, 1)
C(1, 10)
D(10, 50)
每一名学生必须属于一个班级
所以最多是1 最少也是1

附件二(基本SQL语句知识点概要):

附件三(基本关系代数简单例题):

附件四(ADO.NET实现数据库操作(控制台应用程序+可视化应用程序)):