软件设计师考试——01 数据库基础
![软考-数据库基础]({{ site.url }}/
-
概述
-
首先是数据库相关的一些概念
**外模式,**也称为“用户模式”或“子模式”。可以理解为数据库系统对用户暴露出来的部分,用户对数据进行的基本操作,增删改查都是在这个层次进行;
**概念模式,**也称为“模式”。可以理解为逻辑上的数据,更多的是反映人的思维和对显示数据的抽象;
**内模式,**也称为“存储模式”。可以理解为物理上的数据,这部分就跟用户无关了,数据库系统对数据进行如何存储,用户都是不关心的
外模式/模式映像,维护数据的逻辑独立性。数据的逻辑结构发生变化,对用户的操作还是不变的,变动的部分由外模式/模式映像去维护
模式/内模式映像,维护数据的物理独立性。数据的物理存储发生变化,数据的逻辑结构不会发生变化,变动的部分由模式/内模式映像去维护
简而言之,两级映像存在的目的是解耦数据库系统的三级模式
-
其次是数据模型
- 数据模型分为概念模型和基本数据模型
- 概念模型主要用于数据库分析和设计,通过对现实世界进行抽象,形成逻辑关系,建立数据模型
- 其代表为实体-关系模型,即E-R图
- 除了基本的实体,联系(一对一,一对多,多对多),属性外,主要考虑扩充的E-R图,弱实体(依赖于其他实体的存在而存在),特殊化和普遍化这一对逆过程
- 基本数据模型主要反映数据的逻辑结构,主要包括层状模型、网状模型、关系模型、面向对象模型,其中关系模型使用最为广泛。
- 基于关系模型,存在关系代数
- 关系代数包括四类运算符:集合运算符、比较运算符、逻辑运算符、专门的关系运算符
- 集合运算符主要用于对数据集进行集合运算,对应到SQL中就是对结果集进行再处理
- 比较运算则是数据属性之间的比较,对应到SQL中就是条件判断
- 逻辑运算符是用于条件的组合,对用SQL中就是AND、OR、NOT
- 专门的关系运算符就是对列进行筛选、对行进行筛选、表连接
- 连接运算是比较复杂的,θ连接中的θ是比较运算符,当θ为“=”时则为等值连接,自然连接为特殊的等值连接,要求进行比较的属性组必须相同,而且在结果集中要删除多余的属性组
- 因为θ连接会将没有“连接上”的记录去掉,导致信息缺失,因此又有了外连接,具体分为左外连接、右外连接、全外连接,不同的连接方式,保留的属性值不同,不存在的属性值置为null
- 关系代数包括四类运算符:集合运算符、比较运算符、逻辑运算符、专门的关系运算符
- 基于关系代数,我们有了SQL,包括:
- 数据定义语言(DDL),用于***创建/修改/删除*** 数据库、表、视图、索引
- 数据操作语言(DML),用于对表进行***增删改***
- 数据查询语言(DQL),用于对表的***查询***
- 数据控制语言(DCL),用于***控制数据权限***
-
最后是关系模式规范化
-
要理解规范化,首先要明白什么是函数依赖:
- 用数学的话来说就是两个变量之间存在函数关系。变量有域,自变量(X)有定义域,因变量(Y)有值域,存在函数关系就是说,x能算出y,即X→Y,Y函数依赖于X
- 非平凡的函数依赖就是说,X和Y是两个不同的集合时,Y函数依赖于X
- 平凡的函数依赖就是说,虽然Y函数依赖于X,但是Y是X的子集,这种依赖是显然的,没有特殊意义,因此一般而言都是考虑非平凡的函数依赖
- 完全函数依赖就是说,对于每个x都能算出y,而X的真子集,不能完全算出Y(因为有部分y,需要真子集以外的x来计算出来)。对应到关系模式中,可能X包含多个属性列,比如3个属性,能推导出Y,但是其中任何2个属性组合在一起都不能推导出Y,那么就说Y完全函数依赖于X
- 部分函数依赖与完全函数依赖相反,X的真子集也能推导出Y
- 传递依赖就是三个属性列(组)之间的关系,Y非平凡依赖于X,Z函数依赖于Y,那么Z就函数依赖与X
-
如果关系模式存在过多的函数依赖,那么就会存在异常:
- 冗余,这个好理解,关系模式中会存储很多份同样的数据
- 插入异常,若一个关系模式中既存储了教师信息,也存储了教师的课程信息,那么新来的教师如果没有开始教课的话那就无法插入了
- 更新异常,更新一个教师信息就需要把所有该教师相关的信息都要更新一次
- 删除异常,删除一个教师信息就会把该教师相关的课程信息都会删除掉
-
范式
-
1NF,所有的数据项都是原子项,不可再分。
这是关系模式最基本的要求
-
2NF,在1NF的基础上,非主属性完全依赖于码。
比如关系模式R(A,B,C,D)码中有2个属性(A、B),另有一个非主属性(C)依赖于这两个主属性中的其中一个(A)(部分依赖于码),那就应该拆出来,作为另一个关系模式R1(A,C)
-
3NF,在2NF的基础上,非主属性不能传递依赖于码。
比如关系模式R(A,B,C),A是码,B、C完全依赖于A,同时C也依赖于B,那么C就传递依赖于A,那么应该把C拆出来,作为另外一个关系模式R2(B,C)
-
BCNF,3NF消除了非主属性与主属性之间的部分依赖和传递依赖,但是若主属性存在多个,那么也要消除主属性之间的部分依赖于传递依赖,这就是BCNF。
比如存在关系模式R(A,B,C,D),(A,B)和(A,C)都是候选码,则(A,B,C)都是主属性,D完全依赖于码,B依赖于A,A依赖于B,这样的R是符合3NF的,但是依旧存在异常。因此可以把AB单独抽出来,最后形成两个关系模式R1(A,B),R2(A,C,D)/R2(B,C,D)
-
-
-