数据库三大范式

第一范式(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

通过这种方式,我们消除了表中的传递依赖,满足了第三范式。

posted @ 2024-05-10 00:16  Yfeil  阅读(19)  评论(0编辑  收藏  举报