



关系模式是对关系的描述(有哪些属性,各个属性之间的依赖关系如何),关系模式可以形式化地表示为:R (U,D,dom,F),其中,R为关系名,U是组成该关系的属性名集合,D是属性组 U 中属性所来自的域,dom是属性向域的映像集合,F是属性间的数据依赖关系集合。关系模式通常可以简记为:
其中:R为关系名,A 1 ,A 2 ,…,A n 为属性名。
关系与关系模式是关系数据库中密切相关而又有所不同的概念。关系模式描述关系的数据结构和语义约束,它不是集合,而关系是一个数据集合;关系模式是相对稳定的,而关系是随时间变化的,是某一时刻现实世界状态的真实反映,是关系模式在某一时刻的“当前值”。也就是说,关系模式是对关系的描述,关系是关系模式在某一时刻的状态或内容,关系模式是型,关系是它的值。
总而言之,一个关系模式的任何一个“当前值”称为该关系模式的关系实例(Instance),指由一组属性及属性数目相同的元组组成的集合。关系(Relation)是二维表的抽象,无论是实体集还是实体之间的联系均由单一的“关系”结构类型表示。
【例2-1】 下面是网上书店系统中部分实体的关系模型的例子。
①用户(用户号,账号,密码,姓名,性别,地址,邮编,电话,Email),关系表如表2-1所示。
②书籍(书籍编号,ISBN,书名,作者,出版社编号,出版日期,页数,版本,分类编号,库存数量,价格,折扣价),关系表如表2-2所示。
③出版社(出版社编号,出版社名称,电话,Email,地址,邮编,网址),关系表如表2-3所示。
④订单信息(订单号,书籍编号,书名,下单时间,下单数量),关系表如表2-4所示。
⑤订单细节(订单号,下单时间,支付方式,用户号,送货编号,订单状态,发货时间,预计到达时间,收货人,收货人地址,收货人电话,邮编),关系表如表2-5所示。
⑥书籍类别(分类编号,类别名称,父类别编号),关系表如表2-6所示。
表2-1 用户表
User_List
表2-2 书籍信息表
Book_Information
续表2-2 书籍信息表
Book_Information
(续上表)
表2-3 出版社信息表
Press_Information
表2-4 订单信息表
Order_Information
表2-5 订单细节表
Order_List
(续上表)
续表2-5 订单细节表
Order_List
表2-6 书籍类别表
Book_Category
关系模式中的一些主要术语如表2-7所示。
表2-7 关系模型中的主要术语(与计算机中的术语对照)
①属性(Attribute):表中的一列代表了一个属性,而每个属性都有一个属性名。如表2-2中,书籍编号、ISBN、作者、出版社编号……都是该书籍信息表的属性。
②域(Domain):一组具有相同数据类型的值的集合,又称为值域,指属性的取值范围。如规定书籍的价格必须大于0,出版日期必须是时间类型等。
③元组(Tuple):表中的一行代表了一个元祖,它表示一个实体。如表2-2中,共有6个元组。二维表中所有元组称为一个实体集。
④关系模式(Relation Schema):一个关系的属性名的集合,一般形式为:关系名(属性1,属性2,…,属性n),如书籍(书籍编号,ISBN,书名,作者,出版社编号,出版日期,页数,版本,分类编号,库存数量,价格,折扣价)。由定义可以看出,关系模式是关系的框架,或者称为表框架,指出了关系由哪些属性构成,是对关系结构的描述。
⑤码(Key)或键:用来在关系模型中标识元组、建立关系之间联系的属性或属性组。关系模型的码有以下几种类型:
a.候选键(Candidate Key):二维表中唯一能标识关系中元组的属性或属性集,则称该属性或属性集为候选键,也称候选关键字或候选键。
b.主键(Primary Key):二维表中的某个属性或属性组,它可以唯一确定一个元组,主键有时也称为码,通常是从候选键中选定一个候选键作为主键。码是整个关系的性质,而不是一个个元组的性质。关系中的任意两个元组都不允许同时在码属性上具有相同的值。在出版社(出版社编号,出版社名称,电话,Email,地址,邮编,网址)中,可以选定“出版社编号”为主键,如果“出版社名称”各不相同,也可以选定“出版社名称”作为主键。
c.复合键(Compound Key):如果关系的主键不是一个属性,而是多个属性的组合,那么这样的主键被称为复合键。复合键中的各个属性称为主属性,关系中其余的属性称为非主属性。
d.外键(Foreign Key):若关系 R 的属性(或属性组)M是关系 S 的主键,则称 M 是关系 R 的外键。其中 R 被称为参照关系,S被称为被参照关系。
【例2-2】 候选键示例。
出版社(出版社编号,出版社名称,电话,Email,地址,邮编,网址)中,如果“出版社名称”可以相同,那么只有“出版社编号”是唯一可以标识表中的每一个元组的,则该表的候选键就是“出版社编号”;如果“出版社名称”不能相同,那么“出版社编号”“出版社名称”都可以作为该表的候选键,标识表中的各个元组。
【例2-3】 复合键示例。
订单信息(订单号,书籍编号,书名,下单时间,下单数量)中,“订单号”和“书籍编号”不能单独作为该关系的主键,因为它们各自都不能唯一地确定一个元组。只有将“订单号”和“书籍编号”结合起来,才能唯一确定一个订单所要订购的书籍,所以该关系的主键是(订单号,书籍编号),该主键就是一个复合键。其中“订单号”和“书籍编号”就是主属性,而“下单时间”和“下单数量”就是非主属性。
【例2-4】 外键示例。
在书籍(书籍编号,ISBN,书名,作者,出版社编号,出版日期,页数,版本,分类编号,库存数量,价格,折扣价)和出版社(出版社编号,出版社名称,电话,Email,地址,邮编,网址)这两个关系中,“出版社编号”是出版社资料信息表的主键,它同时又是书籍信息表中的一个属性,所以是书籍信息表的外键。
关系可以根据属性、元组数目和存储状况分为三类。
①按属性分类:当一个关系中含有n个属性时就称该关系为n元关系。当该关系没有任何属性时,关系为空关系。
②按元组数目分类:如果一个关系的元组数目是无限的,则称为无限关系,否则称为有限关系。由于计算机存储系统的限制,通常情况下都只研究有限关系。
③按存储状况分类:基表(表或基本表),即实际存在的表(实表),它是数据实际存储的逻辑表示;查询表,查询结果表或者查询时临时生成的表;视图表,是由基表或其他视图导出的表,是为了数据查询方便、数据处理简便以及确保数据安全而设计的数据虚表,有表结构但不对应实际存储的数据。
尽管关系与二维表、传统的数据文件是非常类似的,但它们之间又有着重要的区别。严格地说,关系是规范化的二维表中的行的集合,为了使相应的数据操作简化,关系做了种种限制,具有如下特征:
①元组个数有限性。二维表中元组个数有限。
②元组的唯一性。关系中各元组均不相同。因为在数学里,集合中没有相同的元素,而关系是元组的集合,所以作为集合元素的元组是唯一的。
③元组的次序无关性。二维表中元组次序可以任意交换,即行的次序可以任意交换。因为集合中的元素是无序的,所以作为集合元素的元组也是无序的。根据这个性质,可以改变元组的顺序使其具有某种排序,然后按照顺序查询数据,可以提高查询效率。
④属性名唯一性。二维表中属性各不相同。
⑤属性的次序无关性。二维表中属性顺序可以任意交换,即列的次序可以任意交换。交换时,应连同属性名一起交换,否则将得到不同的关系。
⑥分量值域的同一性。关系属性列中,分量具有与该属性相同的值域,即二维表中各个元组相同的属性列取值来自相同的域。
⑦列不可再分性。二维表中每一个属性值都是不可分的基本数据项,或者说所有属性值都是一个确定的值,而不是值的集合。属性值可以为空值,表示“未知”或“不可使用”,但不可“表中有表”。满足此条件的关系称为规范化关系,否则称为非规范化关系。如表2-8所示,若以“用户表(用户号,账号,密码,联系方式,性别)”作为该二维表的关系模式,则出现了还可细分的数据项“联系方式——地址、邮编、电话、Email”,不满足列不可再分性的,不是规范的“关系”。
表2-8用户表
关系数据库所使用的关系语言具有高度非过程化的特点,即用户只需说明“做什么”,而不必说明“怎么做”,一切过程都由DBMS完成。在关系模型中,关系操作方式的重要特点就是“集合操作”,即操作的对象和结果都是集合。这种操作方式称为一次一集合(set-at-a-time)的方式,而非关系模型的数据操作是一次一记录(record-at-a-time)的方式。
关系模型的关系操作包括查询(Query)操作和更新操作。更新操作则包括了插入(Insert)、删除(Delete)和修改(Update)三种操作。而在关系数据库中,主要通过数据操纵语言(DML)实现对数据的查询和更新操作,后续章节会对此内容进行详细介绍。
用户通过查询操作完成对数据的检索。在关系模型中,查询操作可以对一个关系的若干属性进行查询,可以对一个关系内若干元组进行查询,也可以对几个关系之间更复杂的属性和元组进行查询。
查询操作包括多个关系操作的内容,如:选择(Selection)、投影(Projection)、连接(Join)、除(Division)、并(Union)、交(Intersection)、差(Difference)、笛卡尔积(Cartesian Product)等。
插入操作是在指定关系中插入一个或多个元组。它可以将指定元组插入一个关系中,也可以插入不同关系中。
删除操作是删除指定关系的指定元组。
修改操作是在一个关系中修改指定元组的属性值。
为了维护数据库中数据与现实世界的一致性,保证数据的正确性和相容性,对关系数据库的插入、删除和修改等操作必须有一定的约束条件,这就是关系模型的三类完整性约束:实体完整性、参照完整性和用户定义的完整性。
实体完整性规则:若属性 A 是基本关系 R 的主属性,则 A 不能取空值。
【例2-5】 在关系模式书籍(书籍编号,ISBN,书名,作者,出版社编号,出版日期,页数,版本,分类编号,库存数量,价格,折扣价)中,“书籍编号”作为该关系中的主键,其取值不能为空。
关系模型中的一个元组对应一个实体,一个关系则对应一个实体集。例如,一条书籍信息记录对应着一本图书,书籍信息关系对应着所有图书的集合。现实世界中的实体是可区分的,即它们具有某种唯一性标识。与此相对应,关系模型中以主键来唯一标识元组。例如,书籍信息关系中的属性“书籍编号”可以唯一标识一个元组,也可以唯一标识书籍实体。如果主键的值为空或部分为空,即主属性为空,则不能唯一标识元组及与其相对应的实体。这就说明存在不可区分的实体,从而与现实世界中的实体是可以区分的事实相矛盾,因此主关系键的值不能为空或部分为空。
参照完整性规则:若属性(或属性组)F是基本关系 R 的外键,它与基本关系 S 的主键ZS相对应,那么关系 R 中的每一个元组在 F 上的取值要么取空值,要么等于 S 中的某个元组的主键值。
规则说明:
①关系 R 和S不一定是不同的关系,可以是同一个关系。
②被参照关系 S 的主键ZS和参照关系的外键 F 必须定义在同一个(或一组)域上。
③外键并不一定要与相应的主键同名,不过有时为了易于辨识,外键与相应的主键可以同名。
参照完整性规则是定义外键与主键之间的引用规则。这条规则说明:实体之间存在着联系,因而存在关系和关系之间的引用,且不允许引用不存在的实体。
实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作关系的两个不变形,任何关系数据库系统都应该支持这两类完整性。
(1)同一个关系之间属性的引用。
【例2-6】 书籍类别表(表2-6)描述一本书所属的类别信息,每一个类别又有其相应的子类别,实际上是一个树状结构。在该关系中分类编号是主键;父类别编号是表的外键,它的取值参照着分类编号的取值。由于父类别编码不是该关系的主键,所以它的取值可以为空,表示该类别是树根,只有子类别,没有父类别。
(2)多个关系之间属性的引用。
【例2-7】 书籍信息表(表2-2)的“出版社编号”和“分类编号”是该表的外键,它们分别参照着出版社信息表(表2-3)中的“出版社编号”和书籍类别表中的“分类编号”取值,理论上书籍信息表中的“出版社编号”和“分类编号”是可以取空值的,但考虑到在实际应用中,书籍是必须由出版社出版的,所以不能取空。而“分类编号”可以为空,在这里就表示该书还没有被确定类型。
(3)外键作为一个关系的主键。例2-6和例2-7 中讨论的是外键作为一个关系的非主属性,而外键也可以作为一个关系的主属性。
【例2-8】 订单信息表(表2-4)中的“订单号”“书籍编号”分别参照订单细节表(表2-5)中的“订单号”和书籍信息表(表2-2)中的“书籍编号”取值,是订单信息表的外键。同时“订单号”和“书籍编号”又是订单信息表的主键,所以取值不能为空,否则违反了实体完整性规则。
除了以上两种完整性约束外,不同的关系数据库系统由于应用环境的不同,往往还需要一些特殊的约束条件,这就是用户定义完整性。
用户定义完整性规则更加明确地反映了某一具体应用所涉及的数据必须满足的语义要求,它是针对该具体关系数据库应用而设定的一系列约束条件,在实际应用中非常重要,如规定书籍价格的取值不能小于0,用户性别只能取“男”或“女”等。关系模型给用户提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们,不需要由应用程序承担这一功能。