在数据库设计中,关系数据理论是至关重要的一个环节,它涉及到如何构建合理、高效、稳定的数据库模式。本讲主要讨论了关系数据理论的基础知识,包括关系模式的设计、函数依赖以及码的概念。
关系数据库逻辑设计的目标是为了解决实际问题创建一个合适的数据库模式,这包括确定应该有多少个表,每个表包含哪些列,以及这些列是如何相互关联的。在给出的例子中,单一的关系模式`Student(Sno, Sdept, Mname, Cno, Grade)`被认为不是一种好的设计,因为它可能导致数据冗余、更新异常、插入异常和删除异常。这些问题会降低数据的一致性和完整性,增加存储空间的浪费,并可能导致数据库操作的复杂性。
接下来,我们深入探讨了关系模式的形式化定义。关系模式`R(U, D, DOM, F)`由五部分组成:关系名`R`,属性名集合`U`,属性域`D`,属性向域的映射`DOM`,以及属性间的数据依赖关系集合`F`。其中,数据依赖是理解数据库设计的关键,特别是函数依赖和多值依赖。
函数依赖是描述属性间关系的重要工具。如果在关系模式`R(U)`中,对于任何可能的关系`r`,如果两个元组在`X`上的属性值相同,那么它们在`Y`上的属性值也必须相同,我们说`X`函数确定`Y`,记作`X→Y`。例如,在`Student`关系模式中,`Sno`可以唯一确定`Ssex`、`Sage`和`Sdept`,但`Ssex`不能唯一确定`Sage`,因为可能存在同性别但不同年龄的学生。
函数依赖分为平凡函数依赖和非平凡函数依赖。平凡函数依赖是指`Y`完全包含在`X`中,如`Sno, Cno → Sno`和`Sno, Cno → Cno`;而非平凡函数依赖则是`Y`不包含在`X`中,如`(Sno, Cno) → Grade`。完全函数依赖是指`Y`完全依赖于`X`,即使去除`X`中的任何属性,`Y`都不能被确定;部分函数依赖则是`Y`部分依赖于`X`,即`Y`不完全由`X`决定。例如,在`SC`关系中,`(Sno, Cno)`完全确定`Grade`,而`Sno`部分确定`Sdept`。
传递函数依赖指的是如果`X→Y`且`Y→Z`,但`Y`不包含在`X`中,那么`Z`间接依赖于`X`。在`Std`关系中,`Sno`通过`Sdept`传递函数依赖于`Mname`。
码(Candidate Key)是能够唯一标识关系中元组的属性或属性组合。如果一个属性或属性组合`K`能够函数确定关系模式`R<U,F>`中的所有其他属性,那么`K`就是`R`的一个候选码。如果存在多个候选码,可以选择其中一个作为主键(Primary Key)。主键是表中的主要标识符,确保了记录的唯一性,而其他依赖于主键的属性被称为非主属性。
理解并掌握关系数据理论中的这些基本概念对于进行有效的数据库设计至关重要,它们帮助我们创建无冗余、无异常的数据结构,从而保证数据库的稳定性和数据的完整性。在实际应用中,这些理论知识将指导我们构建高效、可靠的数据库系统。