
1.3 数据模型与关系数据库
数据库中存储和管理的数据都是来源于现实世界的客观事物,计算机不能直接处理这些具体事物,为此,人们必须把具体事物转换成计算机能处理的数据。这个转换过程分两步:先将现实世界抽象为信息世界,建立概念模型;再将信息世界转换为计算机世界,建立数据模型。
1.3.1 概念模型
现实世界中的事物及联系经过分析、归纳、抽象,形成信息世界。在信息世界中,为直观地反映事物及其联系而建立起来的模型称为概念模型。它是按用户的观点对信息建立的模型,不依赖于具体计算机系统,主要用于数据库的设计。
目前常用实体-联系模型表示概念模型。
1.实体
客观存在并且可以相互区别的事物称为实体。实体可以是具体的人、事、物,如一名学生、一本书、一门课程等;也可以是事件,如学生的一次选课、一场比赛、一次借书等。
2.实体的属性
实体所具有的某一特性称为属性。如学生实体有学号、姓名、性别、出生日期、专业等多个属性。属性包括属性名和属性值,如学号、姓名、性别、出生日期、专业等为属性名,(13011103,许志华,男,06/12/1995,机械工程)为某个学生实体的属性值。
3.实体型
用实体名及其属性名来抽象描述同一类实体,称为实体型。例如,学生(学号,姓名,性别,出生日期,专业)就是一个实体型,它描述的是学生这一类实体。
4.实体集
同类型实体的集合称为实体集。例如,全体学生就是一个实体集,而(13011103,许志华,男,06/12/1995,机械工程)是这个实体集中的一个实体。
实体集和实体型的区别在于:实体集是同一类实体的集合,而实体型是同一类实体的抽象描述。
5.实体间的联系
实体间的联系通常是指两个实体集之间的联系,联系有以下3种类型:
(1)一对一联系(1:1)
如果对于实体集A中的每一个实体,在实体集B中至多有一个实体与之联系,反之亦然,则称实体集A与实体集B具有一对一联系,记为1:1。
例如:在学校,一个班级只有一个班长,而一个班长只能在一个班级任职,则班级和班长之间具有一对一的联系。
(2)一对多联系(1:n)
如果对于实体集A中的每一个实体,在实体集B中有n个实体(n≥0)与之联系,反之,对于实体集B中的每一个实体,实体集A中至多只有一个实体与之联系,则称实体集A与实体集B有一对多联系,记为1:n。
例如:一个班级有多个学生,而每个学生只在一个班级中学习,则班级与学生之间具有一对多的联系。
(3)多对多联系(m:n)
如果对于实体集A中的每一个实体,在实体集B中有n个实体(n≥0)与之联系,反之,对于实体集B中的每一个实体,在实体集A中有m个实体(m≥0)与之联系,则称实体集A与实体集B具有多对多联系,记为m:n。
例如:一门课程同时有多个学生选修,而一个学生也可以同时选修多门课程,则课程与学生之间具有多对多的联系。
在实际应用中,通常将多对多联系转换为几个一对多联系。
除了两个实体集之间的联系,一个实体集内的实体与实体之间也可以有上述3种联系。此外,一个实体内部也有联系,实体内部的联系通常是指组成实体的各属性之间的联系。
6.E-R图
概念模型的表示方法有很多,其中最常用的是实体-联系方法,该方法用E-R(Entity-Relationship)图来描述概念模型。E-R图中包含实体、属性和联系,它们的表示方法如下:
(1)实体:用矩形框表示,框内写明实体名。
(2)属性:用椭圆形框表示,框内写明属性名,并用无向边将其与对应实体连接起来。
(3)联系:用菱形框表示,框内写明联系名,并用无向边分别与有关实体连接起来,同时在无向边旁标注联系的类型(1:1,1:n或m:n)。
学生与课程之间的联系用E-R图表示如图1-5所示。图1-5只是一个简单的举例,而一个实际应用系统的完整E-R图,要比图1-5复杂得多,包括系统中所有的实体、实体所有的属性和实体间所有的联系。

图1-5 学生与课程联系的E-R图
1.3.2 数据模型
现实世界抽象为信息世界并建立概念模型后,还需进行第二次抽象,转换为计算机世界,并建立数据模型。
数据模型是数据库管理系统用来表示实体及实体间联系的方法。与概念模型不同,数据模型是按计算机系统的观点建立的模型,主要用于数据库的实现。数据模型是数据库的框架,是数据库的基础,任何一个数据库管理系统都是基于某种数据模型的。
常用的数据模型有层次模型、网状模型和关系模型3种,与之对应的数据库类型有层次数据库、网状数据库和关系数据库。层次模型和网状模型统称为非关系模型,在20世纪70至80年代初期较为流行,现在最常用的是关系模型。
1.层次模型
用树形结构表示实体及其联系的模型称为层次模型,如图1-6所示,其中的实体称为结点,实体间的联系用结点间的连线(有向边)表示。
层次模型是最早出现的数据模型,现实世界中许多事物之间的联系本来就是一种层次关系,如家族关系、行政机构等。层次模型的特点如下:
(1)每棵树有且只有一个结点没有双亲,该结点称为根结点。
(2)根结点以外的其他结点有且只有一个双亲结点。
(3)只能直接处理一对多的实体联系。
(4)任何一个结点的值,只有按其路径查看时,才能显示它的全部意义。
2.网状模型
网状模型是采用有向图结构表示实体及其之间联系的数据模型,如图1-7所示。由于现实世界中事物之间的联系更多是非层次关系的,所以用网状模型表示非层次关系比层次模型更加直观。网状模型的特点如下:
(1)允许一个以上的结点无双亲。
(2)一个结点可以有多于一个的双亲。
(3)两个结点之间有多种联系。

