数据库三大范式
第一范式是满足了原子性
第二范式是消除了部分依赖
第三范式是消除了传递依赖
第一范式
第一范式是满足了原子性
比如下面的表:
学生ID | 姓名 | 课程 |
---|---|---|
1 | 张三 | 数学, 英语 |
2 | 李四 | 物理, 化学 |
课程里面只能有一个数据,不能两个混杂,所以改成下面的表:
学生ID | 姓名 | 课程 |
---|---|---|
1 | 张三 | 数学 |
1 | 张三 | 英语 |
2 | 李四 | 物理 |
2 | 李四 | 化学 |
这样就满足了原子性,实现了第一范式
第二范式
第二范式是消除了部分依赖
什么是部分依赖呢?部分依赖就是C依赖AB,那么缺了A不行,缺了B也不行。
给出下面的销售情况表
OrderID | CustomerID | CustomerName | ProductID | ProductName | Quantity | Price |
---|---|---|---|---|---|---|
1 | 101 | Alice | 001 | Product A | 2 | 10.00 |
2 | 102 | Bob | 002 | Product B | 5 | 20.00 |
… | … | … | … | … | … | … |
CustomerID
和CustomerName
依赖于OrderID
,但它们实际上是属于客户信息。ProductID
和ProductName
依赖于OrderID
,但它们实际上是属于产品信息。
我们可以这样拆分:
订单表
OrderID | CustomerID | ProductID | Quantity | Price |
---|---|---|---|---|
1 | 101 | 001 | 2 | 10.00 |
2 | 102 | 002 | 5 | 20.00 |
… | … | … | … | … |
这里,OrderID
是主键,CustomerID
和 ProductID
是外键,完全依赖于 OrderID
。
客户表
CustomerID | CustomerName |
---|---|
101 | Alice |
102 | Bob |
… | … |
这里,CustomerID
是主键,CustomerName
完全依赖于 CustomerID
。
产品表
ProductID | ProductName |
---|---|
001 | Product A |
002 | Product B |
… | … |
这里,ProductID
是主键,ProductName
完全依赖于 ProductID
。
这样就消除了部分依赖
第三范式
第三范式是消除了传递依赖
什么是传递依赖呢?A依赖于B,B最终还得依赖于C,其中C是表的主键,那么这就是一个传递依赖
给出原始课程表:
StudentID | StudentName | CourseID | CourseName | TeacherID | TeacherName |
---|---|---|---|---|---|
1 | Alice | 101 | Math | 1 | Mr. Smith |
1 | Alice | 102 | Science | 2 | Ms. Johnson |
2 | Bob | 101 | Math | 1 | Mr. Smith |
… | … | … | … | … | … |
StudentName
依赖于StudentID
,这是一个部分依赖,因为它只依赖于主键的一部分。CourseName
和TeacherName
依赖于CourseID
和TeacherID
,这也是部分依赖。TeacherName
依赖于CourseID
,这是一个传递依赖,因为它通过CourseID
间接依赖于StudentID
。
对于这个表,我们这样拆分:
学生表
StudentID | StudentName |
---|---|
1 | Alice |
2 | Bob |
… | … |
课程表
CourseID | CourseName |
---|---|
101 | Math |
102 | Science |
… | … |
教师表
TeacherID | TeacherName |
---|---|
1 | Mr. Smith |
2 | Ms. Johnson |
… | … |
选课表
StudentID | CourseID | TeacherID |
---|---|---|
1 | 101 | 1 |
1 | 102 | 2 |
2 | 101 | 1 |
… | … | … |
从而实现:
- 学生表只包含学生编号和姓名,消除了对课程编号的依赖。
- 课程表只包含课程编号和课程名称,消除了对教师编号的依赖。
- 教师表只包含教师编号和教师姓名。
- 选课表将学生、课程和教师的关系连接起来,消除了传递依赖。