在數據庫管理的世界中,键扮演著組織、存取和維護數據完整性的重要角色。無論您是经验豐富的數據庫管理員還是刚開始數據管理之旅,了解各種數據庫鍵的類型是必要的。在本文中,我們將探索各種類型的鍵、它們的用途以及它們如何促進有效的數據庫設計。
為解釋這些概念,我們將使用一個簡單的大學數據庫,該數據庫有以下表格:
- 學生
- 課程
- 註冊
- 教授
- 院系
讓我們深入了解各種類型的鍵,並看看它們如何在我們的大學數據庫中應用。
1. 主鍵
定義
一個列或列的集合,用於唯一標識表中的每一行
特性
- 對每一条記錄必須唯一
- 不允許含有
NULL
值 - 應該是不可變的(不會随時間變化)
例子
在我們的Students
表中,我們使用StudentID
作為主鍵。
CREATE TABLE Students (
StudentID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
Email VARCHAR(100) UNIQUE
);
在此处,StudentID
唯一標識每位學生,確保沒有两名學生具有相同的ID。
定義
一個表中的列或列集,指向另一個表中的主鍵
用途
維護引用完整性並創建表之間的關係
例子
在我們的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. 備選鍵
定義
未選擇為主鍵的候選鍵
目的
提供一種唯一標識記錄的替代方法
例子
在我們的學生
表中,如果我們選擇學生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)
);
課程代碼(CourseID
)和學期(Semester
)的組合形成一個複合键,它不僅唯一标识一個課程提供,並且具有商業意義。
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
約束確保沒有兩個學生可以具有相同的電子郵件地址。
結論
了解這些不同類型的键是 effectively 資料庫設計 和管理的关键。每種類型的鍵都有其特定的用途,從確保數據完整性到建立表之間的關係。通過謹慎選擇和實施適當的鍵,您可以創建高效、可靠和 可擴展的數據庫系統。
請記住,鍵的選擇可能會顯著影響您的數據庫性能、可維護性和準確表達現實世界中關係的能力。在決定使用哪些鍵時,總是要考慮您的應用程序的具體需求和您的數據的本質。
這篇文章是我們 數據庫基礎 系列的一部分。繼續關注我們推出更多深入的數據庫管理和設計篇文章。
Source:
https://dzone.com/articles/database-keys-a-comprehensive-guide