Day03-03|2.3.3 数据库:数据管理、事务一致性与架构选型

对应教材:上篇·综合知识·第 2 章“计算机系统基础知识”·2.3.3 数据库

学习定位:数据库是计算机软件体系中的基础支撑软件,负责数据定义、存储、查询、更新、事务、安全和恢复。高级系统架构设计师不能只会写 SQL,还要能根据数据关系、访问模式、一致性、并发、规模和恢复目标选择数据库架构。本节是后续数据库设计、大数据、微服务和信息系统架构学习的基础。

一、今日目标

完成本节后,应能区分数据库、数据库管理系统和数据库应用;理解关系模型、主键、外键、约束、索引和视图;掌握事务 ACID、并发异常、锁和隔离级别的基本思想;理解日志、备份、恢复和高可用;能比较集中式、主从、分片、读写分离和缓存协同;在案例中分析慢查询、锁等待、数据不一致和扩容问题。

二、数据库系统的组成

数据库系统不只是一个数据库文件,而是由数据库、数据库管理系统、应用程序、用户、管理员、硬件和运行环境共同组成。数据库保存结构化或半结构化数据;数据库管理系统提供定义、操作、控制和恢复能力;应用程序通过驱动、连接池、SQL 或 ORM 使用数据库。

组成 职责 架构关注点
数据库 持久保存数据和元数据 结构、容量、索引、分区
DBMS 管理存储、查询、事务和安全 并发、优化器、恢复、权限
应用程序 实现业务规则和访问流程 SQL、事务边界、连接池
DBA/运维 备份、监控、变更和恢复 容量、告警、演练、合规
基础设施 提供计算、内存、磁盘和网络 延迟、IOPS、可靠性、扩展

数据库的核心价值是提供一种受控的数据共享机制。多个应用可以在统一约束下访问数据,避免每个应用都自行实现持久化、并发和恢复。但集中管理也会形成性能、可用性和扩展性压力,因此架构设计要明确数据库边界和数据责任。

三、数据模型与关系数据库

数据模型描述数据对象、对象之间的关系以及允许进行的操作。常见模型包括层次模型、网状模型、关系模型、面向对象模型和非关系模型。关系模型以二维表为基本结构,行表示元组,列表示属性,表之间通过键建立联系。

主键唯一标识一条记录,要求非空且唯一;候选键是可以唯一标识记录的属性组合;外键引用另一张表的主键或候选键,用于表达参照关系;唯一约束、防空约束、检查约束和默认值共同维护数据合法性。约束越完整,越能在数据源头阻止错误,但复杂跨表约束可能影响分布式扩展和写入性能。

规范化通过分解关系减少冗余和更新异常。第一范式强调属性不可再分;第二范式消除非主属性对联合主键的部分依赖;第三范式消除非主属性对主键的传递依赖。高度规范化有利于一致性和维护,但查询需要更多连接;适度反规范化可以减少连接、提升读性能,却可能引入冗余和一致性维护成本。

架构师不应把“完全规范化”当作所有系统的唯一答案。交易系统关注数据一致性和更新正确性,通常优先保持规范结构;报表和读模型可能为了查询性能进行反规范化;事件溯源、数据仓库和搜索索引则可能保存面向不同用途的派生数据。

四、数据库的三级模式

数据库三级模式通常包括外模式、概念模式和内模式。外模式面向特定用户或应用,描述其所能看到的数据;概念模式描述全体数据的逻辑结构和联系;内模式描述数据在存储介质上的组织方式。

三级模式通过映射实现数据独立性。逻辑数据独立性表示概念模式变化时,外模式和应用尽量不受影响;物理数据独立性表示内模式变化时,概念模式和应用尽量不受影响。视图、数据访问层、ORM 和服务接口都可以在一定程度上隔离内部存储变化,但它们并不能自动消除所有迁移成本。

五、索引与查询处理

