
任务1-3 掌握数据模型
【任务分析】
设计人员已经理解如何将客观存在的事物转换为计算机存储的数据,接下来需要做的工作是选择数据在计算机中的一种组织模式。在计算机中,处理的数据需要选择什么组织形式才最有效、方便和快捷,并保证数据的正确性、一致性呢?供设计人员选择的数据结构有哪些?
【课堂任务】
使用数据模型来表示和处理计算机中的数据,即为数据选择一种数据组织模式。
● 数据模型
● 概念模型
● 关系模型
● 关系模型的完整性约束
模型是对现实世界特征的模拟和抽象,数据模型也是一种模型。在数据库技术中,用数据模型对现实世界数据特征进行抽象,来描述数据库的结构与语义。
(一)数据模型分类
目前广泛使用的数据模型有两种:概念数据模型和结构数据模型。
1. 概念数据模型
概念数据模型简称为概念模型,它表示实体类型及实体间的联系,是独立于计算机系统的模型。概念模型用于建立信息世界的数据模型,强调其语义表达功能,要求概念简单、清晰,易于用户理解,它是现实世界的第1层抽象,是用户和数据库设计人员之间进行交流的工具。
2. 结构数据模型
结构数据模型简称为数据模型,它是直接面向数据库的逻辑结构,是现实世界的第2层抽象。数据模型涉及计算机系统和数据库管理系统,如层次模型、网状模型、关系模型等。数据模型有严格的形式化定义,以便于在计算机系统中实现。
(二)概念模型
概念模型是对信息世界的建模,它应当能够全面、准确地描述信息世界,是信息世界的基本概念。概念模型的表示方法很多,其中最为著名和使用最为广泛的是P.P.Chen于1976年提出的E-R(Entity-Relationship)模型。
E-R模型直接从现实世界中抽象出实体类型及实体间的联系,是对现实世界的一种抽象,它的主要成分是实体、联系和属性。E-R模型的图形表示称为E-R图。设计E-R图的方法称为E-R方法。利用E-R模型进行数据库的概念设计,可以分为3步:首先设计局部E-R模型,然后把各个局部E-R模型综合成一个全局E-R模型,最后对全局E-R模型进行优化,得到最终的E-R模型。
E-R图通用的表示方式如下。
(1)用矩形框表示实体型,在框内写上实体名。
(2)用椭圆形框表示实体的属性,并用无向边把实体和属性连接起来。
(3)用菱形框表示实体间的联系,在菱形框内写上联系名,用无向边分别把菱形框与有关实体连接起来,在无向边旁注明联系的类型。如果实体间的联系也有属性,则把属性和菱形框也用无向边连接起来。
学生班级与学生、课程与学生的E-R图,分别如图1.5与图1.6所示。

图1.5 班级与学生的E-R图

