在数据库管理世界中,键在组织、访问和维护数据完整性方面发挥着至关重要的作用。无论您是经验丰富的数据库管理员还是刚刚开始数据管理之旅,理解各种数据库键的类型都是必不可少的。在这篇文章中,我们将探讨所有不同类型的键,它们的目的以及它们如何有效地贡献于数据库设计。
为了说明这些概念,我们将使用一个简单的大学数据库,包含以下表格:
- 学生
- 课程
- 选课
- 教授
- 系别
让我们深入探讨每种类型的键,以及它们在我们的大学数据库中是如何应用的。
1. 主键
定义
一个列或一组列,唯一标识表中每一行
特点
- 对每条记录必须唯一
- 不能包含
NULL
值 - 应该是不可变的(随时间不改变)
示例
在我们的 Students
表中,我们使用 StudentID
作为主键。
CREATE TABLE Students (
StudentID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
Email VARCHAR(100) UNIQUE
);
在这里,StudentID
唯一标识每个学生,确保没有两个学生拥有相同的ID。
2. 外键
定义
一个表中的列或一组列,它指的是另一个表中的主键
用途
维护引用完整性,并在表之间创建关系
示例
在我们的Enrollments
表中,我们使用StudentID
和CourseID
作为外键。
CREATE TABLE Enrollments (
EnrollmentID INT PRIMARY KEY,
StudentID INT,
CourseID INT,
EnrollmentDate DATE,
FOREIGN KEY (StudentID) REFERENCES Students(StudentID),
FOREIGN KEY (CourseID) REFERENCES Courses(CourseID)
)
这种设计确保每个注册记录都与有效的学生和课程相关联。
3. 复合键
定义
由两个或多个列组成的键,用于唯一标识一条记录
用法
当无法保证单个列的唯一性时
示例
我们可以重新设计我们的Enrollments
表,使用复合键:
CREATE TABLE Enrollments (
StudentID INT,
CourseID INT,
EnrollmentDate DATE,
Grade CHAR(2),
PRIMARY KEY (StudentID, CourseID),
FOREIGN KEY (StudentID) REFERENCES Students(StudentID),
FOREIGN KEY (CourseID) REFERENCES Courses(CourseID)
);
在这里,StudentID
和CourseID
的组合形成了复合键,唯一地标识了每个注册记录。
4. 候选键
定义
可以唯一标识一条记录的最小属性集合
特征
- 必须唯一
- 不能包含
NULL
值 - 一个表可以有多个候选键。
示例
在我们的学生
表中,学生ID
和电子邮件
都可以作为候选键,因为两者都可以唯一地标识一个学生。我们选择了学生ID
作为主键,但电子邮件
本可以作为备选键。
5. 超级键
定义
能够唯一标识记录的任何列集合,包括不必要的列
与候选键的区别
可能包含用于唯一标识不必要的额外属性
示例
在我们的学生
表中,超级键可以包括:
{学生ID, 名字, 姓氏, 电子邮件}
{学生ID, 电子邮件}
{电子邮件, 名字, 姓氏}
这些都包括候选键(学生ID
或电子邮件
)加上额外的字段。
6. 备选键
定义
未被选为 primary key 的候选键
用途
提供了一种独特标识记录的替代方法
示例
在我们的学生
表中,如果我们选择学生ID
作为主键,那么电子邮件
就成为了一个备选键:
CREATE TABLE Students (
StudentID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
Email VARCHAR(100) UNIQUE -- This is an alternate key
);
电子邮件
上的UNIQUE
约束确保它也可以用来唯一地标识学生。
7. 代理键
定义
仅为唯一标识而创建的人工键
特点
- 通常由数据库自动生成
- 没有业务含义
示例
在我们的Courses
表中,我们可能会使用一个自动增加的CourseID
:
CREATE TABLE Courses (
CourseID INT PRIMARY KEY AUTO_INCREMENT,
CourseCode VARCHAR(10) UNIQUE,
CourseName VARCHAR(100),
Credits INT
);
CourseID
是一个代理键,而CourseCode
可能是一个更自然的标识符。
8. 自然键
定义
由现实世界中已存在的数据形成的键
优点
提供有意义的识别
缺点
可能会随时间变化
示例
在Professors
表中,我们可能会考虑使用社会安全号码(出于隐私原因不推荐):
CREATE TABLE Professors (
ProfessorID INT PRIMARY KEY,
SSN CHAR(9) UNIQUE, -- This could be used as a natural key
FirstName VARCHAR(50),
LastName VARCHAR(50),
Department VARCHAR(50)
);
9. 复合键
定义
由两个或更多列组成,其中组合可能具有某种业务意义
与组合键的区别
当组合列的意义超出仅仅唯一标识时,经常使用。
示例
在CourseOfferings
表中:
CREATE TABLE CourseOfferings (
CourseID INT,
Semester CHAR(6), -- e.g., '202301' for Spring 2023
ProfessorID INT,
RoomNumber VARCHAR(10),
PRIMARY KEY (CourseID, Semester),
FOREIGN KEY (CourseID) REFERENCES Courses(CourseID),
FOREIGN KEY (ProfessorID) REFERENCES Professors(ProfessorID)
);
课程ID和学期的组合形成了一个复合键,它既唯一标识了一个课程提供,也具有业务意义。
10. 简单键
定义
由单个列组成的关键。
优点
易于实施和使用
示例
在我们的Departments
表中:
CREATE TABLE Departments (
DepartmentID INT PRIMARY KEY,
DepartmentName VARCHAR(100) UNIQUE,
Building VARCHAR(50),
Budget DECIMAL(10, 2)
);
DepartmentID
是一个简单键:单个列唯一标识每个部门。
11. 唯一键
定义
确保列或列集中的所有值都是唯一的关键。
与主键的区别
可以允许NULL
值(除非另有规定)
示例
在我们的Students
表中,Email
是唯一键的一个例子:
CREATE TABLE Students (
StudentID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
Email VARCHAR(100) UNIQUE -- This is a unique key
);
唯一约束UNIQUE
确保没有两位学生可以拥有相同的电子邮件地址。
结论
理解这些不同类型的键对于有效的数据库设计和管理至关重要。每种类型的键都有特定的目的,既可以确保数据完整性,也可以建立表之间的关系。通过仔细选择和实现适当的键,您可以创建高效、可靠且可扩展的数据库系统。
请记住,选择键会显著影响您的数据库的性能、可维护性以及准确表示现实世界关系的能力。决定使用哪些键时,始终要考虑您应用程序的具体需求以及数据的性质。
这篇文章是我们数据库基础系列的一部分。请继续关注更多关于数据库管理和设计的深入文章。
Source:
https://dzone.com/articles/database-keys-a-comprehensive-guide