3.1 概念模型的E-R表示法
3.1.1 关系
现实生活中的关系:指人与人之间,人与事物之间,事物与事物之间的相互联系,采用自然语言直接进行描述。 比如张三是李四的老师,王五是赵六的老师,常常表述为张三和李四是师生关系,王五和赵六是师生关系。
离散数学中的关系:定义为集合间笛卡尔积的子集,采用有序多元组的方式进行描述。 如果所有的教师构成一个集合T,所有的学生构成一个集合S,那么所有的师生关系R一定是T×S这个集合的子集,即R⊆T×S。上面两对师生关系一定属于这个子集,即:(张三,李四)∈R,(王五,赵六)∈R。
关系型数据库中的关系:指的是多个集合间笛卡尔积的子集,但描述方式采用的是表格的描述方式。 每个表有个表名(关系名),表头(关系的定义,每列称为一个属性,列标题为属性名),表格内容(每行代表一个元素,也称为一个元组或一条记录),前面所述的师生关系可描述为下表。
3.1.2 关系模式
关系的描述称为关系模式。对关系的描述,一般表示为:关系名(属性1,属性2.....属性n)。
前面的师生关系可描述为:师生(教师,学生);
前面的学生关系可描述为:学生(学号,身份证号,姓名,生日,性别,院系编号)。
3.1.3 关系数据库
建立在关系理论基础上的数据库,在关系数据库中,实体和实体之间的联系均以关系(表格)的形式进行描述。
关系数据库相关概念:
元组:关系中的每一行数据称为一个元组或一条记录。如表3-1有2个元组,表3-2有4个元组。
属性:关系中的每一列称为一个属性,列的名字称属性名。如表3-1有2个属性,表3-2有6个属性。
域:属性的取值范围称为该属性的域。例如属性“性别”的取值范围是【男,女】,属性“院系编号”的取值范围是学校所有的院系编号。
码:也称为键,指的是取值具有唯一性的属性,可以唯一确定表中的一个元组,它可以由一个属性组成,也可以由多个属性共同组成。如表3-2中的学号和身份证号都是码,因为他们的取值具有唯一性,不同学生的学号一定不同,不同学生的身份证号也一定不同。
主码:一个关系中所有的码构成候选码,为了管理上的方便,选定一个候选码作为元组标识,这个候选码称为主码,主码的取值具有唯一性且不能为空。
外码: 如果关系模式R中的某属性(集)k不是R的主键,而是另一个关系S的主键,则该属性(集)是关系模式R的外键。外键把不同的关系(表)联系起来,用于表达实体与实体之间的联系,并实现相应的强制性约束。 外码必须与其所参照的主码必须具有相同的域,且外码的取值只能引用参照表中主码的值或使用空值。
3.2 关系的完整性
3.2.1 关系的完整性约束
关系完整性约束是为保证数据库中数据的正确性和相容性,对关系模型提出的某种约束条件或规则。
完整性通常包括域完整性,实体完整性、参照完整性和用户定义完整性,其中域完整性,实体完整性和参照完整性,是关系模型必须满足的完整性约束条件。
域完整性:域完整性指属性的值域的完整性,包括数据类型、格式、取值范围、是否允许空值等。通过域完整性可限制属性的值,把属性取值限制在一个有限的集合中。如果某个属性的域完整性是0到100范围的整数,那么它就不能是-1,55.5,200这些值。
实体完整性:实体完整性指的是关系数据库中所有的表都必须有主码,而且表中不允许存在如下两种情况的记录:(1)无主码值的记录。(2)与其他记录的主码值相同的记录。
参照完整性:参照完整性指外码的取值必须参照主码的取值,参照的完整性要求关系中不允许引用不存在的记录。 若关系R中的属性A参照关系S中的属性B,则对于R中的每个元组在属性A上的值必须为下面两种之一:(1) 空值。(2)S中某个元组的属性B的取值。
用户自定义完整性:用户自定义完整性指针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求,其实就是业务规则,如一个人口登记系统添加一个公民,其出生日期不能晚于当前日期;银行取款时的取款金额不能大于当前余额等。
3.3 关系代数
3.3.1 关系代数运算符
集合运算符: 并(∪),交(∩),差(-),笛卡尔积(×);
专门关系运算符号:选择(σ),投影(π),连接(⋈),除(÷);
算术比较符号:大于(>),大于等于(≥),小于(<),小于等于(≤),等于(=),不等于(≠);
逻辑运算符: 与(∧),或(∨),非(¬);
其他运算符:更名运算符(ρ),赋值运算符( ←)。
关系代数操作的一个序列形成关系代数表达式,其运算对象是关系,运算结果也是一个关系。
3.3.2 传统的集合运算
并相容性的概念 :
关系R和S并相容指R与S必须具有相同的属性个数,并且每个相对应的属性对都具有相同的域。
R和S的对应属性名不一定要一致,若不一致,则以R关系(前一个关系)的属性名作为运算结果的属性名。
并:关系R与S的并指的是属于关系R或属于关系S的元组组成的集合,如图3-1所示,即:R∪S ={ t | t∈R∨t∈S },因为并运算是集合运算,所以运算结果中的重复元组会被消除。
差:差运算由属于关系R而不属于关系S的元组组成的集合,如图3-2所示,R-S ={ t | t∈R∧t S }。
交:关系R与关系S交运算的结果是属于关系R又属于关系S的元组组成的集合,如图3-3所示,R∩S ={ t | t∈R∧t∈S }。注意,交运算可由差运算导出,即R∩S=R-(R-S)。
笛卡儿积:笛卡尔积运算作用于两个关系,R(A1, A2, . . ., An) × S(B1, B2, . . ., Bm) 的结果为关系Q ,Q具有 n + m 个属性,属性次序为Q(A1, A2, . . ., An, B1, B2, . . ., Bm)。Q对于来自R的一个元组和来自S的一个元组的每一种组合,都有一个相对应的元组。因此, 如果R 有nR 个元组,S 有nS个元组, 则R ×S有nR * nS个元组。
3.3.3 专门的关系运算
选择运算:选择运算用于从一个关系中选出满足选择条件的元组的一个子集。
表示方法为: σ<选择条件>(R)
σ(sigma) 表示选择操作,<选择条件>是作用于关系R的一个布尔表达式。
选择运算是从行的角度进行的运算,如图3-4所示。
投影运算:投影运算用于从一个关系中选择某些列(属性)并丢弃掉其它列(属性)而得到一个新的关系。
表示方法:π<属性列表>(R)
投影运算得到的结果关系仅包含有<属性列表>中列出的属性,并且其顺序和属性列表的顺序一致。
投影运算是从列的角度进行的运算,如图3-5所示。
如果属性列表只包含R的非键属性,那么结果关系中就有可能会出现重复的元组,这时投影运算将会去除结果中任何重复的元组,以保证得到的结果关系是一个有效的关系,这种做法叫重复消除。因此,投影运算得到的结果关系的元组数小于等于关系R的元组个数。
连接运算:每一个条件都是一个逻辑表达式,如果逻辑表达式的形式为AiθBj,则称为θ连接,其中Ai 是关系R的一个属性,Bj 是关系S的一个属性,Ai 和Bj 具有相同的域,θ是一个比较运算符{=, <,≤ , >,≥ ,≠ }。
θ为“=”的连接运算则称为等值连接,等值连接是使用最广泛的一种连接。
如果两个有共通属性(同名属性)的关系做等值连接,则可简化为自然连接,运算符为*。自然连接会将两个关系中同名的属性(组)自动设为相等并作为连接条件进行等值连接,同时将连接结果中同名的属性去掉一列。
连接运算主要是用于将两个有联系的关系关联起来,用于处理关系间的联系。R(A1, A2, . . ., An) 和S(B1, B2, . . ., Bm) 的连接表示为: R⋈<连接条件>S
连接运算是笛卡尔积运算的导出运算,其主要区别是:两个关系所有元组的组合都会出现在笛卡尔积的结果中,而只有符合连接条件的元组才会出现在连接结果中。
除运算:除运算的运算符为÷,其含义可以通过如下描述定义:
(1)关系R的属性为(A1,…,Ak,B1,…,Bm),关系S的属性为(B1,…,Bm,C1,…,Cn),与R与S相同的属性为(B1,…,Bm);
(2)如果R中属性(A1,…,Ak)取值相同的所有元组,其(B1,…,Bm)属性取值得到一个集合RB;
(3)关系S的在属性(B1,…,Bm )上所有取值得到一个集合SB;
(4)如果SB⊆RB,则R中这个在属性(A1,…,Ak)上的这个取值便构成R÷S的一个元组 所有满足上面运算的元组便构成R÷S关系。
3.3.4 其他运算
赋值运算:如果关系表达式的结果没有能够引用的名字,在后面的运算则无法引用这个结果,为了在后面的运算能够引用这个运算结果,需要指定一个关系名并将将运算赋值给这个关系名,后续的进一步运算便可直接使用这个关系名代表运算结果关系,赋值运算符为:←,表示方法为: 关系名←关系代数表达式
通过赋值运算还可以将运算结果的属性名进行修改,修改方式为: 关系名<属性名1,属性名2,…,属性名n>←关系代数表达式
注意:属性名的个数必须与关系代数表达式返回关系的属性个数相同。
更名运算:更名运算和赋值运算一样,用于给关系代数表达式运算结果命名。更名运算符为:ρ,表示方法为: ρ关系名(关系代数表达式)
通过更名运算也可以将运算结果的属性名进行修改,修改方式为: ρ关系名(属性名1,属性名2,…,属性名n)(关系代数表达式)。