图1.6 课程与学生的E-R图
E-R模型有两个明显的优点:接近于人的思维,容易理解;与计算机无关,用户容易接受。
E-R方法是抽象和描述现实世界的有力工具。用E-R图表示的概念模型与数据模型相互独立,是各种数据模型的共同基础,因而比数据模型更一般、更抽象、更接近现实世界。
(三)数据模型的要素和种类
数据模型是严格定义的一组概念的集合,这些概念精确地描述了系统的静态特征(数据结构)、动态特征(数据操作)和数据约束条件,这是数据模型的三要素。
1. 数据模型的三要素
(1)数据结构。数据结构用于描述系统的静态特征,是所研究的对象类型的集合,这些对象是数据库的组成部分,包括两个方面。
① 数据本身:数据的类型、内容和性质等,如关系模型中的域、属性、关系等。
② 数据之间的联系:数据之间是如何相互关联的,如关系模型中的主码、外码联系等。
(2)数据操作。数据操作是对数据库中的各种对象(型)的实例(值)允许执行的操作集合。数据操作包括操作对象及有关的操作规则,主要有检索和更新(包括插入、删除和修改)两类。
(3)数据约束条件。数据约束条件是一组完整性规则的集合。完整性规则是给定数据模型中的数据及其联系所具有的制约和依存规则,用以限定符合数据模型的数据库状态及其状态的变化,以保证数据的正确、有效和相容。
2. 常见的数据模型
数据模型是数据库系统的一个关键概念,数据模型不同,相应的数据库系统就完全不同,任何一个数据库管理系统都是基于某种数据模型的。数据库管理系统支持的数据模型分为4种:层次模型、网状模型、关系模型和关系对象模型。
层次模型用“树”结构来表示数据之间的关系,网状模型用“图”结构来表示数据之间的关系,关系模型用“表”结构(或称关系)来表示数据之间的关系。
在层次模型、网状模型、关系模型3种数据模型中,关系模型结构简单、数据之间的关系容易实现,因此关系模型是目前广泛使用的数据模型,并且关系数据库也是目前流行的数据库。
关系对象模型一方面对数据结构方面的关系结构进行改进,如Oracle 8就提供了关系对象模型的数据结构描述;另一方面,人们对数据操作引入了对象操作的概念和手段,今天的数据库管理系统基本上都提供了这方面的功能。
(四)关系模型
关系模型是目前最重要的一种数据模型,关系数据库系统采用关系模型作为数据的组织方式。
关系模型是在20世纪70年代初由美国IBM公司的E.F.Codd提出的,为数据库技术的发展奠定了理论基础。由于E.F.Codd的杰出工作,他于1981年获得ACM图灵奖。
1. 关系模型的数据结构
关系模型与以往的模型不同,它是建立在严格的数据概念基础上的。关系模型中数据的逻辑结构是一张二维表,它由行和列组成。下面分别介绍关系模型中的相关术语。
(1)关系(Relation)。一个关系就是一张二维表,见表1.1。
表1.1 学生学籍表

(2)元组(Tuple)。元组也称记录,关系表中的每行对应一个元组,组成元组的元素称为分量。数据库中的一个实体或实体之间的一个联系均使用一个元组来表示。例如,表1.1中有多个元组,分别对应多个学生,(2007X1201,李小双,18,女,信息系)是一个元组,由5个分量组成。
(3)属性(Attribute)。表中的一列即为一个属性,给每个属性取一个名称为属性名,表1.1中有5个属性(学号,姓名,年龄,性别,所在系)。
属性具有型和值两层含义:属性的型是指属性名和属性值域;属性的值是指属性具体的取值。
因为关系中的属性名具有标识列的作用,所以在同一个关系中的属性名(列名)不能相同。一个关系中通常有个多个属性,属性用于表示实体的特征。
(4)域(Domain)。属性的取值范围,如表1.1中的“性别”属性的域是男、女,大学生的“年龄”属性域可以设置为10~30岁等。
(5)分量(Component)。元组中的一个属性值,如表1.1中的“李小双”“男”等都是分量。
(6)候选码(Candidate Key)。若关系中的某一属性或属性组的值能唯一标识一个元组,且从这个属性组中去除任何一个属性,都不再具有这样的性质,则称该属性或属性组为候选码,候选码简称为码。
(7)主码(Primary Key)。若一个关系中有多个候选码,则选定其中一个为主码。例如,表1.1中的候选码之一是“学号”属性;假设表1.1中没有重名的学生,则学生的“姓名”也是该关系的候选码;在该关系中,应当选择“学号”属性作为主码。
(8)全码(All Key)。在最简单的情况下,候选码只包含一个属性;在最极端的情况下,关系模式的所有属性都是这个关系模式的候选码,称为全码。全码是候选码的特例。
例如,设有以下关系。
学生选课(学号,课程)
其中的“学号”和“课程”相互独立,属性间不存在依赖关系,它的码就是全码。
(9)主属性(Prime Attribute)和非主属性(Non-prime Attribute)。在关系中,候选码中的属性称为主属性,不包含在任何候选码中的属性称为非主属性。
(10)关系模式(Relation Schema)。关系的描述称为关系模式,它可以形式化地表示为R(U,D,Dom,F)。
其中,R为关系名;U为组成该关系的属性的集合;D为属性组U中的属性来自的域;Dom为属性向域的映像集合;F为属性间数据依赖关系的集合。
关系模式通常可以简记为R(U)或R(A1,A2,…,An)。
其中R为关系名,A1,A2,…,An为属性名。而域名及属性向域的映像常直接称为属性的类型及长度。例如,学生学籍表的关系模式可以表示为:学生学籍表(学号,姓名,年龄,性别,所在系)。
关系是关系模式在某一时刻的状态或内容。关系模式是静态的、稳定的,而关系是动态的、随时间不断变化的,因为关系操作在不断地更新着数据库中的数据。
2. 关系的性质
(1)同一属性的数据具有同质性,即每一列中的分量是同一类型的数据,它们来自同一个域。
(2)同一关系的属性名具有不可重复性,即同一关系中不同属性的数据可出自同一个域,但不同属性的属性名不能相同。
(3)关系中列的位置具有顺序无关性,即列的次序可以任意交换、重新组织。
(4)关系具有元组无冗余性,即关系中的任意两个元组不能完全相同。
(5)关系中元组的位置具有顺序无关性,即元组的顺序可以任意交换。
(6)关系中每个分量必须取原子值,即每个分量都必须是不可分的数据项。
关系模型要求关系必须是规范化的,即要求关系模式必须满足一定的规范条件,这些规范条件中最基本的一条就是关系的每个分量必须是一个不可分割的数据项。规范化的关系简称范式(Normal Form)。例如,表1.2中的成绩分为C语言和VB语言两门课的成绩,这种组合数据项不符合关系规范化的要求,这样的关系在数据库中是不允许存在的,表1.2正确的设计格式见表1.3。
表1.2 非规范化的关系结构

