1.3 关系数据库的数据模型
关系数据库是以关系模型为基础的数据库,用关系模型来组织数据,通常涉及数据结构、数据操作和数据完整性约束这三个方面的内容。
(1)数据结构:关系数据库用关系这一数据结构描述数据库组成对象以及对象间的联系,它描述了数据库的静态特性,是数据模型中最基本的部分。
(2)数据操作:数据操作是指对数据库中各种数据对象允许执行的操作集合,包括操作及相应的操作规则,它描述了数据库的动态特性,主要有检索和更新两大类操作。
(3)数据完整性约束:是一组完整性规则的集合。完整性规则是数据库中的数据及其联系所具有的制约和依存规则,用于保证数据的正确、有效、相容。
1.3.1 关系数据库的数据结构
关系模型具有单一的数据结构,不论是实体还是实体之间的联系都用关系表示。那么关系是什么呢?在用户观点下,关系就是一张二维表,它由行和列组成。请注意,并不是所有的二维表都是关系,只有满足如下规范条件的二维表才能成为一个关系。
① 表的每行存储了某个实体的数据。例如在表seller中,每行都包含某个销售员的数据信息。
② 表的每列包含了用于表示实体某个属性的数据。例如在表seller中,每列都包含了销售员的一个属性,如姓名、性别或地址等。
③ 表中的每个单元格都不能再分,只能存储一个值。
④ 任意一列中所有单元格的数据类型必须一致。例如,表的第1行第4列是一个日期值,那么其他所有行中的第4列也必须是日期值。
⑤ 每列都必须有唯一的名称,但表中列的顺序任意。
⑥ 行的顺序任意,但表中任意两行不能有完全相同的数据值。
上面六条规范条件中,最基本的一条是:二维表的每一个单元格不可再分,即不允许表中还有表。表1-7就是不满足这一基本规范的示例表,对于单元格“姓名”又分成了“姓”和“名”两个分量;对于“出生日期”又分成了“年”“月”“日”三个分量。
表1-7 表中有表的示例
上面介绍了关系的概念,为了便于理解,下面举例说明这个抽象的学术术语。日常生活中,大家常常需要买东西,当销售员将商品卖给我们的时候,一张订单就产生了。显然,销售员和商品是实体,订单反映的是销售员和商品之间的销售关系。
表1-8描述了关系seller的数据结构,表1-9描述了关系product的数据结构,表1-10描述了关系 order 的数据结构。需要注意的是,seller 和 product 反映的是实体属性信息,而 order反映的是实体销售员和实体商品的销售关系。在关系模型中,不论实体还是实体间联系都用关系表示。
表1-8 实体seller的关系
表1-9 实体product的关系
表1-10 联系order的关系
交待清楚关系这个概念后,我们说明一下与关系有关的几个概念。
① 记录。对于一个关系,通常将其中的每一行称为一个记录,或称为一个元组。在表1-9旁边,对记录这一概念进行了标注。
② 字段。将关系中的每一列称为一个字段,或称为一个属性。在表1-8和表1-9附近,对字段这一概念都进行了标注。
③ 关键字。在表的字段中,有一个字段或一组字段可以唯一标识一个记录,将这个字段或字段组称为关键字。可以起到这样作用的关键字有两类:候选关键字和主关键字。
? 候选关键字:一个关系中可以唯一标识一个记录的一个字段或多个字段的组合。一个关系中可以有多个候选关键字。
? 主关键字:把关系中的一个候选关键字定义为主关键字。一个关系中只能有一个主关键字,用以唯一标识记录,简称为主键。在表1-8、表1-9和表1-10附近,对关键字这一概念都进行了标注。
④ 外部键。如果某个关系中的一个字段或字段组合不是所在关系的主关键字或候选关键字,但却是其他关系的主关键字,对这个关系而言,称其为外部关键字,简称外键。在表1-10附近,对外部关键字这一概念进行了标注。
⑤ 域。关系中的每一字段有一个取值范围,称为域。域是一组具有相同数据类型的值的集合。如库存的域是(0,999),又如性别的域为:(“男”,“女”)。
1.3.2 关系数据库的数据操作
由于关系模型借助集合代数等来操纵数据库中的数据,因此关系操作是集合操作,即操作的对象和结果都是集合,这种操作称为一次一个集合的方式。
关系模型既支持并、差、交、积等传统操作,又支持选择、投影和连接等专门关系操作。
1.传统的集合操作
传统的集合运算包括并、差、交、积等传统的集合运算。设关系R(见表1-11)和关系S(见表1-12)都具有n个属性,且相应属性值取自同一个值域,则可以定义并、差、交和积运算。
表1-11 关系R
表1-12 关系S
(1)并运算:两个已知关系R和S的并记作:R∪S,将产生一个包含R、S中所有不同记录的新关系。并运算的示例如表1-13所示。
表1-13 R∪S的操作结果
(2)差运算:两个已知关系R和S的差,是所有属于R但不属于S的记录组成的新关系。记作:R-S。差运算的示例如表1-14所示。
表1-14 R-S的操作结果
(3)交运算:两个已知关系R和S的交,是属于R而且也属于S的记录组成的新关系。记作:R∩S。交运算的示例如表1-15所示。
表1-15 R∩S操作结果
(4)积运算:两个已知关系R和S的积,是R中每个记录与S中每个记录连接组成的新关系。记作:R×S。如果R有m个记录,S有n个记录,那么R×S中有m×n个记录。积运算是一种特殊的连接运算,单纯的积运算一般没有实际意义,这里就不给出示例了。
2.专门的关系操作
专门的关系操作只有三种:选择、投影和连接。选择和投影的操作对象通常是一个表,分别对一个表中的数据进行横向的或纵向的抽取;而连接操作则是对两个表进行的操作。
(1)选择
从一个关系中找出满足给定条件的记录的操作称为选择。选择是从行的角度对关系内容进行的筛选,经过选择操作后得到的结果可以形成新的关系,其关系模式不变,其内容是原关系的一个子集。
例如,从表1-8所示的seller表中筛选出所有的女员工,就是一种选择操作。得到的结果将如表1-16所示。
表1-16 选择操作举例——筛选所有的女销售员
(2)投影
从一个关系中找出若干个字段组成新的关系的操作称为投影。投影是从列的角度对关系内容进行的筛选或重组,经过投影操作后得到的结果也形成新的关系。新关系的关系模式所包含的字段个数一般比原关系少,其内容是原表的一个子集。
例如,从表1-5所示的seller表中抽取“姓名”“性别”两个字段构成一个新表的操作,就是一种投影操作。得到的结果如表1-17所示。
(3)连接
连接是将两个关系中的记录按一定的条件横向组合,拼接成一个新的关系。不同关系中的公共字段或者具有相同语义的字段是实现连接操作的纽带。
表1-17 投影操作举例——显示销售员的姓名和性别
最常见的连接操作是自然连接,它是利用两个关系中共有的一个字段,将该字段值相等的记录内容连接起来,去掉其中的重复字段作为新关系中的一条记录。表1-18给出了product表和order表按照商品编号进行自然连接的结果。
表1-18 连接操作举例
连接过程是通过连接条件来控制的:首先在表1中找到第一个记录,然后从表头开始扫描表2,逐一查找满足连接条件的记录,找到后,将该记录和表1中的第一个记录进行拼接,形成查询结果中的一个记录。表2中的记录全部查找以后,再找表1中的第2个记录,然后再从头开始扫描表2,逐一查找满足连接条件的记录,找到后,将该记录和表1中的第2个记录进行拼接,形成查询结果中的又一个记录。重复上述操作,直到表1中的记录全部处理完毕。可见,连接查询是相当耗费计算资源的,应该慎重选择连接操作。
1.3.3 关系数据库的数据约束
数据完整性是指关系模型中数据的正确性与一致性,关系模型允许定义的完整性约束有:实体完整性、域完整性和参照完整性。关系型数据库系统提供了对实体的完整性、域完整性和参照完整性约束的自动支持,也就是在进行插入、修改或删除操作时,数据库系统自动保证数据的正确性和一致性。
(1)实体完整性约束。该约束保证实体是可识别的和唯一的,通过在关系中定义关键字来实现。在任何关系的任何一个元组中,关键字的值不能为空值、也不能取重复的值。例如:关系seller指定编号为主键;关系product指定商品编号为主键。
(2)域完整性约束。该约束保证实体属性取值的正确性和有效性,通过在关系中定义属性的数据类型、设置属性的有效性规则等实现。域完整性约束由用户根据实际情况设定:例如 seller表中指定sex是字符型字段,它的宽度是2,并且sex∈{男,女};又如order表中销量整型数据,并且销量值要大于1,同时要低于product表的库存值。
(3)参照完整性约束。该约束定义了一个实体相对于另外一个实体应该遵循的约束规则,描述了实体之间的特定联系,通过在关系中定义主键和外键的约束规则来实现。例如,将 seller 表的主键“销售员编号”引入到order表中作为外键,然后定义约束规则,要求order表的“销售员编号”必须是 seller 表中已经存在的“销售员编号”。这一约束的语义是 order 表不能引用 seller表中不存在的实体。