第三节 数据模型
数据库是某个企业、组织或部门所涉及的数据的综合,它存放所有的数据并且反映了数据彼此之间的联系。我们设计数据库系统时,一般先用图或表的形式抽象地反映数据彼此之间的关系,称为建立数据模型。常用的数据模型一般可分为两类,一是语义数据模型,如实体一联系模型(E-R模型),面向对象模型等;二是经典数据模型,如层次模型、网状模型和关系模型。第一类模型强调语义表达能力,建模容易方便,概念简单、清晰,易于用户理解,是现实世界到信息世界的第一层抽象,是用户和数据库设计人员之间进行交流的语言。第二类模型用于机器世界,一般和实际数据库对应,例如层次模型、网状模型和关系模型分别与层次数据库、网状数据库和关系数据库对应,可在机器上实现。这类模型有更严格的形式化定义,常需加上一些限制或规定。我们设计数据库系统通常利用第一类模型作初步设计,之后按一定方法转换为第二类模型,再进一步设计全系统的数据库结构。全系统的数据库结构通常包括数据结构、数据操作和完整性约束三部分内容。
.数据结构。数据结构描述的是数据库数据的组成、特性及其相互间联系。在数据库系统中通常按数据结构的类型来命名数据模型,如层次结构、网状结构和关系结构的模型分别命名为层次模型、网状模型和关系模型。
.数据操作。数据操作指对数据库中各种对象的实例允许执行的操作的集合,包括操作及有关的操作规则。数据库的操作主要有检索和维护(包括录入、删除、修改)等两大类操作。数据模型要定义这些操作的确切含义、操作符号、 操作规则及实现操作的语言。 数据结构是对系统静态特性的描述。数据操作是对系统动态特性的描述。
.数据的约束条件。数据的约束条件指数据完整性规则的集合,它是给定数据模型中数据及其联系所具有的制约和依存规则,用以限定符合数据模型的数据库状态及其变化,以保证数据的完整性。
数据模型这三方面内容完整地描述了一个数据模型,而其中数据结构是首要内容,本节将主要介绍各种数据模型数据结构的表示方法及各种模型之间的关系。现实世界的事物之间彼此是有联系的,代表实体的数据之间也存在联系,对于不同实体集之间的实体与实体的联系可分为三类。
1.一对一联系(1:1)
若对于实体集A中每一个实体,实体集B中至多只有一个实体与之联系,反之与实体集B每一个实体,实体集A中也至多只有一个实体与之联系。这称为实体集A与实体集B之间具有一对一联系,记为1:1。
例如企业集中企业和法人代表集中法人代表的联系,假如每个企业有一个法人代表,而一个法人代表只在一个企业任职,则它们是一对一的联系。一般来讲,如果B是A的代表,或者是A中独具特色的内容, 则A和B的联系是一对一的。
2.一对多联系(l:N)
若对于实体集A中的每一个实体,实体集B中有n个实体(n≥0)与之联系。而对于实体集B中的每一个实体, 实体集A中至多只有一个实体与之联系,则称实体集A与实体集B有一对多的联系,记为1:N。
例如一个系可有多个教研室,而一个教研室只属于一个系,则系与教研室是一对多的联系。一个教研室内有许多老师,而一个老师只属于一个教研室,教研室和老师之间是一对多的联系。一般来讲, 如A是B的领导实体或B与A是所属关系,A和B之间就是一对多的联系,如B是组成A的部分,而B中某一个实体只组成到A中某一个实体之中,则A与B也是一对多的联系。
3.多对多联系(M:N)
若对于实体集A中的每一个实体, 实体集B中有n个实体(n≥0)与之联系,反过来对于实体集B中的每一个实体, 实体集A中有m个实体(m≥0)与之联系,则称实体集A与实体集B之间有多对多联系,记为M:N。
例如我们前面所举学生与课程之间的联系是多对多的联系。如果一个产品由多个零件组成,而一个零件可组成到多个产品之中,则产品和零件是多对多的联系。一般说,如果B是A从事的工作,A与B是多对多的联系。 如A中一个实体由B中多个实体组成, 而且B中一个实体可能被组成到A的不同实体中,则A与B是多对多的联系。
我们也可看出,实体集与实体集间联系的性质与系统环境有关,与研究的问题有关,某些问题与前提条件有关。例如A与B如为组成关系,则它们的联系有可能为一对多的,也可能为多对多的,例如产品与部件之间、产品与零件之间的关系可能为一对多的,也可能为多对多的。在一个学校中,每个老师最多担任一门课主讲,但有些课程有多位主讲老师,则课程和老师问题是一对多联系。在一个学校中,如果有的老师要担任多门课主讲,且有一些课程有多位主讲,则课程和老师之间是多对多联系。在一个学校中如果有的教师担任多门课主讲,而所有课程均只有一位主讲,则课程和老师间是多对一的联系。
如果在一个系统中,实体之间联系都是一对一或一对多的,可采用层次模型来描述,使用层次数据库效率高。如系、教研室及老师、学生等构成的系统。凡采用层次模型可以描述的问题也可以使用关系数据模型。设计时,模型A和B如是一对一的联系常可将A和B的数据合并存放在一个表之中,A和B如是一对多的联系,则需将A和B的数据分别存放在二个表之中, 而更要在B中增加一个字段:A中的关键字, 以便回答既涉及A又涉及B的检索和统计的应用问题。 使用关系数据库实现容易,但效果可能较低。
如果在一个系统中,实体和实体间存在多对多的联系,则常采用网状数据模型来描述,使用网状数据库存储,查询速度较快。也可用关系数据模型来描述,A和B的数据分别存放在二个表之中,同时另外建立联系关系:分别由A和B的关键字数据项构成联系关系表 (如⒈2节所举的关于学生和课程的例子)。
在一些问题中,可能涉及三个实体集之间的联系,例如在老师、学生、课程关系中,如老师和学生、学生和课程、老师和课程间均是多对多关系。而且要讨论某学生学习某课程是哪个老师教这一类问题,如前面仅建立老师和学生间联系及学生和课程之间联系关系还不能回答此问题。实际上它们三者是m:n:p的联系。在关系模型中也能较容易地处理, 方法是三者分别建立一个表,另外建立联系关系表,由三者的关键字作为数据项。老师、学生、课程关系问题的联系关系模式可为:教学(学号、职工号、课程号)。实体一联系模型(Entity-Relationship Model)是P.PS.Chen于 1976年提出的一种概念模型,用E-R图来描述一个系统中的数据及其之间关系。在E-R图中,用长方形表示实体集,在长方形框内写上实体名。用菱形表示实体间联系,菱形框内写上联系名。用无向边把菱形和有关实体相连接,在无向边旁标上联系的类型,如1或M或N。 用椭圆形表示实体或联系的属性。如用椭圆形将它与一个相应实体间以无向边相连。如以表格形式,表示方法为:实体名(属性1,属性2...)。如果在例1.3中, 添加描述如下:各教研室负责开出各专业课程,一个学生要学习许多课,一门课程常有许多学生学。一个老师要带多门课,有一些课程有多位主讲教师。我们可画出其E-R模型如图1.9所示。
图1.9 一个学校系统E-R图
图1.10为另一种画法,将属性用表的形式表示,更突出实体及其之间的联系。
图1.10 一个学校系统的E-R图的另一种画法
要注意以下几个问题:
.某些联系也具有属性,例如“成绩”有属性“分数”,它既非为学生独有,也非为“课程”独有,是涉及学生学习某门课程关系时产生的特性,因而是联系的属性。
.对于三个实体m:n:p的联系的老师、学生、课程门联系可如图1.11所示描述。
图l.11 三个实体间的E-R图
.E-R图可以表现一个实体内部一部分成员和另一部分成员间的联系。在一个学生班中,班干部和一般学生都是学生,但班干部和一般学生间存在一对多联系,可表示为图1.12,这类联系称为自回路。
图1.12 自回路的E-R图
.E-R图可以表现二个实体集间多类联系。例如一个单位中职工和工作的关系,一个职工可承担多项工作,一个工作一般有多人承担,这种工作关系是多对多的关系。另一方面,有一些职工对一些工作是主要责任人,一个职工可对多项工作负责,但一项工作只有一个责任人,它们之间这种负责关系为一对多联系,可用图1.13描述。
图1.13 两个实体间有多种联系
从以上E-R模型可见E-R图表述简单,与现实世界较接近。对一个系统我们首先分析有哪些实体集,分别用矩形框画出,再分析它们每二者之间是否存在联系,是什么类型的联系。如有联系,用菱型框表示并与相关实体框用线相连,标上联系的类型。最后分析各个实体集及联系的属性,用表表示就可得到E-R图。
这中间比较困难的是,有些时候实体与属性不易区分,对于一些具体问题,如对实际数据构成了解不透,对环境和应用需求调查不深入,不容易弄清联系关系及联系的类型,容易漏或错。对于这些较深入的内容,我们将在第七章中进一步讨论。
此外,这种模型无法直接建立机器上的存储结构,因此还要转化成为某一种经典数据模型。用二维表格数据(即集合论中的关系)来表示实体和实体间联系的模型叫关系数据模型。它是经典数据模型中建模能力最强的一种,对于各种类型数据联系都可描述。它以关系理论为坚实的基础,因此成为当今实用系统的主流。目前流行的数据库管理系统,如Oracle,Informix,Sybase,SQL Server(以上是网络系统上常使用的数据库,又称为大型数据库)和Access和Visual FoxPro (后二者是客户机上常使用的数据库)全都是关系数据库管理系统。
关系数据模型用二维表表示实体集。二维表由多列和多行组成,每列描述实体的一个属性,每列的标识称为属性名,在关系数据库中称为数据项或字段。表中每一行称为一个元组,描述一个具体实体,在关系数据库中称为记录,元组的集合构成表,称为关系,描述一个实体集中各类数据的集合,在关系数据库中也称之为表。关系数据模型由多个关系表构成,每个表表示法为:关系名(属性1,属性2,……属性n), 例如:学生(学号,姓名,性别,出生年月,专业,班级,政治面貌,家庭住址,履历)。
在一个关系的属性中有的属性或属性组能惟一标识一个元组,称为主码,或称为关键字。有些属性取值有一定范围,属性的取值范围称为域。一个域对应关系数据库中的表中的一个数据项的值的集合。元组中一个属性值称为分量,对应关系数据库中一条具体记录的一个数据项的具体值。
在关系模型中对于联系有不同表示方法, 例如对于一对多联系, 可在“多”方实体集的表中加进“一”方实体集的主码。对于多对多联系则可以建立一个新表,由“联系”的两个实体的主码及“联系”自身的属性作为其属性,如表1.7成绩表(学生与课程联系表)。
在关系数据库中用户的检索操作实际是从原来的表根据一定的条件求得一个新表。
以上所述,关系模型概念单一,无论是实体还是联系,无论是查询检索源还是检索结果集都用二维表表示,结构清晰,用户易懂易用,容易维护,适应性强,容易扩充,其坚实的理论基础使之严密细致,这些都使它长期成为实用数据库系统的主流。
对于关系模型还要指出几点:
.关系是元组的集合,元组在关系中的顺序不影响关系。
.同一关系任意元组不允许全部相同。对于每一个表,我们一般要选定或设计主码,用以区分不同元组。
.关系的每一属性都是不可再分的基本数据类型,这种特性称为原子性。如表1.9所示的表结构是不允许的。其中成绩可再分为单科成绩和总分两个数据项,且单科成绩还可再分为C、DB、OS三个数据项。成绩称为组项,组成它的二个数据项是不同级别的,单科成绩称向量,构成单科成绩的三个数据项是同级的。表1.9 成绩关系表
姓名 成绩单科成绩
总分
C
DB
OS
张三
90
85
65
240
在关系模型中不允许存在组项和向量。另外如表1.10所示的结构也不允许,这种结构称为重复组,在关系模型中不允许存在重复组。
表1.10 重复组项
姓名
成绩
A1
C
80
DB
85
OS
92
A2
C
90
DB
80
.在一个表中属性排列顺序可以交换,不影响关系。
.允许属性值为空值(null value), 表示该属性值未知,空值不同于0,也不同于空格。 它使关系数据库支持对不完全数据的处理。在表中,不允许主码全部或部分为空值,否则它就无法唯一标识一个元组。
在数据库系统设计时, 首先画出E-R模型,然后转化出关系模型,画法为:
.将每一个实体型(矩形)用一个关系表示,实体的属性就是关系的属性,实体的码就是关系的主码。对于一对一的联系可将原两实体合并为一个关系表示,关系属性由二个实体属性集合而成,如有的属性名相同,则应加以区分。
.对于一对多的联系,在原多方实体对应的关系中,添加一方实体的主码,多方实体主码是多方对应关系的主码。例如1.2节中关于教研室关系中有数据项:系代码;在老师和学生对应关系中有室代码。
.将多对多的联系转换为新关系,联系名为关系名,联系的属性加上相关两实体主码构成关系的属性集,相关两实体主码的集合是联系关系的主码。例如1.2节中成绩(学号,课程号,分数)是联系学生和课程的关系,学号是学生的主码,课程号是课程的主码,分数是联系“成绩“的属性,学号和课程号构成成绩关系的主码。
对于M:N:P的联系。仿照多对多联系处理,联系转化为关系,原三个相关实体的主码及联系自身的属性构成联系关系的属性。
对于自回路要区分一对多和多对多。对于多对多情况,先复制原实体中主码及涉及的主要属性,改名后存另一个表,再仿照一对多联系和多对多联系处理,联系转化为关系,原实体中主码加上更名后原实体中主码作为联系的属性。例如学生和学生之间合作联系可用合作(学号,相关学号)表示。
对于两个实体间的多种联系,对每一个联系区别一对多或多对多,依前面处理一对多联系及处理多对多联系的方法处理。
得到关系模型后进一步再设计各个属性的性质(是否主码、存储数据类型、宽度等)及完整性约束条件,就可得到关系数据库模式,初步完成数据库系统数据逻辑结构设计。广义的网状模型十分简单,它以矩形代表实体集,实体间用箭头线表示联系,箭头线为两头带箭头的连线,箭头分单箭头与双箭头,单箭头代表一,双箭头代表多。
从E-R模型转换为这种模型,只需将所有菱形及相关无向边改为箭头线,一对多联系改画为一边单箭头,一过双箭头的箭头线,多对多联系改画为两边都是双箭头的箭头线。原有矩形不变。
图1.14广义的网状数据模型
例图1.10变成网状模型后如图1.14所示。这样一种模型仍然无法在机器上实现。1971年美国数据系统语言会议(Conference of Data System Language)组织的下属机构数据库任务组织(DBTG)提出了DBTG网状数据模型,它包括两种基本构件,记录类型和系类型,前者描述实体,后者描述实体间联系。记录类型是具有相同结构的一组记录的框架,相当于一个二维表的表头结构,它允许组项和向量。在依之而设计的DBTG网状数据库中每一记录对应一个实体,实体按实体集分区域存放。
根据应用需要建立“系”,系是由实体集为结点构成的二级树,树根实体集称为系主,叶结点实体集称为成员,这个树结构称为系型。系主由多条记录组成,每条记录和子结点中许多成员记录各构成一颗树,称为一个系值。这些系在实际存储时采用多种形式的链接实现数据之间的关联。DBTG网状数据模型构成规则可大体归纳为:
.一个记录类型可以参与多个系的组成,可以是多个系的系上记录型,也可为多个系的成员记录型。
.任意两个记录类型之间可以定义多个系类型,这就使DBTG模型能表达二个实体集之间可能存在的多种联系关系的能力。
.系主记录型与成员记录型之间只能是一对多联系。
.在任何系中,一个成员记录值最多只能对应于一个系主记录值,即它不能属于同一系类型的不同系值。在实际问题中如出现一个成员记录值对应多个系主记录值的情况,则必须通过某个数据项标识以便区分。
.允许一个系只有成员记录型而无系主记录型,这样的系我们称为奇异系,我们视“系统”为其系主,这样的系只有一个系值。
.不允许一个记录型既是系主记录型又是成员记录型,这样的结构我们称为自回路。
从E-R图转换为DBTG数据模型时, 可分为两步,第一步将所有一对多联系菱形及连线如前转换为箭头线。将所有多对多联系菱形转换为矩形,其内写上联系的名字。
观察表1.5中学生表和表1.7成绩表之间记录之间的联系,学生表中一条记录对应成绩表中多条记录,成绩表中一条记录仅对应学生表中一条记录,显见学生与成绩是一对多联系。同样从表1.6和表1.7联系可见,课程和成绩是一对多联系。因此可用箭头线将学生与成绩相连,学生方为单箭头,成绩方为双箭头。用箭头线将课程与成绩相连,课程方为单箭头,成绩方为双箭头。推而言之,在E-R图中将多对多联系视为实体集后, 不难分析,原联系相关实体与它的联系皆为一对多。因而可用箭头线将原相关实体矩形与联系矩形连接, 原实体方为单箭头, 联系矩形方为双箭头。照此将老师与教学、课程与教学分别用箭头线相连,如图1.15所示,便得到只含有一对多联系的全局数据结构。
图l.15 转为DBTG模型第一步
第二步根据应用需要设计“系”结构,如图1.16所示,我们设计了五个系结构,在实际应用中可能需要的“系”多于五个也可能少于五个。
图1.16 根据应用需要构成DBTG模型对于一些特殊问题的转换方法。自回路,如一对多联系,则将联系转为实体,作为成员记录型。例如图1.l2可转换为图1.17所示系型。
图1.17 一对多自回路转换为DBTG模型如系是多对多联系,可利用在二个实体间可建多个系的特性,在实体与联系间建立二个或多个系。例如学生中可开展多项活动,有些学生是活动的组织者,有些是参与者,一个学生可参与多位学生组织的活动,每个学生组织的活动常有多位同学参加,其E–R模型如图1.18所示。
在二个实体集之间存在多项联系时,针对每一联系可分别建立不同的系,可区分一对多或多对多再实现转换。学生与活动间可建二个系如图1.19所示。
图l.18 “学生”与“活动”E-R图 图l.19 学生”与“活动”转换为二个系
层次数据模型用“树”结构表示实体集之间的关系。
它以实体集(用矩形框表示)为结点,父结点与子结点间数据联系均为一对多联系。有且仅有一个结点无父结点称为根结点,如图1.5中的“系”。其他结点有且仅有一个父结点构成树的枝和叶结点。没有子结点的结点称叶结点。
由于每个结点代表实体集,代表多个实体数据,每个实体数据都对应一个实体,这个实体又可能对应其子孙结点中一个或多个实体。因此按层次模型设计的数据库数据结构模型由多棵树构成。层次数据模型根结点中每一个实体及其所有子孙结点中相关实体都构成树,其数据集合称为记录,是层次数据库中一个存储单位。图1.4描述了数据关联的一种形式。
从E-R图到层次数据模型转换的步骤是: 首先可按图1.15的方法转为只存在一对多联系的模式,然后确定根结点。参看图1.20,层次数据模型的父结点与子结点间总是一对多的联系,如果实体集A和实体集B间是一对多的联系,则A是父结点,B是子结点,“根”无父结点。我们在图中寻找指向它的箭头全是单箭头的结点,将它视为根结点。如有多个结点满足这些条件,则有多个根结点,该系统将由多个记录型构成。从根起,按从单箭头到多箭头方向遍历全系统各结点,如果到一个结点处它还与另一个实体间有一对多关系,则它还有下层子结点,对所经结点按层次在图中画出,到达某一个结点前一个结点为其父结点,由此即可得层次模型。从根起所经结点数即该结点所在层次数。
图1.20 层次结构一例例如图1.15可转换为层次模型如图1.21所示。在图中存在两个教学和两个成绩结点,称为冗余结点。这种冗余是必要的。如要查询某个老师所教课程情况,需从根查起直到找到该老师数据,再在其下教学结点中查到课程代码,然后再从根查起找到有关课程数据。反过来,若要查询某门课程由哪些老师教,则要先从系查到该课程数据,然后在课程的教学结点中找到有关老师代码,然后才可查询老师的有关数据。在实际数据库中可有两种处理方法,一种如图1.21中的冗余结点的处理方法,另一种是取二个结点中之一为虚结点。例如课程下教学、成绩均作为虚结点,在其中只存放实结点的指针,而实际联系数据在实结点中存放。前者查询效率高,后者维护较方便。
图l.21 DBTG转成层次模型结构
本章首先介绍了数据处理的发展过程,文件系统与数据库系统处理数据方式的不同,从而引出了数据库系统管理数据的特点。在此基础上讨论了数据的物理独立性和逻辑独立性。然后重点介绍了数据库中数据存储的结构。最后通过讨论数据之间的联系重点介绍了数据模型的概念。包括用于描述实体及其属性和联系的E-R图和三种常用的数据模型: 层次数据模型、网状数据模型和关系数据模型。