思维导图:
前言
第5章 数据库完整性笔记
-
定义:
- 完整性:确保数据的正确性和相容性。
- 正确性:数据与现实世界语义相符、反映实际状况。
- 相容性:同一对象在数据库的不同关系表中数据逻辑上是一致的。
- 完整性:确保数据的正确性和相容性。
-
示例:
- 学号唯一性。
- 性别限定为男或女。
- 本科学生年龄为14-50之间的整数。
- 学生所选课程需为学校提供的。
- 学生所在院系需为学校已建立的。
-
完整性 vs 安全性:
- 完整性:防止非语义、不正确的数据进入数据库。
- 安全性:防止非法访问和恶意破坏。
-
维护完整性的关键功能:
- 定义完整性约束条件:
- 完整性规则是数据必须满足的语义约束条件。
- 概括了数据模型中的数据和联系的制约和依存规则。
- SQL使用实体完整性、参照完整性和用户定义完整性等概念来描述完整性。
- 完整性检查:
- 确保数据满足完整性约束。
- 通常在INSERT、UPDATE、DELETE后进行或在事务提交时进行。
- 违约处理:
- 如果操作违反完整性规则,DBMS会采取行动如拒绝或级联执行其他操作。
- 定义完整性约束条件:
-
发展:
- 早期DBMS不支持完整性检查,认为费时。
- 现代商用关系DBMS都支持完整性控制,减轻了应用程序员的负担。
- DBMS核心功能支持完整性控制,为所有用户和应用提供一致的完整性。
- 应用程序实现完整性控制可能有漏洞,可能被其他应用破坏。
-
之前的内容:
- 第2章2.3节已讲解了关系数据库的三类完整性约束的基本概念。
- 后续会介绍SQL语言实现完整性控制功能的方法。
- 完整性分类
5.1.1 实体完整性
5.1 实体完整性笔记
-
定义:
- 实体完整性:在关系模型中使用CREATE TABLE的PRIMARY KEY来定义。
- 主要为两类:
- 单属性主码:可以在列级或表级定义。
- 多属性主码:只能在表级定义。
-
示例:
-
单属性主码:
- 例5.1:Student表中的Sno属性作为主码。
或CREATE TABLE Student ( Sno CHAR(9) PRIMARY KEY, /* 列级定义主码 */ Sname CHAR(20) NOT NULL, Ssex CHAR(2), Sage SMALLINT, Sdept CHAR(20) );
CREATE TABLE Student ( Sno CHAR(9), Sname CHAR(20) NOT NULL, Ssex CHAR(2), Sage SMALLINT, Sdept CHAR(20), PRIMARY KEY (Sno) /* 表级定义主码 */ );
- 例5.1:Student表中的Sno属性作为主码。
-
多属性主码:
- 例5.2:SC表中的Sno、Cno属性组作为主码。
CREATE TABLE SC ( Sno CHAR(9) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT, PRIMARY KEY(Sno, Cno) /* 只能在表级定义主码 */ );
- 例5.2:SC表中的Sno、Cno属性组作为主码。
-
我的理解:
实体完整性是数据库完整性约束的一个核心概念,特别是在关系数据库模型中。为了深入理解这一概念,让我们从以下几个方面来探讨它:
-
基本定义:
- 实体完整性确保每一个实体(在关系数据库中,通常指的是表中的一行或记录)具有唯一的标识。这意味着对于给定的表,该表的每一行都可以通过一个唯一的值或值组合来区分。
-
主键的作用:
- 在关系数据库中,实体完整性通常通过主键来实现。一个表只能有一个主键,而这个主键可以是单一的列,也可以是多列的组合。
- 主键的值不能是NULL,因为NULL表示“未知”或“不适用”,而实体的唯一标识不能是未知的。
- 在一个表中,主键的值必须是唯一的,即不能有两个或两个以上的行/记录具有相同的主键值。
-
为什么需要实体完整性?:
- 数据的唯一性:实体完整性确保了数据的唯一性,避免了数据的重复,从而提高了数据的准确性和可靠性。
- 数据检索:通过确保每个记录都有一个唯一的标识,可以快速、准确地检索到所需的数据。
- 数据关系:在关系数据库中,表与表之间的关联(如外键关系)依赖于实体的唯一标识,实体完整性保证了这种关系的稳定性和可靠性。
-
实际应用:
- 想象一个学生信息系统,每个学生都有一个唯一的学号。这个学号就是保证每个学生数据唯一性的主键。没有两个学生可以有相同的学号,且学号不能为空。这就是实体完整性在实际应用中的体现。
总之,实体完整性是确保数据的一致性、准确性和可靠性的关键概念,它通过确保每个实体都有一个唯一的标识来实现。在关系数据库设计和管理中,对实体完整性的理解和实施是至关重要的。
5.1.2 实体完整性检查和违约处理
核心概念:
当使用PRIMARY KEY
定义了关系的主码,每次数据插入或更新操作时,数据库管理系统会自动检查实体完整性规则。这包括:
- 唯一性检查:系统会验证主码值是否唯一。如果不唯一,操作会被拒绝。
- 非空检查:系统会检查主码的所有属性是否有空值。任何空值都会导致操作被拒绝。
方法:
-
全表扫描:
- 检查主码值唯一性的直观方法是扫描整张表,对比每一条记录的主码值。这样确保没有重复值。
- 这种方法在数据量大时是低效的。
示意图:图5.1全表扫描方法检查主码唯一性
-
索引方法:
- 为了提高检查的效率,数据库管理系统通常在主码上自动创建索引。
- B+树索引是常见的索引方法,允许快速查找特定的主码值。
- 通过索引查找,可以迅速确定是否有重复的主码值,避免了全表扫描的耗时。
示意图:图5.2使用B+树索引检查主码唯一性
总结: 实体完整性是数据库完整性的核心,而高效的检查和处理违约是实现这一完整性的关键。利用索引结构(如B+树)可以有效地加速这一过程,确保数据的准确性和完整性,同时提高操作的效率。
疑问:
什么是B+树?
B+树是一种自平衡的树结构,用于在数据库和文件系统中存储数据。它是B树的一种变种,具有特定的优点,特别是在磁盘存储和数据查找中。
下面是B+树的主要特点和相关解释:
-
多路平衡搜索树:B+树是一个多路的树结构,每个节点可以有多个孩子。这有助于减少树的高度,因此,使磁盘I/O次数减少(因为树的深度较小)。
-
所有关键字都出现在叶子节点:与B树不同,B+树的非叶子节点不存储键值记录,只存储键以及键的孩子节点。所有的叶子节点构成一个有序链表,其中包含所有的键和相关的记录或指向记录的指针。
-
增加和删除是平衡的:当插入或删除关键字时,B+树会自动进行分裂或合并操作,确保每个节点的关键字数量在预定义的范围内,保持树的平衡。
-
高效的范围查询:由于所有的叶子节点构成一个有序链表,B+树非常适合范围查询,只需找到起始关键字,然后遍历链表即可。
-
节点含有固定数目的子节点:B+树的节点有一个最大和最小的孩子数目限制。这些限制保证了树的平衡,并且使每次磁盘I/O读取的数据量最大化。
在数据库中,B+树主要用于索引结构,因为它支持快速的插入、删除和查找操作,并且在磁盘I/O操作中非常高效。
5.1 实体完整性重点、难点和易错点总结:
重点:
- 实体完整性的定义:确保数据表中每一行都能被唯一地标识,通常通过主键来实现。
- 主键的作用:主键不仅标识数据表中的唯一记录,还确保数据的完整性和可靠性。
- 主键的选择:选择合适的主键至关重要,因为它会影响数据库性能和操作的便捷性。
- 实体完整性的维护:通过数据库管理系统提供的各种工具和机制来维护,例如通过使用
PRIMARY KEY
约束。
难点:
- 多属性的主键:在某些情况下,需要使用多个属性组合作为主键(复合主键),这可能导致复杂性增加。
- 实体完整性的违规处理:当发生违反实体完整性的操作时,数据库管理系统应如何响应(例如,是否拒绝操作、发送警告或自动纠正)。
易错点:
- 误认为所有表都需要主键:虽然主键对于确保实体完整性非常有用,但并非所有表都需要主键。某些情况下,特别是在关系数据库中的连接表,可能不需要主键。
- 选择不适当的主键:选择不恰当的主键可能导致效率问题或不必要的复杂性。
- 允许主键有空值:主键的定义是它不能有空值。允许主键有空值会违反实体完整性。
- 修改主键值:尽管技术上允许这样做,但修改主键值可能会导致数据完整性问题或与其他表的关系断裂。
了解这些重点、难点和易错点有助于更好地理解和应用实体完整性的概念,从而建立和维护更加健壮和可靠的数据库系统。