在数据库设计中,三大范式是确保数据完整性和减少冗余的重要原则。它们分别是第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。下面,我们将详细解析这三个范式,帮助理解其在数据库设计中的作用。
第一范式(1NF):实体独立
定义:第一范式要求数据库中的每个表都必须满足原子性,即表中的每个字段都是不可分割的最小数据单位。
关键点:
- 原子性:每个字段包含一个不可分割的数据值,不能包含多个值或另一个表的数据。
- 无重复组:表中不能有重复的记录,每条记录都是唯一的。
例子:
假设我们有一个关于学生的数据库表,包含以下字段:
- 学生ID
- 学生姓名
- 课程名称
- 成绩
按照第一范式,这个表应该只有一个包含学生ID、姓名、课程名称和成绩的记录,因为学生姓名、课程名称和成绩都是不可分割的最小数据单位。
代码示例:
CREATE TABLE Students (
StudentID INT PRIMARY KEY,
Name VARCHAR(50),
CourseName VARCHAR(50),
Score INT
);
第二范式(2NF):关系简单
定义:第二范式在满足第一范式的基础上,要求非主属性完全依赖于主键。
关键点:
- 第一范式:表满足1NF。
- 完全依赖:非主属性(非键字段)完全依赖于主键,即每个非键字段只能通过主键来唯一确定。
例子:
如果我们有一个学生和课程的关系表,包含以下字段:
- 学生ID
- 学生姓名
- 课程ID
- 课程名称
这个表满足第一范式,但不符合第二范式,因为课程名称只依赖于课程ID,而不是整个主键。
代码示例:
CREATE TABLE StudentCourses (
StudentID INT,
CourseID INT,
CourseName VARCHAR(50),
FOREIGN KEY (StudentID, CourseID) REFERENCES Students(StudentID, CourseID)
);
为了满足第二范式,我们可以将课程名称从关系表中移除,并在课程表中单独存储。
第三范式(3NF):冗余要避免
定义:第三范式在满足第二范式的基础上,要求非主属性不传递依赖于主键。
关键点:
- 第二范式:表满足2NF。
- 传递依赖:非主属性不依赖于其他非主属性。
例子:
如果我们有一个学生和地址的关系表,包含以下字段:
- 学生ID
- 学生姓名
- 地址ID
- 地址
- 城市ID
- 城市
这个表满足第二范式,但不符合第三范式,因为城市依赖于地址ID,而不是学生ID。
代码示例:
CREATE TABLE StudentAddresses (
StudentID INT,
AddressID INT,
Address VARCHAR(100),
CityID INT,
City VARCHAR(50),
FOREIGN KEY (StudentID, AddressID) REFERENCES Students(StudentID, AddressID)
);
为了满足第三范式,我们可以将地址和城市的信息分离到单独的表中。
通过遵循这些范式,我们可以确保数据库设计更加高效、简洁,并且易于维护。