索引是按特定字段组织的辅助访问结构,使数据库无需扫描全部数据即可快速定位记录。B+树适合范围查询和有序访问,哈希索引适合等值查询;位图索引适合低基数列和分析型场景。索引会占用磁盘和内存,也会增加插入、更新和删除成本,因此应根据真实查询模式设计。

复合索引的列顺序影响能否使用索引。一般要把过滤性较高、排序或连接中常用的列放在合适位置,并结合最左匹配、选择性、范围条件和覆盖索引分析。索引不是越多越好;冗余索引会增加写放大、缓存压力和优化器选择复杂度。

SQL 执行通常经历解析、重写、优化、生成执行计划和执行。优化器会估算表行数、选择性、连接代价和 I/O 代价。统计信息不准确、参数分布变化、隐式类型转换、函数作用于索引列、深分页和全表扫描,都可能导致计划不理想。

排查慢查询时应保存 SQL、参数、执行计划、扫描行数、返回行数、锁等待、I/O 和 CPU 数据。不能只凭 SQL 文本判断。优化后还要进行不同数据分布、并发度和缓存状态下的回归,防止单次测试恰好命中缓存而掩盖问题。

六、事务与 ACID

事务是一个不可分割的工作单元。ACID 分别表示原子性、一致性、隔离性和持久性:原子性要求事务中的操作要么全部成功、要么全部回滚;一致性要求事务前后满足约束和业务规则;隔离性要求并发事务之间按规定隔离;持久性要求提交后的结果在故障恢复后仍然存在。

ACID 不是数据库自动替业务定义的一切一致性。数据库可以保证某些约束和事务语义,但跨服务、跨数据库和外部支付系统的一致性,需要分布式事务、可靠消息、幂等、补偿和最终一致性方案共同完成。

并发事务可能出现脏读、不可重复读、幻读和丢失更新。隔离级别通常从读未提交、读已提交、可重复读到串行化逐步增强,隔离越强,并发性能和锁等待风险可能越高。不同数据库的具体实现存在差异,答题时应说明目标与代价,而不是死记名称。

锁可以保护行、页、表或其他资源。锁粒度越细,并发度通常越高,但管理开销和死锁可能增加;锁粒度越粗,管理简单,却容易阻塞更多事务。MVCC 通过保存多个版本,让读操作在一定条件下无需等待写锁,是很多高并发数据库的重要机制。

七、日志、备份与恢复

数据库通常使用预写日志记录变更,先确保日志持久化,再确认数据页写入。系统崩溃后可利用日志重做已提交事务、回滚未完成事务。检查点能够减少恢复时需要扫描的日志范围。

备份可以分为全量、增量和差异等形式;恢复要关注备份链完整性、备份一致性、恢复时间和恢复点。RAID、主从复制和高可用集群主要解决设备或节点故障,不能替代能够回到历史时间点的备份。对于误删除、逻辑错误和勒索攻击,必须保留隔离、不可篡改或异地备份。

RTO 表示故障后多长时间恢复服务,RPO 表示最多允许丢失多长时间的数据。同步复制通常降低数据丢失风险,但增加提交延迟和跨节点依赖;异步复制性能较好,但故障切换时可能存在复制延迟。系统架构师应根据业务等级设计不同恢复策略,而不是全系统统一采用最昂贵的同步方案。

八、数据库架构模式

单机数据库简单、成本低、事务边界清晰,适合规模有限或核心交易初期;主从复制可以分担读压力并提高读取可用性,但要处理复制延迟和读到旧数据;读写分离需要明确哪些读必须访问主库。

分库分表通过水平或垂直切分扩展容量和吞吐,但跨分片查询、排序、聚合、事务和数据迁移复杂;分区表在同一数据库内按范围、列表或哈希组织数据,有利于分区裁剪和生命周期管理,但仍受单实例能力限制。

