第一范式(1NF)要求表中的每一列都是不可再分的原子值,避免重复组或数组;第二范式(2NF)在满足1NF基础上,消除非主键列对主键的部分函数依赖,确保完全依赖于主键;第三范式(3NF)在满足2NF基础上,消除非主键列对主键的传递函数依赖,即非主键列必须直接依赖于主键。 这三个范式是关系数据库设计的基础,用于减少数据冗余和更新异常。例如,一个订单表若包含“商品名称”和“商品价格”,若商品名称重复出现在不同订单中,则违反2NF,需拆分出商品表;再如“学生表”中若包含“系主任”,而系主任依赖于系编号(依赖于学号),则违反3NF,需单独建系表。

【常见问题】
问题1:第一范式要求表中每个字段都是不可分割的原子项,那么“地址”字段若包含省市区是否违反第一范式?
回答1:是的,如果“地址”字段存储了省、市、区等多个信息且在实际查询中需要单独提取省或市,则违反了第一范式的原子性要求,应拆分为“省份”、“城市”、“区县”等独立字段。
问题2:第二范式如何解决部分函数依赖带来的数据冗余?
回答2:第二范式通过消除部分函数依赖来减少冗余。例如,一个“订单详情”表包含订单ID、商品ID、商品名称、商品价格,其中商品名称依赖于商品ID而非完整主键(订单ID+商品ID),这会导致商品名称重复存储。将其拆分为“订单明细表”(订单ID、商品ID、数量)和“商品表”(商品ID、名称、价格)即可满足第二范式。
问题3:第三范式与第二范式的主要区别是什么?能否举例说明传递依赖?
回答3:第三范式比第二范式更进一步,要求消除传递函数依赖。例如,一个“员工表”包含员工ID、部门ID、部门经理,其中部门经理依赖于部门ID(而部门ID依赖于员工ID),这就形成了传递依赖。拆分为“员工表”(员工ID、部门ID)和“部门表”(部门ID、部门经理)后,员工表满足第三范式。


