1.5 关系数据库的基本知识

关系数据库采用人们熟悉的二维表格来描述实体及实体之间的联系,一经问世,就赢得了用户的广泛青睐和数据库开发商的积极支持,使其迅速成为继层次数据库、网状数据库后的一种崭新的数据库,并后来居上,在数据库技术领域占据统治地位。

1.5.1 关系数据库的基本概念

关系模型的基本数据结构是关系,即我们平时所说的二维表格,在E-R模型中对应于实体集,而在数据库中关系又对应于表,因此二维表格、实体集、关系、表指的是同一概念,只是使用的场合不同而已。

1. 关系

通常可将一个没有重复行、重复列,并且每个行列的交叉点只有一个基本数据的二维表格看成一个关系。二维表格包括表头和表中的内容,相应地,关系包括关系模式和记录的值,表包括表结构(记录类型)和表的记录,而满足一定条件的规范化关系的集合,就构成了关系模型。

尽管关系与二维表格、传统的数据文件有相似之处,但它们之间又有着重要的区别。严格地说,关系是一种规范化了的二维表格。在关系模型中,对关系做了种种规范性限制,关系具有以下6条性质。

① 关系必须规范化,每一个属性都必须是不可再分的数据项。规范化是指关系模型中每个关系模式都必须满足一定的要求。最基本的要求是关系必须是一个二维表格,每个属性必须是不可分割的最小数据单元,即表中不能再包含表。例如,表1-2就不能直接作为一个关系,因为该表的“教师人数”列有4个子列,这与每个属性不可再分割的要求不符。只要去掉“教师人数”项,而将“助教人数”“讲师人数”“副教授人数”“教授人数”直接作为基本的数据项就可以了。

表1-2 不能直接作为关系的表格示例

0

② 列是同质的,即每一列中的分量是同一类型的数据,来自同一个域。

③ 在同一关系中不允许出现相同的属性名。

④ 关系中不允许有完全相同的元组。但在大多数关系数据库产品中,如Access、Visual FoxPro、Oracle等,如果用户没有定义有关的约束条件,它们都允许关系表中存在两个完全相同的元组。

⑤ 在同一关系中,元组的次序无关紧要。也就是说,任意交换两行的位置并不影响数据的实际含义。

⑥ 在同一关系中,属性的次序无关紧要。也就是说,任意交换两列的位置并不影响数据的实际含义,不会改变关系模式。

以上是关系的基本性质,也是衡量一个二维表格是否构成关系的基本要素。在这些基本要素中,属性不可再分割是关键,这构成了关系的基本规范。

在关系模型中,数据结构简单、清晰,同时有严格的数学理论作为指导,为用户提供了较为全面的操作支持,所以关系数据库成为当今数据库应用的主流。

2. 元组

二维表格的每一行在关系中称为元组(Tuple),相当于表的一条记录(Record)。二维表格的一行描述了现实世界中的一个实体。例如,在表1-1中,每行都描述了一个教师的基本信息。在关系数据库中,行是不能重复的,即不允许两行的全部元素完全对应相同。

3. 属性

二维表格的每一列在关系中称为属性(Attribute),相当于记录中的一个字段(Field)或数据项。每个属性都有一个属性名,一个属性在其每个元组上的值称为属性值,因此,一个属性包括多个属性值,只有在指定元组的情况下,属性值才是确定的。同时,每个属性都有一定的取值范围,即该属性的值域,如表1-1中的第3列,属性名是“性别”,取值是“男”或“女”,不是“男”或“女”的数据应被拒绝存入该表,这就是数据约束条件。同样,在关系数据库中,列是不能重复的,即关系的属性不允许重复。属性必须是不可再分的,即属性是一个基本的数据项,不能是几个数据的组合项。

有了属性的概念后,可以这样定义关系模式和关系模型:关系模式是属性名及属性值域的集合,关系模型是一组相互关联的关系模式的集合。

4. 关键字

关系中能唯一区分、确定不同元组的单个属性或属性组合,称为该关系的一个关键字。关键字又称键或码(Key)。单个属性组成的关键字称为单关键字,多个属性组成的关键字称为组合关键字。需要强调的是,关键字的属性值不能取“空值”,因为“空值”无法唯一地区分、确定元组。所谓“空值”就是“不知道”或“不确定”的值。

在如表1-1所示的关系中,“性别”属性无疑不能充当关键字,“职称”属性也不能充当关键字,从该关系现有的数据分析,“编号”和“姓名”属性均可单独作为关键字,但“编号”属性作为关键字会更好一些,因为可能会有教师重名的现象,而教师的编号是唯一的、是不会相同的。这也说明,某个属性能否作为关键字,不能只对现有数据进行归纳确定,还应根据该属性的取值范围进行分析判断。

