Cleared-MySQL (上)
一、数据库设计范式
数据库设计范式是用于组织数据库结构的规则,有助于减少数据冗余和提高数据的一致性。以下介绍常见的几种范式:
1. 第一范式(1NF)
-
定义: 所有字段都是不可再分的原子值
-
特点: 确保每个字段的最小单位不可再拆分。例如,存储地址时,不应将“省、市、区”组合在一个字段,而是分成三个单独字段
-
示例图:
id 姓名 地址 1 张三 北京市朝阳区 不符合 1NF,因为“地址”字段包含多个层次信息。调整后:
id 姓名 省份 城市 区县 1 张三 北京 北京市 朝阳区
2. 第二范式(2NF)
-
定义: 在满足 1NF 的基础上,非主键字段完全依赖于主键
-
特点: 避免部分依赖问题,防止数据冗余。例如,在学生表中,“班级名称”字段不应仅依赖于“班级号”,而是依赖整个复合主键
-
示例图:
学号 班级号 班级名称 1 101 一年级一班 此表不符合 2NF。应将“班级名称”拆分到单独的“班级”表中,用“班级号”关联,避免重复存储:
-
学生表
学号 班级号 1 101 -
班级表
班级号 班级名称 101 一年级一班
-
3. 第三范式(3NF)
- 定义: 在满足 2NF 的基础上,非主键字段之间不存在传递依赖。
- 特点: 防止传递依赖问题,使表结构更为简洁。例如,将“部门名称”单独拆分成部门表,通过部门编号关联到员工表
4. 反范式
反范式的主要思想是通过故意引入冗余数据来优化查询速度,以牺牲存储空间换取查询效率。在性能要求较高的数据库应用中(如大数据分析系统或实时查询系统),反范式的设计常被使用
反范式设计的适用场景
反范式通常适用于以下场景:
-
高频查询场景: 如果系统中某个查询特别频繁且涉及多表关联,使用反范式可以将所需数据冗余存储在一个表中,从而减少关联查询的开销。
-
数据仓库/OLAP系统: 在数据仓库等分析型数据库中,查询速度比数据冗余度更重要。反范式设计可以减少复杂查询的响应时间。
-
读取多于写入场景: 如果应用场景中读操作远多于写操作,可以使用反范式以优化读取效率。虽然数据冗余会增加更新时的一致性维护成本,但总体而言效率会提高。
反范式设计的常用策略
反范式设计可以通过以下几种常用策略实现:
1. 引入冗余字段
为了减少复杂的多表关联查询,可以将其他表的重要字段直接复制到当前表。例如,在一个包含“订单”表和“客户”表的系统中,客户信息可能经常需要随订单信息一起查询。在这种情况下,可以在“订单”表中冗余存储客户姓名和联系方式字段,减少多表查询的次数。
示例图:
-
原始表设计:
-
客户表
客户ID 客户姓名 联系方式 101 张三 12345678 -
订单表
订单ID 客户ID 金额 201 101 500
-
-
反范式设计后:
订单ID 客户ID 客户姓名 联系方式 金额 201 101 张三 12345678 500
这样,查询订单和客户信息可以一次完成,减少了表关联操作
2. 引入汇总字段
在高频统计查询中,反范式设计可以增加一个汇总字段来提前存储数据的聚合结果,从而减少实时计算的开销。例如,在订单表中增加一个“总销售额”字段,用于记录实时的销售总额
-
原始表设计:
订单ID 商品ID 数量 单价 201 301 3 100 202 302 2 150 -
反范式设计后添加汇总字段:
订单ID 商品ID 数量 单价 总价 201 301 3 100 300 202 302 2 150 300
这样可以避免每次查询时进行总价计算。
3. 分区与分表
在数据量特别大的情况下,通过水平分区或分表将数据分布到多个表中,从而降低单个表的查询压力,增加查询效率。特别是在大数据分析场景中,通过分表可以有效提升查询性能
反范式设计的利弊
优点:
- 提高查询速度: 避免多表关联,减少 SQL 查询中的 JOIN 操作
- 适合高频查询和统计分析: 适合大量数据查询需求的场景,如报表系统
缺点:
- 增加存储空间: 冗余数据会增加数据库的存储成本
- 维护一致性复杂度增加: 冗余字段在数据更新时需要同步更新,容易引发数据一致性问题
二、查找算法及树型结构
数据库索引中常用的数据结构包括二叉树、红黑树和 B+ 树,这些结构为数据查找带来了高效性和稳定性
1. 二叉树(Binary Tree)
-
定义: 每个节点最多有两个子节点,分别是左节点和右节点
-
特点: 左子节点的值小于根节点,右子节点的值大于根节点
-
示意图:
8/ \3 10/ \ \1 6 14
2. 红黑树(Red-Black Tree)
- 定义: 一种自平衡的二叉查找树,每个节点有红色或黑色标记,通过旋转和颜色变换保证树的平衡
- 特点: 红黑树的插入和删除效率较高,复杂度为 O(log n),但在数据库中,存储量较大时,红黑树不适合磁盘存储
3. B+ 树(B+ Tree)
-
定义: B+ 树是一种平衡多路查找树,其所有数据存储在叶节点,非叶节点只存储索引
-
特点: 适合磁盘存储的大规模数据查找。叶节点间通过指针相连,便于范围查询
-
示意图:
[13]/ \[3,7] [16,18]/ | \ / | \1 5 9 14 17 19