关系数据库的结构
表、行
关系数据库由表(table)的集合构成,每张表被赋予了一个唯一的名称。
一般来说,表中的一行代表了一组值之间的某种联系。由于一张表就是这种联系的一个集合,从而表的概念和数学上的关系概念之间有着密切的关联,这也正是关系数据库名称的由来。在数学术语中,元组只是一组值的序列(或列表)。n个值之间的一种联系在数学上用这些值的一个n元组来表示。n元组就是具有n个值的元组,它对应于表中的一行。
由此,在关系模型中:
术语 | 指代 |
---|---|
关系 | 表 |
元组 | 行 |
属性 | (表中的)列 |
关系实例 | 一个关系的特定实例(关系实例包含一组特定的行) |
由于关系是元组的集合(set),所以元组在关系中出现的顺序是无关紧要的。为便于说明,我们通常按关系的第一个属性的次序来显示关系。
域
对于关系的每个属性都存在一个允许取值的范围,称为该属性的域(domain)。
我们要求对所有关系r而言,r的所有属性的域都是原子的。如果一个域中的元素被认为是不可再分的单元,则该域就是原子的(atomic)。
重点不在于域本身是什么,而在于我们怎样在数据库中使用域中的元素。
空值(null value)是一个特殊的值,它表示值未知或并不存在。空值在我们访问和更新数据库的时候会带来很多麻烦,因此应尽量避免使用空值。
优劣评价
相对严格的关系结构在数据的存储和处理方面产生了几个重要的实际优势。这种严格的结构适用于定义明确且相对静态的应用,但不太适用于不但数据本身而且这些数据的类型和结构都随时间变化的应用。结构化的数据效率高,但在某些场景下预先定义的结构比较受限,现代企业需要在这二者之间找到一种良好的平衡。
数据库模式
数据库模式 | 数据库实例 |
---|---|
数据库的逻辑设计 | 给定时刻数据库中数据的一个快照 |
类比:
关系 | 关系模式 |
---|---|
程序设计语言中变量的概念 | 程序设计语言中类型定义的概念 |
一般来说,一个关系模式由一个属性列表以及各属性所对应的域组成。
关系实例->程序设计语言中变量的值的概念
一个给定变量的值可能随时间发生变化;类似地,随着关系被更新,关系实例的内容也随时间发生了变化。相反,关系的模式不是不常变化的。
实际上,在关系模式中使用公共属性正是将不同关系联系起来的一种方式。
码
一个元组的所有属性值必须能够唯一标识元组,换句话说,一个关系中不可以有两个元组在所有属性上取值完全相同。
起码(superkey)
起码(superkey)是一个或多个属性的集合,将这些属性组合在一起可以允许我们在一个关系中唯一地标识出一个元组。
候选码
起码中可能包含无关紧要的属性,如果K是一个超码,那K的任意超集也是超码。我们通常只对这样的超码感兴趣,它们的任意真子集都不是超码。这样的最小超码称为候选码(candidate key)。
我们将用主码(主键 primary key)这个术语来代表被数据库设计者选中作为在一个关系中区分不同元组的主要方式的候选码。
码(不论是主码、候选码或超码)是整个关系的一种性质,而不是单个元组的性质。关系中的任意两个不同的元组都不允许在码属性上具有相同的值。码也被称为主码约束(primary key constraint)。
习惯上,将一个关系模式的主码属性列于其他属性之前。主码属性还要加下划线。
1)主码选择必须慎重
2)主码应该选择那些其值从不变化或极少变化的属性
外码约束
从r1关系的A属性(集)到r2关系的主码B的外码约束(foreign-key constraint)表明:在任何数据库实例中,r1中每个元组对A的取值也必须是r2中某个元组对B的取值。A属性集被称为从r1引用到r2的外码(foreign key)。r1关系也被称为此外码约束的引用关系(referencing relation),且r2被称为被引用关系(referenced relation)。
请注意在外码约束中,被引用属性(集)必须是被引用关系的主码。
引用完整性约束要求引用关系中的任意元组在指定属性上出现的取值也必然出现在被引用关系中至少一个元组的指定属性上。
事实上,外码约束是引用完整性约束的一种特例,其中被引用的属性构成被引用关系的主码。
当今的数据库系统通常支持外码约束,但它们并不支持被引用属性并不是主码的引用完整性约束。
模式图
一个带有主码和外码约束的数据库模式可以用模式图(schema diagram)来表示。
每个关系为一个框,关系名用灰色显示在顶部,并且在框内列出了各属性。
主码属性用下划线标注。外码约束用从引用关系的外码属性指向被引用关系的主码属性的箭头来表示。
我们使用双向箭头而不是单项箭头来表示不是外码约束的引用完整性约束。
关系查询语言
查询语言(query language)是用户用来从数据库中请求获取信息的语言。
分为:命令式、函数式、声明式
- 命令式查询语言:
用户指导系统在数据库上执行特定的运算序列以计算出所需的结果;这类语言通常有一个状态变量的概念,状态变量在计算的过程中被更新。 - 函数式查询语言:
计算被表示为对函数的求值,这些函数可以在数据库中的数据上运行或在其他函数给出的结果上运行;函数没有附带作用,并且它们并不更新程序的状态。 - 声明式查询语言:
用户只需描述所需信息,而不用给出获取信息的具体步骤序列或函数调用,所需信息通常使用某种形式的数学逻辑来描述,找出获得所需信息的方式是数据库系统的工作。
参考文献:
《数据库系统概念》(原书第七版)机械工业出版社