数据库的三范式是设计关系型数据库时的三个基本原则,主要目标是消除数据冗余和保证数据一致性。以下是这三个范式及其例子:
规定:数据库表的每一列都是不可分割的最小单位,且每一行都是唯一的。
例如,有一个关于学生信息的数据库表:
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 |
规定:在第一范式的基础上,非主键列必须完全依赖于主键,不能只依赖于主键的一部分。
例如,有一个订单明细的数据库表:
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 |
规定:在第二范式的基础上,非主键列必须直接依赖于主键,不能依赖于其他非主键列。
例如,有一个关于学生和课程的数据库表:
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 |