缓存可以降低数据库读压力,但会引入失效、一致性、热点、穿透、击穿和雪崩问题。搜索引擎、数据仓库和消息系统应被视为不同用途的数据副本,不应无条件替代交易数据库。微服务拆分后,每个服务拥有独立数据边界,有助于自治和扩展,却会增加跨服务查询与最终一致性处理。

九、案例分析:订单系统出现库存超卖

某电商系统在高峰期间出现库存为负数。应用使用多个服务实例,数据库为主从结构,查询库存走从库,扣减库存走主库。请分析原因并提出改进。

参考答案:多个请求可能同时读取到从库中的旧库存,再分别向主库扣减,形成并发竞争和读写延迟问题。还要检查扣减 SQL 是否带有库存大于零的条件、是否使用原子更新、事务隔离是否合适、重试是否造成重复扣减,以及消息和支付回调是否幂等。

改进可采用带条件的原子更新,例如“库存大于零才扣减”,根据影响行数判断是否成功;对热点库存使用合理锁或串行化队列;关键判断读主库或使用版本号/乐观锁;建立请求幂等键和订单状态机;将库存预扣、订单创建和支付结果通过可靠消息与补偿机制协调。读写分离不能直接用于所有强一致读场景,必须按照业务语义选择。

十、综合知识练习

练习 1

下列关于数据库索引的说法正确的是( )。

A. 索引越多,所有查询和写入越快

B. 索引只占用 CPU,不占用存储空间

C. 索引设计应结合查询条件、排序、连接和写入代价

D. B+树只适合等值查询,不适合范围查询

答案:C。 索引会占用存储和内存,也增加维护成本;B+树通常适合有序和范围访问。

练习 2

为什么 RAID、主从复制不能完全替代数据库备份?

答案: RAID 主要应对部分介质故障,复制主要复制当前数据状态;误删除、错误更新、应用 Bug、病毒和勒索可能被同步到副本。备份和恢复点能够提供历史版本和时间点恢复,且应配合异地、隔离和恢复演练。

练习 3

简述读写分离可能造成的数据问题。

答案: 主从复制通常存在延迟,写入主库后立即读取从库可能读到旧数据;故障切换时还可能出现复制未完成。应按业务定义强一致读路由主库、会话粘滞、版本等待、读己之写或补偿策略,并监控复制延迟。

十一、论文素材

在数据架构设计中,我先按业务一致性、访问模式、数据规模、可用性和恢复目标划分数据边界。核心交易采用明确的事务边界、约束和幂等控制,查询场景通过索引、缓存、读副本和异步派生数据扩展;对大数据量采用分区或分片,并为跨分片查询和迁移设计专门流程。同时建立日志、备份、复制、故障切换和恢复演练机制,以 RTO、RPO、P95 延迟、吞吐、锁等待和复制延迟验证方案。

写数据库论文时,必须说明一致性与性能之间的取舍。不要只写“使用分库分表提高性能”,还要写清分片键、跨片事务、查询路由、数据迁移、回滚和监控,否则方案仍停留在名词层面。

十二、今日复盘

  1. 数据库、DBMS 和数据库应用分别是什么?
  2. 主键、外键、索引和约束分别解决什么问题?
  3. 规范化为什么可能带来更多连接?何时可以反规范化?
  4. ACID 四个特性如何理解?数据库一致性与业务一致性有什么区别?
  5. 脏读、不可重复读、幻读和丢失更新分别是什么?
  6. 为什么备份不能被 RAID 或主从复制替代?
  7. 读写分离如何导致读到旧数据?如何控制?
  8. 分库分表为什么不仅是增加数据库实例?

本节核心记忆句是:数据库架构的中心不是“选哪个产品”,而是围绕数据边界、访问模式、一致性、并发、扩展与恢复目标设计完整机制。只有把结构、事务、索引、复制、缓存和备份放进同一条链路,才能形成高级考试要求的数据库架构答案。