4.6.1 范式与反范式

📅 2026/7/9 3:03:59
4.6.1 范式与反范式
MySQL 范式与反范式完全指南范式与反范式是数据库设计的一体两面。范式追求“逻辑严谨、零冗余”,反范式追求“性能优先、空间换时间”。优秀的数据库设计,是在两者之间找到最佳平衡点。一、范式:让数据井井有条范式(Normalization)是关系型数据库设计的理论基础,是一系列用于减少数据冗余、避免操作异常、优化表结构的规范。目前关系型数据库共有六种范式,从低到高依次为:1NF → 2NF → 3NF → BCNF → 4NF → 5NF。各级范式之间是递进关系——高一级范式必须建立在低一级范式的基础之上。实际工程中最常用的是前三范式(1NF、2NF、3NF)和BCNF。1.1 第一范式(1NF):原子性定义:表中的每一列都是不可再分的基本数据项,即每个字段只能包含一个原子值。反例:联系方式字段同时存储了电话和邮箱学生ID姓名联系方式1张三13800138000, zhangsan@email.com这个联系方式字段包含了两个信息,违反了第一范式。正例:拆分为两个字段学生ID姓名电话邮箱1张三13800138000zhangsan@email.com每个字段都是原子值,符合第一范式。1.2 第二范式(2NF):完全依赖主键定义:在满足1NF的基础上,要求表中的每个非主键字段都必须完全依赖于主键(而不能只依赖于主键的一部分,针对复合主键)。反例:订单明细表使用联合主键(订单编号 + 商品编号)订单编号商品编号商品名称数量单价客户11电脑110000张三12手机26000张三23iPad33000李四问题分析:联合主键 = (订单编号, 商品编号)商品名称只依赖于商品编号(主键的一部分)→ 部分依赖客户只依赖于订单编号(主键的一部分)→ 部分依赖正例:拆分为三张表订单表:订单编号客户1张三2李四订单明细表:订单编号商品编号数量111122233商品表:商品编号商品名称单价1电脑100002手机60003