关系中能够作为关键字的属性或属性组合可能不是唯一的。凡在关系中能够唯一区分、确定不同元组的属性或属性组合,称为候选关键字(Candidate Key)。例如,表1-1所示关系中的“编号”和“姓名”属性都是候选关键字(假定没有重名的教师)。

在候选关键字中选定一个作为关键字,称为该关系的主关键字或主键(Primary Key)。关系中主关键字的取值是唯一的。

5. 外部关键字

如果关系中某个属性或属性组合是另一个关系的关键字,则称这样的属性或属性组合为本关系的外部关键字或外键(Foreign Key)。在关系数据库中,用外部关键字表示两个表之间的联系。例如,在表1-1的教师关系中,增加“部门代码”属性,则“部门代码”属性就是一个外部关键字,该属性是部门关系的关键字,该外部关键字描述了教师和部门两个实体之间的联系。

1.5.2 关系运算

在关系模型中,数据是以二维表格的形式存在的,这是一种非形式化的定义。由于关系是属性个数相同的元组的集合,因此可以从集合论的角度对关系进行集合运算。

利用集合论的观点,关系是元组的集合,每个元组包含的属性数目相同,其中,属性的个数称为元组的维数。通常,元组用圆括号括起来的属性值表示,属性值间用逗号隔开,如(T1,赵琳琳,女,09/24/56,教授,3 200,软件工程)是7元组。

假设A1,A2,…,An是关系R的属性,通常可用RA1,A2,…,An)来表示这个关系的一个框架,也称为R的关系模式。属性的名字唯一,属性Ai的取值范围Dii=1,2,…,n)称为值域。

将关系与二维表进行比较可以看出两者存在简单的对应关系,关系模式对应一个二维表的表头,而关系的一个元组就是二维表的一行。在很多时候,甚至不加区别地使用这两个概念。例如,表1-1所示的教师关系可以写成元组集合的形式,教师关系={(T1,赵琳琳,女,09/24/56,教授,3 200,软件工程),(T2,黄理科,男,11/27/73,讲师,1 960,数据库技术),(T3,童天福,男,12/23/81,助教,1 450,网络技术),(T4,安勤熙,男,01/27/63,副教授,2 100,信息系统),(T5,李丹思,女,07/15/79,助教,1 600,信息安全),(T6,刘穆奋,男,09/21/65,教授,3 500,数据库技术)}。

在关系运算中,并(Union)、交(Intersection)、差(Difference)运算是从元组(表格中的一行)的角度来进行的,沿用了传统的集合运算规则,也称为传统的关系运算;连接(Selection)、投影(Projection)、选择(Join)运算是关系数据库中专门建立的运算规则,不仅涉及行而且涉及列,因此称为专门的关系运算。

1. 传统的关系运算

(1)并

RS同为n元关系,且相应的属性取自同一个域,则RS的并也是一个n元关系,记作RSRS包含了所有分属于RS或同属于RS的元组。因为集合中不允许有重复元素,因此,同时属于RS的元组在RS中只出现一次。

(2)差

RS同为n元关系,且相应的属性取自同一个域,则RS的差也是一个n元关系,记作R-SR-S包含了所有属于R但不属于S的元组。

(3)交

RS同为n元关系,且相应的属性取自同一个域,则RS的交也是一个n元关系,记作RSRS包含了所有同属于RS的元组。

实际上,交运算可以通过差运算的组合来实现,如AB=A-(A-B)或B-(B-A)。

(4)广义笛卡儿积

R是一个包含m个元组的j元关系,S是一个包含n个元组的k元关系,则RS的广义笛卡尔积是一个包含m×n个元组的jk元关系,记作R×S,并定义:

R×S={(r1r2,…,rj,s1,s2,…,sk)|(r1,r2,…,rj)∈R且{s1,s2,…,sk}∈S}

R×S的每个元组的前j个分量是R中的一个元组,后k个分量是S中的一个元组。

例1-1 设R={(a1b1c1),(a1b2c2),(a2b2c1)},S={(a1b2c2),(a1b3c2),(a2b2c1)},求RSR-SRSR×S

根据运算规则,有如下结果。

RS={(a1b1c1),(a1b2c2),(a2b2c1),(a1b3c2)}

R-S={(a1b1c1)}

RS={(a1b2c2),(a2b2c1)}

R×S={(a1b1c1a1b2c2),(a1b1c1a1b3c2),(a1b1c1a2b2c1),(a1b2c2a1b2c2),(a1b2c2a1b3c2),(a1b2c2a2b2c1),(a2b2c1a1b2c2),(a2b2c1a1b3c2),(a2b2c1a2b2c1)}

R×S是一个包含9个元组的6元关系。

2. 专门的关系运算

(1)选择

