在数据库中,数据不仅包含数据本身的内容,还包括数据之间的关系。这是因为计算机无法直接处理现实世界中的具体事物,因此必须将这些事物抽象成数据模型,以便计算机处理。
数据从现实世界到数据库里的具体表示要经历三个领域,即现实世界、信息世界、计算机世界。这三个领域的关系如图所示。
定义:信息世界是对现实世界事物的抽象描述,主要存在于人们的思维中。
关键概念:
实体-联系模型(E-R Model):
1.两个实体之间的联系
一对一联系(1:1)
如果对于实体集 A 中的每一个实体,实体集 B 中至多有一个实体与之联系,反之亦然则称实体集 A 与实体集 B 具有一对一联系,记为 1:1。
例如,公司里面,一个部门只有一个经理,而一个经理只在一个部门中任职,则部门集与经理集之间的联系为 1:1。
一对多联系(1:n)
如果对于实体集 A 中的每一个实体,实体集 B 中有(m>0)个实体与之联系;对于实体集 B 中的每一个实体,实体集 A 中至多有一个实体与之联系,则称实体集 A 与实体集 B具有一对多联系,记为 1:n。
例如,一个部门有多个职工,而一个职工只在一个部门工作,则部门集与职工集之间的联系为 1:n。
多对多联系(m:n)
如果对于实体集 A 中的每一个实体,实体集 B 中有n(m>0)个实体与之联系; 对于实体集 B 中的每一个实体,实体集 A 中有m(m>0)个实体与之联系,则称实体集 A 与实体集B 具有多对多联系,记为 m:n。
例如,一个产品可以由多个零件组成,而一个零件又可以用于多种产品,则产品集与零件集之间的联系为 m:n。
对信息世界建模,必须方便、准确地表示出上述信息世界中的常用概念,最常用的工具是实体-联系图(E-R 图)。E-R 图提供以下描述实体型、属性和联系的方法。
实体型: 用矩形表示,矩形框内写明实体名。
属性:用椭圆形表示,并用无向边将其与相应的实体连接起来
联系: 用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体型连接起来,同时在无向边旁标上联系的类型。注意:联系本身也是一种实体型,也可以有属性,联系的属性也要用无向边与该联系连接起来。
两个实体间的三种联系,可以用下图表示。
当实体及联系较多时,可以将 E-R 图分成两部分:实体及属性图和实体及联系图。
2.一个实体内的联系
一个实体内的联系也包括1:1、1:n、m:n 三种。例如,学生实体型内部具有领导和被领导的联系,即班长领导班里的学生,而每个学生只被一个班长领导,如图所示。
3.多个实体间的联系
多个实体间的联系也包括 1:1、1:n、m:n三种。例如,教师课程和学生三个实体集之间存在以下关系:
每个教师可以讲授多门课程给不同的学生,每门课程可能会有多个教师讲授,每个学生可以上多门课程,每门课程都有很多学生选修,所以他们之间是多对多的联系。
又如,每个保管员工作在一个仓库中,保管着多种商品,每种商品只能存放在一个仓库中,每个仓库由多名保管员看管。
以上两个例子中多个实体间的联系如图所示。
数据模型是数据库设计的核心,它用于描述客观事物及其相互关系的数据。有效的数据模型应该能够全面描述系统的静态特性、动态特性和约束条件。以下是数据模型的三个主要要素:
数据结构(描述系统的静态特性)
数据操作(描述系统的动态特性)
数据的约束条件(保证数据的正确性、有效性和一致性)
总的来说,一个有效的数据模型应该能够准确地描述数据的结构、如何操作这些数据,以及如何通过约束条件来维持数据的完整性和一致性。这些要素共同确保了数据库系统能够有效地表示和管理现实世界的复杂数据。
按照数据模型描述角度的不同,数据模型可以分为以下几类
层次模型和网状模型统称为非关系模型。在非关系模型中,实体用记录表示,实体之间的联系转换成记录之间的两两联系。非关系模型数据结构的基本单位是基本层次联系。所谓基本层次联系是指两个记录以及它们之间的一对多(包括一对一)的联系,如图 所示。
图中, R i R_i Ri?位于联系 L i j L_{ij} Lij?的始点,称为双亲结点; R j R_j Rj?位于联系 L i j L_{ij} Lij?的终点,称为子女结点。这三种模型的根本区别在于数据之间联系的方式(即记录型之间的联系方式)不同。关系模型是用“二维表”来表示数据之间的关系;层次模型是用“树结构”来表示数据之间的关系; 网状模型是用“图结构”来表示数据之间的关系。由于它们的数据表示方式不同,当用户使用数据库时,关系模型只用了数据记录的内容,使得用户在关系 DBMS 中操作时,不必去了解数据记录的联系及顺序,自然就觉得使用起来简单方便;而层次模型和网状模型要用记录与记录之间的联系,以及它们在存储结构中的具体安排,这就要求用户有较多的计算机知识,对一般用户来说,使用起来就不太简单方便了。下面对这三种模型做一个简单的介绍。
在层次模型中,每个结点表示一个实体型,称为记录型。一个记录型可有许多记录值,简称为记录。结点之间的有向边表示记录之间的联系。如果要存取某一记录型的记录,可以从根结点开始,按照有向树层次逐层向下查找,查找路径就是存取路径。
下面给出了某学校的系、教研室、教师、班级的层次模型及实例。
下图中的“系”是根结点,该树状结构反映的是实体型之间的结构。该模型实际存储的数据通过链接指针体现它们之间的这种联系。
下图的实例给出了学校里一个系的数据,其他系的情况用虚线框表示,并予以省略。
层次模型不能直接表示多对多的联系。若要表示多对多的联系,可采用如下两种方法:
方法 1: 冗余结点法。将两个实体的多对多的联系转换为两个一对多的联系。
方法 2: 虚拟结点分解法。将冗余结点转换为虚拟结点。虚拟结点是一个指引元,指向所代替的结点。该方法的优点是减少对储存空间的浪费,避免数据的不一致性; 该方法的缺点是改变储存位置有可能引起虚拟结点中指针的修改。
层次模型的特点是记录之间的联系通过指针实现,比较简单,查询效率高。
层次模型的缺点是只能表示 1: n 的联系,尽管有许多辅助手段可以实现 m:n 的联系,但较复杂,不易掌握,由于层次顺序严格、复杂,插入删除操作的限制比较多,导致应用程序编制起来比较复杂。
广义地讲,任何一个连通的基本层次联系的集合都是网状模型图。
上图给出了一个简单的网状模型。由于每一个基本层次联系都代表一对多的联系,因此,若将图形倒置也不可能变成层次模型。图(a)中的每一个结点为一个记录类型,图 (b)是图 (a)的一个具体示例。其中用单向环形链接指针实现联系。可以看出如果零件和配件数量较多,链接将非常复杂。
网状模型中的每个结点表示一个记录类型(实体),每个记录类型可以包含若干个字段(实体的属性),结点间的连线表示记录类型之间一对多的联系,层次模型和网状模型的主要区别如下:
(1) 网状模型中,子女结点与双亲结点的联系不唯一,因此需要为每个联系命名;
(2) 网状模型允许复合链,即两个结点之间有两种以上的联系;
(3) 网状模型不能表示记录之间的多对多联系,需要引进连接记录来表示多对多的联系。
通常,网状数据模型没有层次模型那样严格的完整性约束条件,但 DBTG 在模型 DDL中提供了定义 DBTG 数据库完整性的若干概念和语句:
(1)支持记录码的概念,码能唯一标识记录的数据项集合;
(2) 保证一个联系中双亲记录和子女记录之间是一对多的联系;
(3) 支持双亲记录和子女记录之间的某些约束条件。
网状模型的主要优点是能更为直接地描述现实世界,具有良好的性能,存取效率高。
网状模型的主要缺点是结构复杂。例如,当应用环境不断扩大时,数据库结构就变得很复杂,不利于最终用户掌握,编制应用程序的难度比较大,DBTG 模型的 DDL、DML 语言复杂,记录之间的联系是通过存取路径来实现的,因此程序员必须了解系统结构的细节,增大了编写应用程序的难度。
下图给出了一个简单的关系模型,其中图 (a)给出了关系模式:
部门(部门编号,名称,经理,人数)
员工(员工编号,姓名,性别,部门编号)
图(b)给出了这两个关系模式的关系,关系名分别为部门关系和员工关系,均包含两个元组,部门关系的关键字为部门编号,员工关系的关键字为员工编号。
在关系模型中基本数据结构就是二维表,不用像层次模型或网状模型那样的链接指针。记录之间的联系是通过不同关系中的同名属性来体现的。例如,要查找员工“张三”所属的部门,首先要在员工关系中根据姓名找到所属部门 01,然后在部门关系中找到 01 部门编号对应的名称即可。在上述查询过程中,同名属性的“部门编号”起到了联系两个关系的纽带作用。由此可见,关系模型中的各个关系模式不应当孤立起来看待。