数据库技能
MongoDB(文档型数据库)和 PostgreSQL(关系型数据库)的统一使用指南。根据使用场景选择合适的数据库,并掌握两种数据库系统。
适用场景
- 设计数据库 Schema 和数据模型
- 编写查询(SQL 或 MongoDB 查询语言)
- 构建聚合管道(Aggregation Pipeline)或复杂联表查询(JOIN)
- 优化索引和查询性能
- 实施数据库迁移(Migration)
- 设置复制(Replication)、分片(Sharding)或集群(Clustering)
- 配置备份和灾难恢复(Disaster Recovery)
- 管理数据库用户和权限
- 分析慢查询和性能问题
- 管理生产环境的数据库部署
数据库选型指南
选择 MongoDB 的场景:
- Schema 灵活性:结构频繁变更、数据类型异构
- 文档为中心:天然的 JSON/BSON 数据模型
- 水平扩展:需要跨多台服务器分片
- 高写入吞吐量:物联网(IoT)、日志记录、实时分析
- 嵌套/层级数据:优先使用嵌入式文档(Embedded Documents)
- 快速原型开发:Schema 演进无需迁移
最适合: 内容管理、商品目录、物联网时间序列、实时分析、移动应用、用户画像
选择 PostgreSQL 的场景:
- 强一致性:ACID 事务至关重要
- 复杂关联:多对多联表查询、引用完整性(Referential Integrity)
- SQL 需求:团队 SQL 经验丰富、报表工具、BI 系统
- 数据完整性:严格的 Schema 验证和约束
- 成熟生态:丰富的工具链和扩展
- 复杂查询:窗口函数(Window Functions)、CTE、分析型工作负载
最适合: 金融系统、电商交易、ERP、CRM、数据仓库、分析系统
两者均支持:
- JSON/JSONB 存储和查询
- 全文搜索(Full-Text Search)功能
- 地理空间(Geospatial)查询和索引
- 复制(Replication)和高可用
- ACID 事务(MongoDB 4.0+)
- 强安全特性
快速开始
MongoDB 配置
# Atlas(云服务) - 推荐方案
# 1. 在 mongodb.com/atlas 注册
# 2. 创建 M0 免费集群
# 3. 获取连接字符串
# 连接字符串
mongodb+srv://user:pass@cluster.mongodb.net/db
# 命令行
mongosh "mongodb+srv://cluster.mongodb.net/mydb"
# 基本操作
db.users.insertOne({ name: "Alice", age: 30 })
db.users.find({ age: { $gte: 18 } })
db.users.updateOne({ name: "Alice" }, { $set: { age: 31 } })
db.users.deleteOne({ name: "Alice" })
PostgreSQL 配置
# Ubuntu/Debian
sudo apt-get install postgresql postgresql-contrib
# 启动服务
sudo systemctl start postgresql
# 连接数据库
psql -U postgres -d mydb
# 基本操作
CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT, age INT);
INSERT INTO users (name, age) VALUES ('Alice', 30);
SELECT * FROM users WHERE age >= 18;
UPDATE users SET age = 31 WHERE name = 'Alice';
DELETE FROM users WHERE name = 'Alice';
常用操作对照
创建/插入
// MongoDB
db.users.insertOne({ name: "Bob", email: "bob@example.com" })
db.users.insertMany([{ name: "Alice" }, { name: "Charlie" }])
-- PostgreSQL
INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');
INSERT INTO users (name, email) VALUES ('Alice', NULL), ('Charlie', NULL);
读取/查询
// MongoDB
db.users.find({ age: { $gte: 18 } })
db.users.findOne({ email: "bob@example.com" })
-- PostgreSQL
SELECT * FROM users WHERE age >= 18;
SELECT * FROM users WHERE email = 'bob@example.com' LIMIT 1;
更新
// MongoDB
db.users.updateOne({ name: "Bob" }, { $set: { age: 25 } })
db.users.updateMany({ status: "pending" }, { $set: { status: "active" } })
-- PostgreSQL
UPDATE users SET age = 25 WHERE name = 'Bob';
UPDATE users SET status = 'active' WHERE status = 'pending';
删除
// MongoDB
db.users.deleteOne({ name: "Bob" })
db.users.deleteMany({ status: "deleted" })
-- PostgreSQL
DELETE FROM users WHERE name = 'Bob';
DELETE FROM users WHERE status = 'deleted';
索引
// MongoDB
db.users.createIndex({ email: 1 }) // 单字段索引
db.users.createIndex({ status: 1, createdAt: -1 }) // 复合索引
-- PostgreSQL
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_status_created ON users(status, created_at DESC);
参考文档导航
MongoDB 参考
- mongodb-crud.md — CRUD 操作、查询操作符、原子更新
- mongodb-aggregation.md — 聚合管道、阶段、操作符、模式
- mongodb-indexing.md — 索引类型、复合索引、性能优化
- mongodb-atlas.md — Atlas 云服务设置、集群、监控、搜索
PostgreSQL 参考
- postgresql-queries.md — SELECT、JOIN、子查询、CTE、窗口函数
- postgresql-psql-cli.md — psql 命令、元命令、脚本
- postgresql-performance.md — EXPLAIN、查询优化、VACUUM、索引
- postgresql-administration.md — 用户管理、备份、复制、维护
Python 工具脚本
scripts/ 目录下的数据库工具脚本:
- db_migrate.py — 为两种数据库生成和应用迁移
- db_backup.py — 备份和恢复 MongoDB 与 PostgreSQL
- db_performance_check.py — 分析慢查询并推荐索引
# 生成迁移
python scripts/db_migrate.py --db mongodb --generate "add_user_index"
# 执行备份
python scripts/db_backup.py --db postgres --output /backups/
# 性能检查
python scripts/db_performance_check.py --db mongodb --threshold 100ms
关键差异总结
| 特性 | MongoDB | PostgreSQL |
|---|---|---|
| 数据模型 | 文档型(JSON/BSON) | 关系型(表/行) |
| Schema | 灵活、动态 | 严格、预定义 |
| 查询语言 | MongoDB 查询语言 | SQL |
| 联表查询 | $lookup(有限制) | 原生 JOIN,经过优化 |
| 事务 | 多文档事务(4.0+) | 原生 ACID |
| 扩展方式 | 水平扩展(分片) | 垂直扩展(主库),水平扩展(扩展插件) |
| 索引类型 | 单字段、复合、文本、地理空间等 | B-tree、Hash、GiST、GIN 等 |
最佳实践
MongoDB:
- 一对少(1-to-few)关系使用嵌入式文档
- 一对多或多对多关系使用引用文档
- 为频繁查询的字段创建索引
- 使用聚合管道处理复杂数据转换
- 生产环境启用认证和 TLS
- 使用 Atlas 进行托管部署
PostgreSQL:
- Schema 规范化到第三范式(3NF),为性能可适当反规范化
- 使用外键确保引用完整性
- 为外键和频繁过滤的列创建索引
- 使用 EXPLAIN ANALYZE 优化查询
- 定期执行 VACUUM 和 ANALYZE 维护
- Web 应用使用连接池(pgBouncer)
资源
- MongoDB:https://www.mongodb.com/docs/
- PostgreSQL:https://www.postgresql.org/docs/
- MongoDB 大学:https://learn.mongodb.com/
- PostgreSQL 教程:https://www.postgresqltutorial.com/