1.1.4 关系型数据库
数据库技术发展至今已经有 50多年,主要按照数据模型的发展而演变,经历了层次和网状数据库系统、关系型数据库系统、面向对象数据库系统。基于层次模型(Hierarchical Model)、网状模型(Network Model)的层次和网状数据库系统构成早期的数据库产品,基于关系模型(Relational Model)的关系数据库系统当前被大量使用,如Access 2016就是基于关系模型的关系型数据库管理系统。基于面向对象模型(Object Oriented Model)的数据库系统现阶段商业化程度还不够高,大多处在实验研究阶段,有待成熟。
1.实体联系模型
在创建一个数据库应用系统之前,先要搞清楚用户需要从数据库得到什么?从而决定数据库中要存储哪些数据及如何存储这些数据。要解决这个问题,需要分析理解现实世界中的客观事物,对它某一方面的客观属性进行描述,如描述某个学生,总是用他的姓名、性别、年龄、籍贯、家庭住址、家庭成员等属性来反映他的客观存在。这样,人的认识从客观世界(现实世界)进入了概念世界(信息世界)。下一步就断定数据库存储的学生记录中需要有姓名、性别、年龄、籍贯、家庭住址、家庭成员等字段,这就进入了数据世界(计算机世界)。上述的分析过程只是一种近似的描述,在数据库技术领域,使用严格的数学模型工具完成相应的工作。实体联系模型(Entity Relationship,E-R)就是一种描述信息世界的模型,它只描述用户所关心的信息结构,而不涉及信息在计算机中的表示,是一种与任何计算机系统无关的“概念数据模型”,是用户与数据库设计人员之间进行交流的工具。
E-R模型中常用到实体、实体集、属性、码、域、联系和E-R图,它们的概念如下。
(1)实体(Entity)。
客观存在并可相互区别的事物被称为实体。实体可以是具体的人、事、物,也可以是抽象的概念或联系。例如,一个学生、一所院校、学生与院校的就学关系等都是实体。同一个事物在不同的场合可以是不同的实体。例如,小张在学校是学生,在家庭是子女。
(2)实体集(Entity Set)。
同一类型的实体的集合构成实体集。例如,全体学生就是一个实体集。
(3)属性(Attribute)。
实体在某一方面的特性被称为属性,一个实体可以由若干个属性来刻画。例如,学生实体的学号、姓名、性别、出生日期、所在院系等属性表示了学生实体的5个方面的特性。实体名和各个属性名的集合构成实体型。例如,学生(学号,姓名,性别,出生日期,所在院部)就是一个实体型,(200610201,李建,男,1988/6/6,音乐学院)就是学生实体型的一个实体。
(4)码(Key)。
能唯一表示每个实体的属性集合被称为码(关键字)。例如,在学生实体中的学号。而姓名则不是,因为可能出现重名。
(5)域(Domain)。
属性的取值范围被称为该属性的域。例如,学号的域是 8 位正整数,性别的域为(男、女),姓名的域为8个字符串集合。
(6)联系(Relationship)。
现实世界的事物之间总是存在某种联系的,任何实体都不可能孤立存在,实体的联系包括实体内部的联系(通常指组成实体的各属性之间的联系)和实体之间的联系。
两个实体之间的联系可分为以下3类。
① 一对一联系(1∶1)。
如果实体集A中的每一个实体仅对应实体集B中最多一个(也可以没有)实体,反之亦然,则称实体集A与实体集B具有一对一联系,记为1∶1。例如,一夫一妻制下的丈夫与妻子、公民与身份证、学生与学号等。
② 一对多联系(1∶n)。
如果实体集A中的每一个实体与实体集B中一个以上的实体对应;反之,对实体集B中的每一个实体,实体集A中最多只有一个实体与之对应,则称实体集A与实体集B具有一对多联系,记为 1∶n。例如,班级与学生、学校与院系、工厂与车间、国家与省份、省份与县市等。
③ 多对多联系(m∶n)。
如果实体集A中的每一个实体与实体集B中一个以上的实体对应;反之,实体集B中的每一个实体也与实体集 A 中一个以上的实体对应,则称实体集 A 与实体集 B 具有多对多联系,记为n∶m。例如,一个学生可以同时选择多门课程,一门课程可以供多个学生选择,所以学生与课程之间就具有多对多联系。
(7)E-R图。
E-R图提供了表示实体、属性和联系的图示方法,是由P.P.S Chen 于1976年提出的,用于描述客观世界的概念模型。
① 矩形表示实体型,矩形框内为实体名。
② 椭圆形表示属性,椭圆形框内为属性名,并用无向边将其与实体连接。
③ 菱形表示联系,菱形框内为联系名,并用无向边分别与有关实体型连接,同时注明联系类型(1∶1、1∶n或m∶n)。如果联系有属性,则要用无向边与该联系连接起来。
图1-5所示为某高校教师教学情况的E-R图。
图1-5 某高校教师教学情况的E-R图
学校有若干个系部,每个系部有若干个教师。每个教师可讲授多门课程。本教学实体涉及“系部”“教师”“课程”3 个实体,系部与教师之间的“隶属”关系为一对多的联系,教师与课程之间的“授课”关系为多对多的联系。假设“系部”实体的属性有系号、系名和系主任,“教师”实体的属性有教工号、姓名和性别,“课程”实体的属性有课程号、课程名和学分,“授课”联系的属性是次数。
2.关系模型
使用 E-R 图将客观世界抽象为概念世界以后,还要再将概念世界转换为机器世界,这时需要使用数据模型。数据模型主要有层次模型、网状模型、关系模型和面向对象模型。其中,关系模型是Access 数据库管理系统所使用的。
利用二维表结构来表示实体联系的数据模型被称为关系模型。关系数据模型以关系数学理论为基础,一个关系对应一个二维表。直观上无论是实体还是实体之间的联系都使用关系(一个二维表)来表示。例如,教师、课程、教师与课程之间的“授课”联系都使用关系来表示,如表1-1所示。
表1-1 “教师”关系
“授课”关系
“课程”关系
(1)关系术语。
① 关系。
一个关系就是一个二维表,每个关系有一个关系名,又被称为表名(见表1-1)。其中,有“教师”“课程”“讲授”3个关系(表)。在Access中,一个关系就是数据库文件中的一个表,具有一个表名。例如,“教师”表、“课程”表、“授课”表。
② 元组。
表中的一行就是一个元组,又被称为一条记录。在Access中,元组对应数据库文件表中的一条记录。例如,教工号为001、姓名为张晴的记录。
③ 属性。
表中的一列就是一个属性,又被称为一个字段。每个属性有一个属性名。在Access中,一个属性叫作一个字段,每个字段有一个字段名。例如,教工号、姓名、性别、系号等字段。
④ 域。
域是属性的取值范围。例如,“男”或“女”是性别的取值范围,对应的是性别字段的一个域。
⑤ 关系模式。
对关系的描述被称为关系模式,它对应一个关系的结构。写成关系名(属性1,属性2,…,属性n)。
例如,在表1-1中,“教师”表的关系模式为教师(教工号,姓名,性别,系号)。
⑥ 主关键字。
在表中能够唯一标识一条记录的字段或字段组合被称为候选关键字。例如,教工号和系号都是候选关键字。一个表可能有多个候选关键字,从中选择一个作为主关键字,又被称为主键。例如,“教师”表中的“教工号”字段在每条记录中是唯一的,因此教工号就是主键。
⑦ 外部关键字。
如果表A和表B中有公共字段,且该字段在表B中是主键,则该字段在表A中被称为外部关键字或外键。例如,“授课”表和“课程”表中都有“课程号”字段,且“课程号”在“课程”表中是主键,则“课程号”在“授课”表中就是外键。
在关系型数据库中,主键和外键表示了两个表之间的联系。例如,“课程”表和“授课”表中的记录可以通过公共的“课程号”字段相联系,当要查找某名教工号的教师讲授的课程时,可以先在“授课”表中找出该教工号所属的课程号,再到“课程”表中找出该课程号所对应的课程。
(2)关系模型的主要特点。
关系模型对关系有一定的要求,关系模型的主要特点如下。
① 在关系(表)中每一个属性(字段)不可再分,是最基本的单位。就是表中不能再有表。
② 在同一个关系(表)中不能有相同的属性名(字段名)。
③ 在关系(表)中不允许有相同的元组(记录)。
④ 在关系(表)中各属性(字段)的顺序是任意的。
⑤ 在关系(表)中元组(记录)的顺序是任意的。
⑥ 在关系(表)中每一列元素必须是同一类型的数据。
(3)关系运算。
从一个关系或几个关系中查询所需要的数据,就要使用关系运算。关系运算的对象是一个关系,运算结果仍是一个关系。关系的基本运算分为传统的集合运算(并、差、交等)和专门的关系运算(选择、投影和连接)。
① 并(Union)。
假设关系A和B具有相同的关系模式,由两个关系A和B的并产生一个新的关系C,C由A和B去掉重复记录后所有的记录组成。记作C=A∪B,如表 1-2所示。
表1-2 C=A∪B
② 差(Difference)。
假设关系A和B具有相同的关系模式,由两个关系A和B的差产生一个新的关系C,C由属于A但不属于B的记录组成。记作C=A-B,如表 1-3所示。
表1-3 C=A-B
③ 交(Intersection)。
假设关系A和B具有相同的关系模式,由两个关系A和B的差产生一个新的关系C,C由既属于A又属于B的所有记录组成。记作C=A∩B,如表 1-4所示。
表1-4 C=A∩B
④ 选择(Selection)。
从一个关系中找出满足条件的记录的操作称为选择。选择是从原来的表中选出某些符合条件的行,其结果是原关系的一个子集。例如,从表1-1所示的“教师”表中选择所有男教师的记录,结果如表1-5所示。
表1-5 选择运算
⑤ 投影(Projection)。
从一个关系中选出若干个字段组成新的关系称为投影。投影是从原来的表中选出某些列(或全部)组成新表,相当于对关系进行垂直分解。新关系的关系模式所包含的字段个数通常比原关系的字段个数少,或者字段的排列顺序不同。例如,从表1-1所示的“教师”表中找出所有教师的教工号、姓名和性别,结果如表1-6所示。
表1-6 投影运算
⑥ 联接(Join)。
联接是指把两个关系中字段满足一定条件的记录横向结合,组成一个新的关系。新关系中包含满足联接条件的记录。
在联接操作中,以两个关系的字段值对应相等为条件进行的联接称为等值联接(Equal Join)。去掉重复字段的等值联接称为自然联接(Natural Join),它利用两个关系中的公共字段(或语义相同的字段),把该字段值相等的记录联接起来。自然联接是常用的联接运算。例如,将表1-1中的“授课”表和“教师”表进行自然联接,结果如表1-7所示。
表1-7 联接运算
(4)关系规范化。
关系型数据库中的关系是要满足一定要求的,满足一定要求的关系模式称为范式(Normal Form,NF)。满足最低要求的关系模式称为第一范式(1NF)。在第一范式中进一步满足一些要求的关系模式称为第二范式(2NF),还有第三范式(3NF)、BC 范式(BCNF)、第四范式(4NF)和第五范式(5NF)。
在关系型数据库中,任何一个关系模式都必须满足第一范式,即表中的每个字段必须是不可分割的数据项(表中不能再包含表)。然而满足第一范式的关系并不是最好的关系,仍然存在不少缺点,如数据冗余太多,有必要对其进行分解使之满足更高的范式。将一个低级范式的关系模式通过投影运算分解为若干个高级范式的关系模式的集合,这种过程称为规范化。
关系规范化可以避免大量的数据冗余、节省存储空间、保持数据的一致性。但由于信息被存储在不同的关系中,在一定程度上增加了操作的难度。
(5)关系的完整性。
为了保证数据库中的数据与现实世界中的数据一致,需要对关系模型中的关系施加完整性约束条件,以保证数据的正确性、有效性和相容性。关系模型中有以下3类完整性约束。
① 实体完整性。
因为现实世界中的每一个实体都是可以区分的,实体完整性规则要求关系中的主键不能取空值或重复的值。所谓空值就是“不知道”或“无意义”的值。
例如,在“教师”表中,“教工号”为主键,“教工号”字段就不能取空值,也不能有重复值。在“授课”表中,“教工号”和“课程号”构成主键,这两个字段都不能取空值,也不允许该表中任何两条记录的教工号和课程号的值完全相同。
② 参照完整性。
参照完整性规则要求“不允许参照不存在的实体”,即外键或者取空值,或者等于相应关系中主键的某个值。
例如,“授课”表中的“课程号”是“课程”表的主键,是“授课”表的外键,“授课”表中的“系号”字段只能取空值(表示教师未授某门课程),或者取“课程”表中已有的一个课程号值(表示教师已授某门课程)。
③ 用户定义的完整性。
实体完整性和参照完整性是关系模型必须满足的完整性约束条件,它们由系统自动支持。此外,用户还可以根据某一个具体应用所涉及的数据必须满足语义的要求,自定义完整性约束,这类完整性又被称为域完整性。
例如,在“课程”表中,如果要求学分最少2分,最多5分,用户就可以在表中定义学分字段为整数型数据,取值范围为2分~5分。