name: databases description: 使用MongoDB(文档数据库,BSON文档,聚合管道,Atlas云)和PostgreSQL(关系型数据库,SQL查询,psql CLI,pgAdmin)。在以下情况下使用:设计数据库模式、编写查询和聚合、优化索引性能、执行数据库迁移、配置复制和分片、实施备份和恢复策略、管理数据库用户和权限、分析查询性能或管理生产数据库。 license: MIT
数据库技能
统一指南,用于处理MongoDB(面向文档)和PostgreSQL(关系型)数据库。根据您的用例选择合适的数据库,并掌握这两个系统。
何时使用此技能
在以下情况下使用:
- 设计数据库模式和数据模型
- 编写查询(SQL或MongoDB查询语言)
- 构建聚合管道或复杂连接
- 优化索引和查询性能
- 实施数据库迁移
- 设置复制、分片或集群
- 配置备份和灾难恢复
- 管理数据库用户和权限
- 分析慢查询和性能问题
- 管理生产数据库部署
数据库选择指南
选择MongoDB时:
- 模式灵活性:频繁结构变化、异构数据
- 文档中心:自然的JSON/BSON数据模型
- 水平扩展:需要在多个服务器间分片
- 高写入吞吐量:物联网、日志记录、实时分析
- 嵌套/分层数据:首选嵌入文档
- 快速原型设计:无需迁移的模式演进
最适合: 内容管理、目录、物联网时间序列、实时分析、移动应用、用户配置文件
选择PostgreSQL时:
- 强一致性:关键ACID事务
- 复杂关系:多对多连接、引用完整性
- SQL需求:团队专业知识、报告工具、BI系统
- 数据完整性:严格模式验证、约束
- 成熟生态系统:广泛工具、扩展
- 复杂查询:窗口函数、CTE、分析工作负载
最适合: 金融系统、电子商务交易、ERP、CRM、数据仓库、分析
两者都支持:
- JSON/JSONB存储和查询
- 全文搜索功能
- 地理空间查询和索引
- 复制和高可用性
- ACID事务(MongoDB 4.0+)
- 强大安全功能
快速开始
MongoDB设置
# Atlas(云)- 推荐
# 1. 在mongodb.com/atlas注册
# 2. 创建M0免费集群
# 3. 获取连接字符串
# 连接
mongodb+srv://user:pass@cluster.mongodb.net/db
# Shell
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、JOINs、子查询、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) | 关系型(表/行) |
| 模式 | 灵活、动态 | 严格、预定义 |
| 查询语言 | MongoDB查询语言 | SQL |
| 连接 | $lookup(有限) | 原生、优化 |
| 事务 | 多文档(4.0+) | 原生ACID |
| 扩展 | 水平(分片) | 垂直(主)、水平(扩展) |
| 索引 | 单列、复合、文本、地理等 | B树、哈希、GiST、GIN等 |
最佳实践
MongoDB:
- 对一对少关系使用嵌入文档
- 对一对多或多对多关系引用文档
- 索引频繁查询的字段
- 使用聚合管道进行复杂转换
- 在生产中启用身份验证和TLS
- 使用Atlas进行托管托管
PostgreSQL:
- 将模式规范化为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/