图1-6 层次数据模型示例

图1-7 网状数据模型示例
3.关系模型
用二维表的形式表示实体及实体间联系的数据模型称为关系模型。由行列构成的二维表,在数据库理论中称为关系。表1-1所示为一个关系的示例(学生表列出了某校部分学生)。
表1-1 学生表

关系数据库系统采用关系模型作为数据的组织方式,实体与实体间的联系用关系(二维表)表示。关系模型是目前最常用的数据模型,它建立在严格的数学概念基础上,数据描述一致,模型概念单一。
1.3.3 关系数据库
建立在关系模型基础上的数据库就是关系数据库。20世纪80年代以来,计算机厂商推出的数据库管理系统几乎都是关系模型,即使非关系模型的数据库系统也都添加了关系接口。关系数据库已成为应用最广泛的数据库系统,Visual FoxPro就是一种关系数据库管理系统。
1.关系的相关概念
(1)关系
关系是一张规范化的二维表,表名称为关系名,表1-1所示的学生表就是一个关系。
(2)元组
表中的一行称为关系的一个元组。元组指包含数据的行,不包括标题行。在表1-1的关系中,一名学生的信息占一行,有多少名学生此关系就有多少个元组。
(3)属性
表中的一列称为关系的一个属性,每一列的标题称为属性名。表1-1所示的关系共有9列,所以此关系共有9个属性,属性名分别为学号、姓名、性别、出生日期、专业、生源地、民族、政治面貌、入学成绩。
(4)域
属性的取值范围称为域,如性别属性的域为(男,女)。
(5)关键字
关系中能唯一标识元组的一个或一组属性称为关键字。如学生表中的学号。
(6)候选关键字
候选关键字是具有关键字特性的一个或一组属性的统称。例如,在学生表中,学号唯一,不能有重复值,可以作为候选关键字。
(7)主关键字
主关键字是从多个候选关键字中选出的能够唯一标识元组的关键字。一个关系中只能有一个主关键字。如学生表中,学号是唯一的,所以学号是主关键字。
(8)外部关键字(★)
如果一个关系R中的某个属性不是本关系的主关键字或候选关键字,而是另一个关系S的主关键字或候选关键字,则称该属性为本关系R的外部关键字,R为参照关系,S为被参照关系。
例如,表1-2的成绩表中课程号是表1-3的课程表的主关键字,学号是表1-1学生表的主关键字,所以课程号和学号都是成绩表的外部关键字,成绩表为参照关系,课程表和学生表为被参照关系。
表1-2 成绩表

表1-3 课程表

(9)关系模式
关系的描述称为关系模式,一般表示为:关系名(属性名1,属性名2,……,属性名n)。例如,表1-3的课程表的关系模式为:课程(课程号,课程名,课时,学分,校区)。
2.关系的规范化条件
关系是一个二维表,但不是所有的二维表都可以称为关系。关系模型要求关系必须满足一定的规范化条件,只有满足条件的二维表才可称为关系。关系的规范化条件包括:
(1)关系的每一个分量必须是一个不可分的数据项,即表中不可包含表。
(2)一个关系中不能有相同的属性名。
(3)一个关系中不能有完全相同的元组。
(4)同一属性的所有值必须是同一数据类型且来自同一个域。
(5)一个关系中元组的次序可以任意。
(6)一个关系中属性的次序可以任意。
3.关系完整性
关系模型的完整性规则是对关系的某种约束条件。关系模型中有3类完整性约束:实体完整性、参照完整性、用户定义完整性。其中,实体完整性和参照完整性是关系模型必须满足的完整性约束条件。
(1)实体完整性
实体完整性规定:关系中所有元组的主关键字值不能为空值。
例如,表1-1所示的学生表中的学号为主关键字,所有学生的学号不能为空。
空值(NULL)是指“不知道”或“不确定”的值。关系中的一个元组对应一个实体,若某元组的主关键字为空值,则说明存在一个不可标识的实体,这与实体的定义相矛盾。
(2)参照完整性
参照完整性规定:若一个关系R的外部关键字F是另一个关系S的主关键字,则R中的每一个元组在F上的值必须是S中某一元组的主关键字的值,或者取空值。
例如,表1-2所示的成绩表中,课程号是外部关键字,它是表1-3所示的课程表的主关键字,所以成绩表中的所有课程号都必须是课程信息表中的某个课程号。
参照完整性用来约束关系与关系之间的关系。在使用参照完整性规则时,有以下几点需要注意:
①外部关键字和相应的主关键字可以不同名,只要相对应并定义在相同的值域即可。
②外部关键字的值是否可以为空值,应视具体问题而定。
如表1-2的成绩表中,每行的课程号都不能为空,若为空,则不能标识是哪一门课的成绩。
再如有以下两个关系:

学生关系中的专业号是外部关键字,它是专业关系中的主关键字,则在学生关系中,可以有某些元组的专业号为空值,说明这些学生目前还没有确定专业。
(3)用户定义完整性(★)
任何关系数据库系统都应该支持实体完整性和参照完整性。除此之外,有些关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。
用户定义完整性是针对某一具体关系的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。在Visual FoxPro数据库表中是指列(字段)的数据类型、宽度、精度、取值范围、是否允许空值(NULL)。例如,成绩表中的成绩应为数值型数据,取值范围可规定在0~100之间;学生表中,性别为字符型数据,取值范围为(男,女)。