文章目录
- 第 4 章 关系模型的基本原理
- 1. 关系模型的基本概念
- 1.1 基本术语
- 1.2 关系的特征
- 2. 数据完整性
- 2.1 三类完整性规则
- 2.1.1 实体完整性
- 2.1.2 参照完整性
- 2.1.3 域完整性
- 3. 【例1】大学数据库
- 3.1 学生(Students)关系
- 3.2 课程(Courses)关系
- 3.3 选课(Enrollments)关系
- 3.4 示例数据
- 4. MySQL约束控制
- 4.1 非空(NOT NULL)约束
- 4.2 主键(PRIMARY KEY)约束
- 4.3 唯一(UNIQUE)约束
- 4.4 检查(CHECK)约束
- 4.5 外键(FOREING KEY) 约束
- 4.6 自增(AUTO_INCREMENT)约束
- 4.7 默认值(DEFAULT)约束
- 5. 关系代数
- 5.1 关系代数的基本操作
- 5.1.1 并(Union)
- 5.1.2 差(Difference)
- 5.1.3 笛卡尔积(Cartesian Product)
- 5.1.4 投影(Projection)
- 5.1.5 选择(Selection)
- 5.2 关系代数的组合操作
- 5.2.1 交(Intersection)
- 5.2.2 连接(Join)
- 5.2.3 除(Division)
第 4 章 关系模型的基本原理
关系模型是数据库系统中使用最广泛的一种数据模型。它基于关系数据库理论,使用二维表来表示数据。在这篇文章中,我们将探讨关系模型的基本概念、特征以及数据完整性的三大规则,并通过一个大学数据库的例子来具体展示这些概念。
1. 关系模型的基本概念
1.1 基本术语
- 关系(Relation):关系模型中的表,由行和列组成,每一行称为一个元组(Tuple),每一列称为一个属性(Attribute)。
- 元组(Tuple):关系中的一行,代表一个实体或实体的一个实例。
- 属性(Attribute):关系的一列,代表实体的一个特征或属性。
- 域(Domain):属性的取值范围,即该属性可以取的值的集合。
- 键(Key):用于标识元组的属性或属性集合。包括候选键、主键和外键。
- 候选键(Candidate Key):能够唯一标识关系中每个元组的属性集合。
- 主键(Primary Key):从候选键中选定的一个,用于唯一标识每个元组。
- 外键(Foreign Key):在一个关系中用于参照另一个关系的主键的属性。
- 关系模式(Relational Schema):关系的结构描述,包括关系名、属性名和属性的类型。
1.2 关系的特征
关系模型具有以下特征:
- 二维表结构:数据以表格的形式组织,每个表格由行和列组成。
- 每列的唯一性:每一列都有唯一的列名,并且每一列的数据类型相同。
- 每行的唯一性:每一行都有一个唯一的标识,通常由主键来标识。
- 列的顺序无关紧要:列的顺序不影响数据的意义。
- 行的顺序无关紧要:行的顺序不影响数据的意义。
2. 数据完整性
数据完整性是指数据的正确性和一致性,关系模型通过一系列规则来保证数据的完整性。
2.1 三类完整性规则
关系模型中的完整性规则分为以下三类:
- 实体完整性:要求关系中必须包含主键,并且主键的每个属性都不能取空值(NULL)。
- 参照完整性:要求外键的值必须等于另一个关系中的主键值,或者为空值(NULL)。
- 域完整性:要求属性的值必须满足某种约束条件,例如,数值范围、格式、取值集合等。
2.1.1 实体完整性
实体完整性规则确保每个元组都可以被唯一地识别。这通常通过在关系中定义一个主键来实现。主键的属性值不能为空,以确保每个元组都可以被唯一地标识。
2.1.2 参照完整性
参照完整性规则确保关系之间的数据一致性。当一个关系包含另一个关系的主键作为外键时,必须满足以下条件之一:
- 外键的值必须在参照关系中作为主键存在。
- 外键的值可以为空,表示该元组与参照关系没有关联。
2.1.3 域完整性
域完整性规则确保属性值符合定义的约束条件。这些约束条件可以是:
- 取值范围:属性值必须在特定的数值范围内。
- 格式:属性值必须符合特定的格式,例如,日期格式、电话号码格式等。
- 取值集合:属性值必须来自预定义的值集合。
3. 【例1】大学数据库
让我们通过一个具体的例子来说明关系模型的基本原理。
假设我们正在设计一个大学数据库,其中包含学生、课程和选课信息。我们可以定义以下三个关系:
- 学生(Students)
- 课程(Courses)
- 选课(Enrollments)
3.1 学生(Students)关系
- 学号(StudentID):主键,唯一标识一个学生。
- 姓名(Name):学生的姓名。
- 年龄(Age):学生的年龄。
- 专业(Major):学生的专业。
3.2 课程(Courses)关系
- 课程号(CourseID):主键,唯一标识一个课程。
- 课程名(CourseName):课程的名称。
- 学分(Credits):课程的学分。
3.3 选课(Enrollments)关系
- 学号(StudentID):外键,参照学生关系。
- 课程号(CourseID):外键,参照课程关系。
- 成绩(Grade):学生在该课程的成绩。
3.4 示例数据
-
学生(Students):
StudentID Name Age Major S001 Alice 20 Computer Science S002 Bob 22 Physics -
课程(Courses):
CourseID CourseName Credits C001 Databases 3 C002 Quantum Physics 4 -
选课(Enrollments):
StudentID CourseID Grade S001 C001 A S002 C002 B
在这个例子中,我们可以看到:
- 每个关系都有一个主键(StudentID, CourseID)。
- 选课关系有两个外键(StudentID, CourseID),它们分别参照学生和课程关系。
- 每个属性都有定义的域,比如年龄和学分。
4. MySQL约束控制
在MySQL数据库中,约束用于规定存储在表中的数据必须满足的条件,以确保数据的正确性和完整性。以下是MySQL中常见的几种约束及其使用示例。
4.1 非空(NOT NULL)约束
非空约束用于确保列中的每个记录必须含有值,不可以是NULL。
示例:
CREATE TABLE Students (StudentID INT NOT NULL,Name VARCHAR(100) NOT NULL,Age INT NOT NULL
);
在这个例子中,StudentID
、Name
和Age
列都不能包含NULL值。
4.2 主键(PRIMARY KEY)约束
主键约束用于唯一标识表中的每一行记录。
示例:
CREATE TABLE Students (StudentID INT NOT NULL,Name VARCHAR(100) NOT NULL,Age INT NOT NULL,PRIMARY KEY (StudentID)
);
在这个例子中,StudentID
是主键,每个学生的ID都是唯一的。
删除主键约束:
ALTER TABLE Students DROP PRIMARY KEY;
这个命令会删除Students
表的主键约束。
4.3 唯一(UNIQUE)约束
唯一约束用于确保列中的所有值都是唯一的。
建立唯一约束的示例:
CREATE TABLE Students (StudentID INT NOT NULL,Email VARCHAR(100) NOT NULL,UNIQUE (Email)
);
在这个例子中,Email
列设置了唯一约束,同一个邮箱不能被多个学生使用。
4.4 检查(CHECK)约束
检查约束用于确保列中的值符合一个指定的条件。
示例:
CREATE TABLE Students (StudentID INT NOT NULL,Age INT CHECK (Age > 0 AND Age < 130)
);
在这个例子中,Age
列的值必须在1到129之间。
4.5 外键(FOREING KEY) 约束
外键约束用于防止破坏表之间的连接。
示例:
CREATE TABLE Enrollments (StudentID INT,CourseID INT,Grade CHAR(2),FOREIGN KEY (StudentID) REFERENCES Students(StudentID),FOREIGN KEY (CourseID) REFERENCES Courses(CourseID)
);
在这个例子中,Enrollments
表的StudentID
和CourseID
是外键,它们分别参照Students
表和Courses
表的主键。
请注意,MySQL在早期版本中不支持CHECK
约束,虽然在8.0.16及以后的版本中已经支持。如果你使用的是早期版本,可能需要通过触发器或其他方法来实现类似的功能。
4.6 自增(AUTO_INCREMENT)约束
自增约束用于自动生成数字,通常用于主键字段,确保每一行都有一个唯一的标识符。
示例:
CREATE TABLE Employees (EmployeeID INT NOT NULL AUTO_INCREMENT,Name VARCHAR(100) NOT NULL,Salary DECIMAL(10, 2) NOT NULL,PRIMARY KEY (EmployeeID)
);
在这个例子中,EmployeeID
是自增字段,每次插入新员工记录时,EmployeeID
会自动递增。
4.7 默认值(DEFAULT)约束
默认值约束用于为列指定一个默认值,如果在插入记录时未指定该列的值,则使用默认值。
示例:
CREATE TABLE Employees (EmployeeID INT NOT NULL AUTO_INCREMENT,Name VARCHAR(100) NOT NULL,Status ENUM('Active', 'Inactive') NOT NULL DEFAULT 'Active',Salary DECIMAL(10, 2) NOT NULL,PRIMARY KEY (EmployeeID)
);
在这个例子中,Status
列有一个默认值 Active
,如果在插入记录时未指定 Status
,则默认为 Active
。
修改表中的默认值:
ALTER TABLE Employees ALTER COLUMN Status SET DEFAULT 'Inactive';
删除默认值约束:
ALTER TABLE Employees ALTER COLUMN Status DROP DEFAULT;
以上两个约束都是MySQL中用于确保数据完整性和一致性的重要工具。自增约束通常用于主键,以确保每个记录都有一个唯一的标识符,而默认值约束则用于在未提供特定值时提供一个标准的默认值。
5. 关系代数
5.1 关系代数的基本操作
5.1.1 并(Union)
操作说明:合并两个表中的所有行,返回包含所有不同行的新表。
示例:
ID | Name |
---|---|
1 | Alice |
2 | Bob |
3 | Carol |
操作:
SELECT * FROM Students1
UNION
SELECT * FROM Students2;
结果:
ID | Name |
---|---|
1 | Alice |
2 | Bob |
3 | Carol |
5.1.2 差(Difference)
操作说明:从一个表中减去另一个表中的行,返回只存在于第一个表中的行。
示例:
ID | Name |
---|---|
1 | Alice |
2 | Bob |
操作:
SELECT * FROM Students1
EXCEPT
SELECT * FROM Students2;
结果:
ID | Name |
---|---|
1 | Alice |
5.1.3 笛卡尔积(Cartesian Product)
操作说明:将两个表中的每一行与另一个表中的每一行配对,返回所有可能的组合。
示例:
Students:
ID | Name |
---|---|
1 | Alice |
2 | Bob |
Courses:
ID | CourseName |
---|---|
1 | Math |
2 | Science |
操作:
SELECT Students.ID, Students.Name, Courses.ID AS CourseID, Courses.CourseName
FROM Students, Courses;
结果:
ID | Name | CourseID | CourseName |
---|---|---|---|
1 | Alice | 1 | Math |
1 | Alice | 2 | Science |
2 | Bob | 1 | Math |
2 | Bob | 2 | Science |
5.1.4 投影(Projection)
操作说明:从表中选择特定的列,返回只包含这些列的新表。
示例:
操作:
SELECT Name FROM Students;
结果:
Name |
---|
Alice |
Bob |
5.1.5 选择(Selection)
操作说明:从表中选择满足特定条件的行,返回这些行的新表。
示例:
操作:
SELECT * FROM Students
WHERE Age > 20;
结果:
ID | Name | Age |
---|---|---|
2 | Bob | 22 |
5.2 关系代数的组合操作
5.2.1 交(Intersection)
操作说明:返回两个表中共有的行。
示例:
Students1:
ID | Name |
---|---|
1 | Alice |
2 | Bob |
Students2:
ID | Name |
---|---|
2 | Bob |
3 | Carol |
操作:
SELECT * FROM Students1
INTERSECT
SELECT * FROM Students2;
结果:
ID | Name |
---|---|
2 | Bob |
5.2.2 连接(Join)
操作说明:连接操作用于将两个表中的行组合起来,通常基于相关的列。
示例:
Students:
ID | Name |
---|---|
1 | Alice |
2 | Bob |
Courses:
CourseID | CourseName |
---|---|
1 | Math |
2 | Science |
操作:
SELECT Students.ID, Students.Name, Courses.CourseID, Courses.CourseName
FROM Students
JOIN Courses ON Students.ID = Courses.CourseID;
结果:
ID | Name | CourseID | CourseName |
---|---|---|---|
1 | Alice | 1 | Math |
2 | Bob | 2 | Science |
5.2.3 除(Division)
操作说明:除法操作用于查询与右侧关系中的所有元组都有联系的左侧关系中的元组。
示例:
Students:
ID | Name |
---|---|
1 | Alice |
2 | Bob |
Courses:
CourseID | CourseName |
---|---|
1 | Math |
1 | Science |
操作:
SELECT S.Name
FROM Students S
DIVIDE Courses C
ON S.ID = C.CourseID;
结果:
Name |
---|
Alice |
在这个例子中,我们想要找出选修了所有课程的学生的名字。由于 Alice 选修了课程 ID 为 1 的课程,而 Bob 没有选修任何课程,所以只有 Alice 满足条件。