MySQL三大范式和反范式

本文详细介绍了数据库设计中的第一、第二及第三范式的基本概念及其应用案例,并探讨了反范式化的方法及其对数据库性能的影响。

<!-- Baidu Button BEGIN -->

1. 第一范式
确保数据表中每列(字段)的原子性。
如果数据表中每个字段都是不可再分的最小数据单元,则满足第一范式。
例如:user用户表,包含字段id,username,password
 
2. 第二范式
在第一范式的基础上更进一步,目标是确保表中的每列都和主键相关。
如果一个关系满足第一范式,并且除了主键之外的其他列,都依赖于该主键,则满足第二范式。
例如:一个用户只有一种角色,而一个角色对应多个用户。则可以按如下方式建立数据表关系,使其满足第二范式。
user用户表,字段id,username,password,role_id
role角色表,字段id,name
用户表通过角色id(role_id)来关联角色表
 
3. 第三范式
在第二范式的基础上更进一步,目标是确保表中的列都和主键直接相关,而不是间接相关。
例如:一个用户可以对应多个角色,一个角色也可以对应多个用户。则可以按如下方式建立数据表关系,使其满足第三范式。
user用户表,字段id,username,password
role角色表,字段id,name
user_role用户-角色中间表,id,user_id,role_id
像这样,通过第三张表(中间表)来建立用户表和角色表之间的关系,同时又符合范式化的原则,就可以称为第三范式。
 
4. 反范式化
反范式化指的是通过增加冗余或重复的数据来提高数据库的读性能。
例如:在上例中的user_role用户-角色中间表增加字段role_name。
反范式化可以减少关联查询时,join表的次数。
### Mysql范式反范式 #### 范式的概念 数据库范式是为了减少数据冗余并提高数据的一致性可维护性所制定的设计原则。以下是个主要范式的定义: - **第一范式 (1NF)** 要求数据库表中的每一列都具有原子性,即不可再分割的数据项。如果某一列可以被进一步分解成多个部分,则该表不满足第一范式的要求[^2]。 - **第二范式 (2NF)** 在满足第一范式的基础上,要求所有的非主属性完全函数依赖于候选码。换句话说,每一条记录的信息都应该只由其唯一标识符(通常是主键)决定,而不是其他非主键字段的一部分[^1]。 - **第范式 (3NF)** 在满足第二范式的同时,还要求消除传递依赖。这意味着任何非主属性都不能通过另一个非主属性间接依赖于主键。只有当某个字段直接依赖于主键时才允许存在[^1]。 #### 反范式的概念 反范式是指有意违背传统的数据库规范化理论,在某些情况下增加数据冗余以优化读取操作或简化复杂查询的过程。虽然这可能会导致一定程度上的重复存储以及更新异常等问题,但在特定的应用场景下能够显著提升系统的性能表现[^3]。 #### 应用场景分析 ##### 范式的典型应用场景 - 当应用程序更关注写入效率而非读取速度时; - 需要确保较高的数据一致性准确性而不希望因频繁联接而导致错误发生的情况下; - 对于那些涉及量事务处理的企业级应用来说尤为重要,因为它们通常会经历高频率的数据修改活动[^4]。 ##### 反范式的常见使用场合 - Web日志统计:由于访问量巨且实时性强的特点使得采用去重后的汇总表形式更加高效; - 缓存机制实现:将经常一起使用的关联信息预先计算好保存在同一张宽表里供快速检索调用; - 报告生成服务端预聚合技术运用实例——比如电商网站商品销量排行榜等功能模块可以通过提前准备好相应维度下的统计数据来加速页面加载时间[^3]; ```sql -- 示例代码展示如何创建符合不同范式的表格结构 CREATE TABLE Customers ( CustomerID INT PRIMARY KEY, FirstName VARCHAR(50), LastName VARCHAR(50) ); CREATE TABLE Orders ( OrderID INT PRIMARY KEY, CustomerID INT, FOREIGN KEY(CustomerID) REFERENCES Customers(CustomerID), TotalAmount DECIMAL(10,2) ); ``` 以上例子展示了两个相互独立但又紧密相连的关系实体之间是如何按照标准建模方法构建起来的。其中`Customers`表包含了客户基本信息,而订单详情则单独放在了`Orders`表当中并通过外键约束实现了两者间的联系[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值