简单说明1NF,2NF,3NF

本文详细解释了关系型数据库设计中的四种范式——1NF、2NF、3NF和4NF,强调了消除数据冗余和保持数据一致性的关键。通过实例说明了如何判断和改正违反各范式的情况,如拆分表以满足2NF和3NF的要求。
摘要由CSDN通过智能技术生成

数据库范式是关系型数据库设计中的一种理论,用于消除数据冗余和更新异常,提高数据的一致性和完整性。根据定义,主要有以下四种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及第四范式(4NF)。

第一范式(1NF):在符合第一范式的关系模式中,每个属性都是不可再分的最小单元,也被称为原子性。简单来说,就是数据表中的每一列(每个字段)都必须具备原子性,不能进一步分解。

第二范式(2NF):在满足第一范式的基础上,消除了非主属性对码的部分函数依赖。也就是说,表中的所有列都必须依赖于主键,而不能有任何一列与主键没有关系。这样的设计能确保一个表只描述一件事情。

第三范式(3NF):必须先满足第二范式,要求表中的每一列只与主键直接相关而不是间接相关。换句话说,表中的每一列只能依赖于主键。

假设有一个学生表(Student),包含以下字段:

学号(StudentID):主键,唯一标识每个学生。
姓名(Name):学生的姓名。
年龄(Age):学生的年龄。
班级(Class):学生所在的班级。
班主任(Teacher):负责该班级的班主任。
根据上述定义,可以对表进行范式分析:

第一范式(1NF):表中的每一列都是不可再分的最小单元,满足原子性要求。因此,Student表已经符合第一范式。

第二范式(2NF):消除非主属性对码的部分函数依赖。在这个例子中,StudentID是主键,其他列都依赖于主键。但是,存在一个问题:Class和Teacher列都依赖于同一个非主属性(Class和Teacher都属于同一个实体“班级”),这违反了第二范式的要求。为了解决这个问题,可以将表拆分为两个表:一个学生表(Student)和一个班级表(Class)。学生表中只包含与学生相关的信息,班级表中包含与班级相关的信息。这样,每个表只描述一件事情,满足第二范式的要求。

第三范式(3NF):必须先满足第二范式,要求表中的每一列只与主键直接相关而不是间接相关。在拆分后的表结构中,学生表中的每个列都只依赖于主键StudentID,而班级表中的每个列也只依赖于主键ClassID。因此,拆分后的表结构满足第三范式的要求。

一个违反第一范式(1NF)的例子:

学生ID(StudentID):主键,唯一标识每个学生。
学生的姓名和年龄(Name, Age):学生的姓名和年龄。
在这个例子中,“学生的姓名和年龄”是一个可以进一步分解的数据项,它包含了两个原子数据项:“学生的姓名”和“学生的年龄”。然而,在表中,这两个数据项却被合并成了一个列,这就违反了第一范式的规定,因为根据定义,每一列都应该是原子的、不可再分的。为了符合第一范式,应该将这个表拆分为两个表,一个用于存储学生的姓名,另一个用于存储学生的年龄。

一个违反第二范式(2NF)的例子:

学生ID(StudentID):主键,唯一标识每个学生。
学生的姓名(Name):学生的姓名。
学生的成绩(Score):学生的成绩。
在这个例子中,“学生的成绩”依赖于主键“学生ID”,但是“学生的成绩”本身又包含了多个属性,例如数学成绩、语文成绩、英语成绩等。这就违反了第二范式的规定,因为根据定义,非主属性必须完全依赖于主键,而不能存在只依赖于部分主键的情况。为了符合第二范式,应该将这个表拆分为两个表,一个用于存储学生的基本信息(包括学生ID和姓名),另一个用于存储学生的成绩信息(包括学生ID和各个科目的成绩)。

一个违反第三范式(3NF)的例子:

学生ID(StudentID):主键,唯一标识每个学生。
学生的姓名(Name):学生的姓名。
学生的成绩(Score):学生的成绩。
学生的班级(Class):学生所在的班级。
班级的班主任(Teacher):负责该班级的班主任。
在这个例子中,“学生的班级”和“班级的班主任”都依赖于主键“学生ID”,但是它们本身又包含了其他属性。这就违反了第三范式的规定,因为根据定义,非主属性必须直接依赖于主键,而不能存在传递依赖的情况。为了符合第三范式,应该将这个表拆分为三个表,一个用于存储学生的基本信息(包括学生ID和姓名),一个用于存储学生的成绩信息(包括学生ID和各个科目的成绩),另一个用于存储班级信息(包括班级ID、班级名称和班主任)。这样,每个表只描述一件事情,并且每个非主属性都直接依赖于主键。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值