数据库技能Skill databases

这个技能专注于使用MongoDB和PostgreSQL数据库进行开发和管理,涵盖数据库设计、查询编写、性能优化、迁移、备份恢复等操作,适用于后端开发、数据工程和数据库管理。关键词:数据库,MongoDB,PostgreSQL,查询优化,数据管理,后端开发。

后端开发 0 次安装 0 次浏览 更新于 3/17/2026

name: databases description: 使用MongoDB(文档数据库、BSON文档、聚合管道、Atlas云)和PostgreSQL(关系数据库、SQL查询、psql CLI、pgAdmin)。适用于设计数据库模式、编写查询和聚合、优化索引以提高性能、执行数据库迁移、配置复制和分片、实施备份和恢复策略、管理数据库用户和权限、分析查询性能或管理生产数据库。 license: MIT

数据库技能

统一指南,用于使用MongoDB(文档导向)和PostgreSQL(关系型)数据库。根据用例选择正确的数据库,并掌握两个系统。

何时使用此技能

在以下情况下使用:

  • 设计数据库模式和数据结构
  • 编写查询(SQL或MongoDB查询语言)
  • 构建聚合管道或复杂连接
  • 优化索引和查询性能
  • 实施数据库迁移
  • 设置复制、分片或集群
  • 配置备份和灾难恢复
  • 管理数据库用户和权限
  • 分析慢查询和性能问题
  • 管理生产数据库部署

数据库选择指南

选择MongoDB时:

  • 模式灵活性:频繁结构更改、异构数据
  • 文档中心:自然的JSON/BSON数据模型
  • 水平扩展:需要在多个服务器间分片
  • 高写入吞吐量:IoT、日志记录、实时分析
  • 嵌套/层次数据:优先使用嵌入文档
  • 快速原型设计:无需迁移的模式演化

最适合: 内容管理、目录、IoT时间序列、实时分析、移动应用、用户档案

选择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 参考

PostgreSQL 参考

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)

资源