漫画数据库技术选型
🎯 学习目标:掌握架构师核心技能——数据库技术选型,针对不同业务场景选择最合适的数据库方案
🏛️ 第一章:关系型数据库对比选型
🤔 MySQL vs PostgreSQL vs TiDB
想象数据库就像不同类型的仓库…
🏪 数据库仓库对比:
MySQL (传统超市):
┌─────────────────┐
│ 🛒 简单易用 │ ← 上手简单,生态丰富
│ 💰 成本低廉 │ ← 开源免费,运维成本低
│ 🚀 读性能优秀 │ ← InnoDB引擎优化好
│ ⚠️ 写入瓶颈 │ ← 单机写入有限制
└─────────────────┘
PostgreSQL (精品百货):
┌─────────────────┐
│ 🎯 功能丰富 │ ← 支持JSON、全文搜索
│ 🔒 ACID强保证 │ ← 事务支持最完善
│ 📊 复杂查询强 │ ← 支持窗口函数、CTE
│ 🐌 学习成本高 │ ← 配置相对复杂
└─────────────────┘
TiDB (现代mall):
┌─────────────────┐
│ 🌐 分布式架构 │ ← 天然支持水平扩展
│ ⚖️ 强一致性 │ ← 分布式事务ACID
│ 🔧 MySQL兼容 │ ← 无缝迁移MySQL
│ 💸 成本较高 │ ← 需要多节点部署
└─────────────────┘
📊 关系型数据库详细对比
📊 三大关系型数据库技术对比:
┌─────────────┬─────────────┬─────────────┬─────────────┐
│ 特性 │ MySQL │ PostgreSQL │ TiDB │
├─────────────┼─────────────┼─────────────┼─────────────┤
│ 🏗️ 架构模式 │ 单机主从 │ 单机主从 │ 分布式集群 │
│ 📈 扩展能力 │ 垂直扩展 │ 垂直扩展 │ 水平扩展 │
│ 💾 存储引擎 │InnoDB/MyISAM│ 单一引擎 │ TiKV │
│ 🔒 事务支持 │ ACID │ 完整ACID │ 分布式ACID │
│ 📊 复杂查询 │ 一般 │ 强 │ 强 │
│ 🌐 分布式 │ 否 │ 否 │ 是 │
│ 💰 使用成本 │ 低 │ 中等 │ 高 │
│ 🛠️ 运维难度 │ 低 │ 中等 │ 高 │
│ 📚 生态支持 │ 最丰富 │ 丰富 │ 发展中 │
│ 🎯 适用场景 │ 中小型应用 │ 复杂业务系统 │ 大型分布式 │
└─────────────┴─────────────┴─────────────┴─────────────┘
性能对比 (相对值):
MySQL ████████████████████ (单机读写性能)
PostgreSQL ███████████████ (复杂查询性能)
TiDB █████████████████████ (分布式性能)
学习成本:
MySQL ████ (最容易上手)
PostgreSQL ███████ (中等学习成本)
TiDB ██████████ (需要分布式知识)
🎯 关系型数据库选型决策树
🎯 关系型数据库选型流程:
开始选型
│
┌────▼────┐
│数据量大小│
└────┬────┘
│
┌──────────────┼──────────────┐
▼ ▼ ▼
数据量<100GB 100GB-1TB 数据量>1TB
│ │ │
┌────▼────┐ ┌────▼────┐ ┌────▼────┐
│ 业务复杂度│ │ 扩展需求 │ │ 必须分布式│
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
┌────▼────┐ ┌────▼────┐ ▼
│简单CRUD │ │需要扩展 │ TiDB
└────┬────┘ └────┬────┘ (大数据量)
│ │
▼ ▼
MySQL PostgreSQL
(高性价比) (复杂业务)
选型建议:
🎯 初创公司/MVP项目 → MySQL
🎯 企业级应用/复杂业务 → PostgreSQL
🎯 大型互联网/金融级 → TiDB
🎯 需要强GIS支持 → PostgreSQL
🎯 需要分布式事务 → TiDB
📦 第二章:NoSQL数据库选型
🍃 MongoDB vs Redis vs HBase
🍃 NoSQL数据库仓库对比:
MongoDB (文档仓库):
┌─────────────────┐
│ 📄 文档存储 │ ← JSON格式,schema灵活
│ 🔍 查询丰富 │ ← 支持复杂查询和索引
│ 🌐 分片集群 │ ← 内置分片支持
│ 🎯 适合内容管理 │ ← CMS、用户画像
└─────────────────┘
Redis (高速缓存):
┌─────────────────┐
│ ⚡ 极速响应 │ ← 内存存储,μs级延迟
│ 🔧 数据结构丰富 │ ← String/Hash/Set/ZSet
│ 📊 支持计算 │ ← Lua脚本、Stream
│ 💾 持久化选项 │ ← RDB/AOF持久化
└─────────────────┘
HBase (大数据仓库):
┌─────────────────┐
│ 📈 海量数据 │ ← PB级数据存储
│ 📊 列式存储 │ ← 稀疏数据友好
│ 🔄 实时读写 │ ← 毫秒级随机访问
│ 🌐 Hadoop生态 │ ← 与大数据集成
└─────────────────┘
🔍 NoSQL数据库详细对比
🔍 NoSQL数据库技术对比:
┌─────────────┬─────────────┬─────────────┬─────────────┐
│ 特性 │ MongoDB │ Redis │ HBase │
├─────────────┼─────────────┼─────────────┼─────────────┤
│ 📊 数据模型 │ 文档型 │ 键值型 │ 列族型 │
│ 🚀 查询语言 │ MongoDB QL │ 命令接口 │ Java API │
│ 🔍 查询能力 │ 丰富 │ 简单 │ 简单 │
│ 📈 扩展模式 │ 分片集群 │ 集群模式 │ Region分割 │
│ 💾 存储介质 │ 磁盘为主 │ 内存为主 │ 磁盘为主 │
│ ⚡ 访问速度 │ 中等 │ 快 │ 中等 │
│ 📊 数据量 │ TB │ GB │ PB │
│ 🔒 事务支持 │ 4.0+支持 │ 有限 │ 行级 │
│ 🛠️ 运维复杂度│ 中等 │ 低 │ 高 │
│ 🎯 主要场景 │ 内容管理/IoT │ 缓存/会话 │ 大数据/日志 │
└─────────────┴─────────────┴─────────────┴─────────────┘
性能特点:
延迟对比 (毫秒级):
Redis ■ (0.1ms)
MongoDB ███ (1-10ms)
HBase ████ (1-20ms)
吞吐量对比:
Redis ████████████████ (10万QPS+)
MongoDB ████████ (1万QPS+)
HBase ██████████████ (5万QPS+)
🎯 NoSQL选型决策矩阵
🎯 NoSQL数据库选型矩阵:
使用场景 vs 数据库选择:
📊 缓存场景:
┌─────────────────┐
│ 会话存储 │ → Redis (String)
│ 排行榜 │ → Redis (ZSet)
│ 计数器 │ → Redis (Hash)
│ 分布式锁 │ → Redis (Set)
│ 消息队列 │ → Redis (Stream)
└─────────────────┘
📄 文档场景:
┌─────────────────┐
│ 内容管理系统 │ → MongoDB
│ 用户画像 │ → MongoDB
│ 商品目录 │ → MongoDB
│ 日志分析 │ → MongoDB (时序)
│ IoT数据存储 │ → MongoDB
└─────────────────┘
📈 大数据场景:
┌─────────────────┐
│ 用户行为日志 │ → HBase
│ 时序数据存储 │ → HBase/InfluxDB
│ 搜索索引 │ → Elasticsearch
│ 图关系数据 │ → Neo4j
│ 地理位置数据 │ → PostGIS/MongoDB
└─────────────────┘
🏗️ 第三章:数据库架构模式选择
🔧 单体 vs 分库分表 vs 分布式
🔧 数据库架构演进路径:
阶段1: 单体数据库 (0-100万用户)
┌─────────────────────────────────────┐
│ 应用服务 │
│ │ │
│ ┌────▼────┐ │
│ │ MySQL │ │
│ │ 单实例 │ │
│ └─────────┘ │
└─────────────────────────────────────┘
优点:简单,事务一致性
缺点:性能瓶颈,单点故障
阶段2: 读写分离 (100万-500万用户)
┌─────────────────────────────────────┐
│ 应用服务 │
│ 读 │ 写 │
│ ┌───▼───┐ │ ┌───▼───┐ │
│ │ Slave │ │ │Master │ │
│ │(只读) │◄─┼──│(读写) │ │
│ └───────┘ │ └───────┘ │
│ └───────────┼─────────────────┘
│ 主从同步 │
└─────────────────────────────────────┘
优点:读性能提升,高可用
缺点:写入仍是瓶颈
阶段3: 分库分表 (500万-5000万用户)
┌─────────────────────────────────────┐
│ 应用服务 │
│ 分片路由 │
│ ┌─────────┬─────────┬─────────┐ │
│ ▼ ▼ ▼ │ │
│ ┌─────┐ ┌─────┐ ┌─────┐ │ │
│ │DB1 │ │DB2 │ │DB3 │ │ │
│ │分片1│ │分片2│ │分片3│ │ │
│ └─────┘ └─────┘ └─────┘ │ │
└─────────────────────────────────────┘
优点:线性扩展,性能提升
缺点:分布式事务复杂
阶段4: 分布式数据库 (5000万+用户)
┌─────────────────────────────────────┐
│ 应用服务 │
│ │ │
│ ┌────▼────┐ │
│ │ TiDB │ │
│ │ 分布式 │ │
│ │ 集群 │ │
│ └─────────┘ │
└─────────────────────────────────────┘
优点:自动分片,强一致性
缺点:成本高,运维复杂
🎯 数据库架构选型策略
🎯 基于业务特征的架构选型:
业务类型 vs 推荐架构:
📱 初创MVP项目:
┌─────────────────┐
│ 单体MySQL │ ← 快速上线,成本低
│ + Redis缓存 │ ← 提升性能
│ + 云数据库RDS │ ← 减少运维
└─────────────────┘
🛒 电商平台:
┌─────────────────┐
│ MySQL主库 │ ← 订单、支付核心
│ + 读写分离 │ ← 商品浏览优化
│ + MongoDB │ ← 商品目录、评论
│ + Redis │ ← 购物车、库存
│ + ES搜索 │ ← 商品搜索
└─────────────────┘
🏦 金融系统:
┌─────────────────┐
│ TiDB分布式 │ ← 交易数据强一致
│ + PostgreSQL │ ← 风控分析
│ + Redis集群 │ ← 实时计算
│ + InfluxDB │ ← 监控时序数据
└─────────────────┘
📊 大数据平台:
┌─────────────────┐
│ HBase │ ← 海量日志存储
│ + ClickHouse │ ← OLAP分析
│ + Redis │ ← 实时指标
│ + MySQL │ ← 元数据管理
└─────────────────┘
⚖️ 第四章:数据一致性与性能权衡
🔒 CAP理论实际应用
🔒 CAP理论在数据库选择中的应用:
CAP三角形:
Consistency (一致性)
△
╱ ╲
╱ ╲
╱ ╲
╱ CP ╲
╱ 区 ╲
╱ ╲
╱ MySQL ╲
╱ PostgreSQL ╲
╱ TiDB ╲
╱ ╲
Availability ●────────● Partition Tolerance
╱ AP区 ╲ (分区容错)
╱ MongoDB ╲
╱ Redis ╲
╱ Cassandra ╲
不同业务场景的选择:
💰 金融交易系统 (选择CP):
- 强一致性要求 > 可用性
- 推荐:TiDB、PostgreSQL
- 宁可暂停服务也不能数据错误
📱 社交媒体平台 (选择AP):
- 可用性 > 强一致性
- 推荐:MongoDB、Cassandra
- 允许短期数据不一致
🛒 电商系统 (混合策略):
- 订单系统:CP策略 (MySQL/TiDB)
- 商品浏览:AP策略 (MongoDB/Redis)
- 根据业务重要性分层选择
📊 性能vs一致性权衡矩阵
📊 数据库性能与一致性权衡:
性能要求
↑
高性能
│
Redis │ │ │ MemSQL
(内存) │ │ │ (内存分布式)
│ │ │
────────────────┼───┼───┼─────────────→
│ │ │ 一致性要求
弱一致性 │ │ │ 强一致性
│ │ │
MongoDB │ │ │ PostgreSQL
(最终一致) │ │ │ (ACID)
│ │ │
│ │ │ TiDB
│ │ │ (分布式ACID)
│
低性能
选型建议:
🔴 高性能+弱一致性 → Redis/MongoDB
🟡 中等性能+强一致性 → MySQL/PostgreSQL
🟢 低延迟+强一致性 → TiDB/CockroachDB
🔵 超高性能+无一致性要求 → 内存数据库
🎯 第五章:业务场景选型实战
🛒 电商系统数据库架构
// 🛒 电商系统数据库选型实战
/**
* 电商系统多数据库架构设计
*/
@Configuration
public class ECommerceDataSourceConfig {
// 1. 核心交易数据 - MySQL集群
@Primary
@Bean("primaryDataSource")
public DataSource primaryDataSource() {
// 主数据源:用户、订单、支付
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://mysql-master:3306/ecommerce");
config.setUsername("root");
config.setPassword("password");
config.setMaximumPoolSize