表1.3 修改后的关系结构

(五)关系的完整性
关系模型的完整性规则是对关系的某种约束条件。关系模型中允许定义3类完整性约束:实体完整性、参照完整性和用户自定义的完整性。其中实体完整性和参照完整性是关系模型必须满足的完整性约束条件,称为两个不变性,应该由关系系统自动支持;用户自定义的完整性是应用领域需要遵循的约束条件,体现了具体领域中的语义约束。
1. 实体完整性(Entity Integrity)
规则1.1 实体完整性规则 若属性A是基本关系R的主属性,则属性A不能取空值。
例如,学生关系“学生(学号,姓名,性别,专业号,年龄)”中,“学号”为主码,则“学号”不能取空值。
实体完整性规则规定基本关系的所有主属性都不能取空值,而不仅是指主码不能取空值。
例如,学生选课关系“选修(学号,课程号,成绩)”中,“学号”“课程号”为主码,则“学号”和“课程号”两个属性都不能取空值。
对于实体完整性规则说明如下。
(1)实体完整性规则是针对基本关系而言的。一个基本表通常对应信息世界的一个实体集,例如,学生关系对应学生的集合。
(2)信息世界中的实体是可区分的,即它们具有某种唯一性标识。
(3)关系模型中以主码作为唯一性标识。
(4)主属性不能取空值。所谓空值,就是“不知道”或“不确定”的值,如果主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与第(2)点相矛盾,因此这个规则称为实体完整性规则。
2. 参照完整性(Referential Integrity)
在信息世界中,实体之间往往存在某种联系,在关系模型中,实体及实体间的联系都是用关系来描述的,这样就自然存在关系与关系间的引用。先来看下面3个例子。
【例1.1】 学生关系和专业关系表示如下,其中主码用下画线标识。
学生(学号,姓名,性别,专业号,年龄)
专业(专业号,专业名)
这两个关系之间存在属性的引用,即学生关系引用了专业关系的主码“专业号”。显然,学生关系中的“专业号”值必须是确实存在的专业的专业号,即专业关系中有该专业的记录,也就是说,学生关系中的某个属性的取值需要参照专业关系的属性来取值。
【例1.2】 学生、课程、学生与课程之间的多对多联系选修可以用如下3个关系表示。
学生(学号,姓名,性别,专业号,年龄)
课程(课程号,课程名,学分)
选修(学号,课程号,成绩)
这3个关系之间也存在属性的引用,即选修关系引用了学生关系的主码“学号”和课程关系的主码“课程号”。同样,选修关系中的“学号”值必须是确实存在的学生的学号,即学生关系中有该学生的记录;选修关系中的“课程号”值也必须是确实存在的课程的课程号,即课程关系中有该课程的记录。也就是说,选修关系中某些属性的取值需要参照其他关系的属性来取值。
不仅两个或两个以上的关系间可以存在引用关系,同一关系内部属性间也可能存在引用关系。
【例1.3】 在关系“学生(学号,姓名,性别,专业号,年龄,班长)”中,“学号”属性是主码,“班长”属性表示该学生所在班级的班长的学号,它引用了本关系“学号”属性,即“班长”必须是确实存在的学生的学号。
设F是基本关系R的一个或一组属性,但不是关系R的主码。如果F与基本关系S的主码Ks相对应,则称F是基本关系R的外码(Foreign Key),并称基本关系R为参照关系(Referencing Relation),基本关系S为被参照关系(Referenced Relation)或目标关系(Target Relation)。关系R和关系S有可能是同一关系。
显然,被参照关系S的主码Ks和参照关系R的外码F必须定义在同一个(或一组)域上。
在例1.1中,学生关系的“专业号”属性与专业关系的主码“专业号”相对应,因此“专业号”属性是学生关系的外码。这里专业关系是被参照关系,学生关系为参照关系。
在例1.2中,选修关系的“学号”属性与学生关系的主码“学号”相对应,“课程号”属性与课程关系的主码“课程号”相对应,因此“学号”和“课程号”属性是选修关系的外码。这里学生关系和课程关系均为被参照关系,选修关系为参照关系。
在例1.3中,“班长”属性与本身的主码“学号”属性相对应,因此“班长”是外码。学生关系既是参照关系,也是被参照关系。
需要指出的是,外码并不一定要与相应的主码同名。但在实际应用中,为了便于识别,当外码与相应的主码属于不同关系时,给它们取相同的名字。
参照完整性规则定义了外码与主码之间的引用规则。
规则1.2 参照完整性规则 若属性(或属性组)F是基本关系R的外码,它与基本关系S的主码Ks相对应(基本关系R和S有可能是同一关系),则R中每个元组在F上的值必须为以下值之一。
(1)取空值(F的每个属性值均为空值)。
(2)等于S中某个元组的主码值。
在例1.1的学生关系中,每个元组的“专业号”属性只能取下面两类值。
(1)空值,表示尚未给该学生分配专业。
(2)非空值,这时该值必须是专业关系中某个元组的“专业号”值,表示该学生不可能被分配到一个不存在的专业中,即被参照关系“专业”中一定存在一个元组,它的主码值等于该参照关系“学生”中的外码值。
在例1.2中按照参照完整性规则,“学号”和“课程号”属性也可以取两类值:空值或被参照关系中已经存在的值。但由于“学号”和“课程号”是选修关系中的主属性,按照实体完整性规则,它们均不能取空值,所以选修关系中的“学号”和“课程号”属性实际上只能取相应被参照关系中已经存在的主码值。
在参照完整性规则中,关系R与关系S可以是同一个关系。在例1.3中,按照参照完整性规则,“班长”属性可以取两类值。
(1)空值,表示该学生所在班级尚未选出班长。
(2)非空值,该值必须是本关系中某个元组的学号值。
3. 用户自定义的完整性(User-Defined Integrity)
用户自定义的完整性就是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。例如,某个属性必须取唯一值、属性值之间应满足一定的函数关系、某属性的取值范围在0~100等。
例如,性别只能取“男”或“女”;学生的成绩必须为0~100分。