数据库三大范式
第一范式(1NF):列不可拆分
假设我们有一个学生信息表,用来记录学生的姓名和地址:
学生ID | 姓名 | 地址 |
---|---|---|
1 | 张三 | xx省xx市xx区 |
这个表违反了第一范式,因为地址不符合不可拆分要求。为了满足第一范式,需要把地址拆分成省、市、区。
第二范式(2NF):不能只依赖主键的一部分
现在,如果我们想要记录学生的课程成绩,表结构可能会变成这样:
学生ID | 姓名 | 课程 | 成绩 |
---|---|---|---|
1 | 张三 | 数学 | 90 |
1 | 张三 | 英语 | 85 |
2 | 李四 | 数学 | 95 |
2 | 李四 | 英语 | 80 |
在这个例子中,学生ID和课程一起构成了联合主键(因为一个学生可以有多个课程成绩)。但是,姓名只依赖于学生ID,并不依赖于课程。这就违反了第二范式,因为存在非主键字段(姓名)只依赖于主键的一部分(学生ID)。为了满足第二范式,我们需要将这个表拆分为两个表:
学生表:
学生ID | 姓名 |
---|---|
1 | 张三 |
2 | 李四 |
成绩表:
学生ID | 课程 | 成绩 |
---|---|---|
1 | 数学 | 90 |
1 | 英语 | 85 |
2 | 数学 | 95 |
2 | 英语 | 80 |
这样,每个表都满足了第二范式。
第三范式(3NF):禁止间接依赖
假设我们有一个订单表,用来记录订单信息和客户信息:
订单ID | 客户ID | 客户姓名 | 客户电话 | 商品 | 价格 |
---|---|---|---|---|---|
1001 | 001 | 张三 | 13800138000 | 商品A | 100 |
1002 | 002 | 李四 | 13900139000 | 商品B | 200 |
在这个例子中,订单ID是主键,但是客户电话依赖于客户ID,而不是直接依赖于订单ID。这违反了第三范式,因为存在对非主键字段的传递依赖。为了满足第三范式,我们需要进一步拆分这个表:
订单表:
订单ID | 客户ID | 商品 | 价格 |
---|---|---|---|
1001 | 001 | 商品A | 100 |
1002 | 002 | 商品B | 200 |
客户表:
客户ID | 客户姓名 | 客户电话 |
---|---|---|
001 | 张三 | 13800138000 |
002 | 李四 | 13900139000 |
通过这种方式,我们消除了表中的传递依赖,满足了第三范式。