数据库的三范式是设计关系型数据库时的三个基本原则,主要目标是消除数据冗余和保证数据一致性。以下是这三个范式及其例子:
1. 第一范式(1NF)
规定:数据库表的每一列都是不可分割的最小单位,且每一行都是唯一的。
例如,有一个关于学生信息的数据库表:
| StudentID | Name | Courses | 
|---|---|---|
| 1 | John Doe | Math, Science | 
| 2 | Mary Johnson | Art, Science | 
这个表违反了第一范式,因为 Courses 列包含多个课程。根据第一范式,我们应该将它分解成如下形式:
| StudentID | Name | Course | 
|---|---|---|
| 1 | John Doe | Math | 
| 1 | John Doe | Science | 
| 2 | Mary Johnson | Art | 
| 2 | Mary Johnson | Science | 
2. 第二范式(2NF)
规定:在第一范式的基础上,非主键列必须完全依赖于主键,不能只依赖于主键的一部分。
例如,有一个订单明细的数据库表:
| OrderID | ProductID | Quantity | ProductName | ProductPrice | 
|---|---|---|---|---|
| 1 | 101 | 3 | T-shirt | 20 | 
| 1 | 102 | 2 | Jeans | 50 | 
| 2 | 101 | 1 | T-shirt | 20 | 
这个表的主键是 (OrderID, ProductID)。但是 ProductName 和 ProductPrice 只依赖于 ProductID 部分,这就违反了第二范式。我们可以将产品信息分解到另一张表中来满足第二范式:
Orders Table:
| OrderID | ProductID | Quantity | 
|---|---|---|
| 1 | 101 | 3 | 
| 1 | 102 | 2 | 
| 2 | 101 | 1 | 
Products Table:
| ProductID | ProductName | ProductPrice | 
|---|---|---|
| 101 | T-shirt | 20 | 
| 102 | Jeans | 50 | 
3. 第三范式(3NF)
规定:在第二范式的基础上,非主键列必须直接依赖于主键,不能依赖于其他非主键列。
例如,有一个关于学生和课程的数据库表:
| StudentID | CourseID | Grade | Professor | 
|---|---|---|---|
| 1 | Math101 | A | Dr. Smith | 
| 1 | Sci102 | B | Dr. Doe | 
| 2 | Math101 | B | Dr. Smith | 
这个表违反了第三范式,因为 Professor 列依赖于 CourseID 列,而不是主键 StudentID。我们可以将课程和教授的信息分解到另一张表中来满足第三范式:
Students Table:
| StudentID | CourseID | Grade | 
|---|---|---|
| 1 | Math101 | A | 
| 1 | Sci102 | B | 
| 2 | Math101 | B | 
Courses Table:
| CourseID | Professor | 
|---|---|
| Math101 | Dr. Smith | 
| Sci102 | Dr. Doe |