数据库键:综合指南

在数据库管理世界中,键在组织、访问和维护数据完整性方面发挥着至关重要的作用。无论您是经验丰富的数据库管理员还是刚刚开始数据管理之旅,理解各种数据库键的类型都是必不可少的。在这篇文章中,我们将探讨所有不同类型的键,它们的目的以及它们如何有效地贡献于数据库设计

为了说明这些概念,我们将使用一个简单的大学数据库,包含以下表格:

  1. 学生
  2. 课程
  3. 选课
  4. 教授
  5. 系别

让我们深入探讨每种类型的键,以及它们在我们的大学数据库中是如何应用的。

1. 主键

定义

一个列或一组列,唯一标识表中每一行

特点

  • 对每条记录必须唯一
  • 不能包含 NULL
  • 应该是不可变的(随时间不改变)

示例

在我们的 Students 表中,我们使用 StudentID 作为主键。

SQL

 


CREATE TABLE Students (

    StudentID INT PRIMARY KEY,

    FirstName VARCHAR(50),

    LastName VARCHAR(50),

    Email VARCHAR(100) UNIQUE

);

在这里,StudentID 唯一标识每个学生,确保没有两个学生拥有相同的ID。

2. 外键

定义

一个表中的列或一组列,它指的是另一个表中的主键

用途

维护引用完整性,并在表之间创建关系

示例

在我们的Enrollments表中,我们使用StudentIDCourseID作为外键。

SQL

 


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表,使用复合键:

SQL

 

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)

);

在这里,StudentIDCourseID的组合形成了复合键,唯一地标识了每个注册记录。

4. 候选键

定义

可以唯一标识一条记录的最小属性集合

特征

  • 必须唯一
  • 不能包含NULL
  • 一个表可以有多个候选键。

示例

在我们的学生表中,学生ID电子邮件都可以作为候选键,因为两者都可以唯一地标识一个学生。我们选择了学生ID作为主键,但电子邮件本可以作为备选键。

5. 超级键

定义

能够唯一标识记录的任何列集合,包括不必要的列

与候选键的区别

可能包含用于唯一标识不必要的额外属性

示例

在我们的学生表中,超级键可以包括:

  • {学生ID, 名字, 姓氏, 电子邮件}
  • {学生ID, 电子邮件}
  • {电子邮件, 名字, 姓氏}

这些都包括候选键(学生ID电子邮件)加上额外的字段。

6. 备选键

定义

未被选为 primary key 的候选键

用途

提供了一种独特标识记录的替代方法

示例

在我们的学生表中,如果我们选择学生ID作为主键,那么电子邮件就成为了一个备选键:

SQL

 

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

SQL

 

CREATE TABLE Courses (

    CourseID INT PRIMARY KEY AUTO_INCREMENT,

    CourseCode VARCHAR(10) UNIQUE,

    CourseName VARCHAR(100),

    Credits INT

);

CourseID是一个代理键,而CourseCode可能是一个更自然的标识符。

8. 自然键

定义

由现实世界中已存在的数据形成的键

优点

提供有意义的识别

缺点

可能会随时间变化

示例

Professors表中,我们可能会考虑使用社会安全号码(出于隐私原因不推荐):

SQL

 

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表中:

SQL

 

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表中:

SQL

 

CREATE TABLE Departments (

    DepartmentID INT PRIMARY KEY,

    DepartmentName VARCHAR(100) UNIQUE,

    Building VARCHAR(50),

    Budget DECIMAL(10, 2)

);

DepartmentID是一个简单键:单个列唯一标识每个部门。

11. 唯一键

定义

确保列或列集中的所有值都是唯一的关键。

与主键的区别

可以允许NULL值(除非另有规定)

示例

在我们的Students表中,Email是唯一键的一个例子:

SQL

 

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