R={(a1,a2,…,an)}是一个n元关系,F是关于(a1,a2,…,an)的一个条件,R中所有满足F条件的元组组成的子关系称为R的一个选择,记作σFR),并定义:

σFR)={(a1,a2,…,an)|(a1,a2,…,an)∈R且(a1,a2,…,an)满足条件F}

简言之,对R关系按一定规则筛选一个子集的过程就是对R施加了一次选择运算。

(2)投影

R=RA1,A2,…,An)是一个n元关系,{i1,i2,…,im}是{1,2,…,n}的一个子集,并且i1<i2<…<im,定义:

π(R)=R1Ai1Ai2,…,Aim

即π(R)是R中只保留属性Ai1,Ai2,…,Aim的新的关系,称π(R)是RAi1,Ai2,…,Aim属性上的一个投影,通常记作000

通俗地讲,关系R上的投影是从R中选择出若干属性列组成新的关系。

(3)连接

连接是从两个关系的笛卡尔积中选取属性间满足一定条件的元组,记作R000S。其中,AB分别为关系RS上维数相等且可比的属性组,θ是比较运算符。连接运算从RS的笛卡儿积R×S中选取(R关系)在A属性组上的值与(S关系)在B属性组上值满足比较关系θ的元组。

连接运算中有两种最为重要也最为常用的连接,一种是等值连接,另一种是自然连接。θ为“=”的连接运算称为等值连接,它是从关系RS的笛卡儿积中选取AB属性值相等的那些元组。自然连接是一种特殊的等值连接,它要求在结果中把重复的属性去掉。一般的连接操作是从行的角度进行运算,但自然连接还需要取消重复列,所以是同时从行和列的角度进行运算。

例1-2 一个关系数据库由职工关系E和工资关系W组成,关系模式如下。

E编号,姓名,性别)

W编号,基本工资,标准津贴,业绩津贴)

写出实现以下功能的关系运算表达式。

① 查询全体男职工的信息。

② 查询全体男职工的编号和姓名。

③ 查询全体职工的基本工资、标准津贴和业绩津贴。

根据运算规则,写出关系运算表达式如下。

① 对职工关系E进行选择运算,条件是“性别='男'”,关系运算表达式是:

σ性别='男'(E)

② 先对职工关系E进行选择运算,条件是“性别='男'”,这时得到一个男职工关系,再对男职工关系在属性“编号”和“姓名”上作投影计算,关系运算表达式是:

π(编号,姓名)σ性别='男'E))

③ 先对职工关系E和工资关系W进行连接运算,连接条件是“E.编号=W.编号”,这时得到一个职工工资关系,再对职工工资关系作投影计算,关系运算表达式是:

0

1.5.3 关系的完整性约束

为了防止不符合规则的数据进入数据库,数据库管理系统一般提供了一种对数据的监测控制机制,这种机制允许用户按照具体应用环境定义自己的数据有效性和相容性条件。在对数据进行插入、删除、修改等操作时,数据库管理系统自动按照用户定义的条件对数据实施监测,使不符合条件的数据不能进入数据库,以确保数据库中存储的数据正确、有效、相容。这种监测控制机制称为数据完整性保护,用户定义的条件称为完整性约束条件。在关系模型中,数据完整性包括实体完整性(Entity Integrity)、参照完整性(Referential Integrity)及用户自定义完整性(User defined Integrity)3种。

1. 实体完整性

现实世界中的实体是可区分的,即它们具有某种唯一性标识。相应地,关系模型中以主关键字作为唯一性标识。主关键字中的属性即主属性不能取“空值”。如果主属性取“空值”,就说明存在某个不可标识的实体,即存在不可区分的实体,这与现实世界的应用环境相矛盾,因此这个实体一定不是一个完整的实体。

实体完整性就是指关系的主属性不能取“空值”,并且不允许两个元组的关键字值相同。也就是一个二维表中没有两个完全相同的行,因此实体完整性也称行完整性。

2. 参照完整性

现实世界中的实体之间往往存在某种联系,在关系模型中实体及实体间的联系都是用关系来描述的,这样就自然存在着关系与关系间的引用。

F是关系R的一个或一组属性,但不是关系R的关键字,如果F与关系S的主关键字KS相对应,则称F是关系R的外部关键字,并称关系R为参照关系(Referencing Relation),关系S为被参照关系(Referenced Relation)或目标关系(Target Relation)。

参照完整性规则就是定义外部关键字与主关键字之间的引用规则,即对于R中每个元组在F上的值必须取“空值”或等于S中某个元组的主关键字值。

3. 用户自定义完整性

实体完整性和参照完整性适用于任何关系数据库系统。除此之外,不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件,用户自定义完整性就是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求,如规定关系中某一属性的取值范围。