数据库三范式

数据库的范式是一套减少数据冗余和改善数据完整性的规则。

第一范式(1NF)

要求每列的原子性,即属性值不能再分解

示例:

一个包含学生信息的表,其中包含以下字段:

  • 学生ID(StudentID)
  • 学生姓名(StudentName)
  • 选修课程(Courses)

如果 Courses 字段是这样的:
学生A:数学, 英语
学生B:物理, 化学, 生物
这个设计就不符合第一范式,因为 Courses 字段包含了多个值。

调整后的设计:

  • 学生ID(StudentID)
  • 学生姓名(StudentName)
  • 课程名称(Courses)

每个学生和课程的组合占据一行,例如:

  • 学生ID:1,学生姓名:学生A,课程名称:数学
  • 学生ID:1,学生姓名:学生A,课程名称:英语
  • 学生ID:2,学生姓名:学生B,课程名称:物理
  • 学生ID:2,学生姓名:学生B,课程名称:化学
  • 学生ID:2,学生姓名:学生B,课程名称:生物

这样的设计符合第一范式,因为每个字段都只包含一个数据值,便于数据库管理和查询处理。

第二范式(2FN)

要求必须满足1NF,非主键列要完全依赖于主键。不能存在部份依赖。
也就是说每个表只代表一个对象,通常发生在主键是由多个字段组成的复合主键的情况下

示例:

一个学生课程表,包含以下字段:

  • 学生ID(StudentID)
  • 课程ID(CourseID)
  • 学生姓名(StudentName)
  • 课程名称(CourseName)

其中,(StudentID, CourseID) 是复合主键。在这个表中:
StudentName 只依赖于 StudentID(部分依赖于复合主键中的一个部分)
CourseName 只依赖于 CourseID(部分依赖于复合主键中的一个部分)

这个表不符合2NF,因为存在部分依赖。

第三范式(3FN)

要求必须满足2NF,并且所有非主键属性之间不能存在传递依赖关系。
(非主键属性不能依赖于其他非主键属性)

示例:

假设已经将上述学生课程表分解成两个2NF表:

  • 学生表(StudentID, StudentName)
  • 课程表(CourseID, CourseName, teacherName )

假设课程名称决定了授课教师,那么就存在传递依赖:
teacherName 依赖于 CourseName,而 CourseName 依赖于 CourseID

为了符合3NF,需要进一步分解:

  • 课程表(CourseID, CourseName)
  • 授课教师表(CourseName, InstructorName)

这样确保了所有非主属性只依赖于主键,且不存在任何非主属性依赖于其它非主属性的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值