Databases Skill
Unified guide for working with MongoDB (document-oriented) and PostgreSQL (relational) databases. Choose the right database for your use case and master both systems.
When to Use This Skill
Use when:
- Designing database schemas and data models
- Writing queries (SQL or MongoDB query language)
- Building aggregation pipelines or complex joins
- Optimizing indexes and query performance
- Implementing database migrations
- Setting up replication, sharding, or clustering
- Configuring backups and disaster recovery
- Managing database users and permissions
- Analyzing slow queries and performance issues
- Administering production database deployments
Database Selection Guide
Choose MongoDB When:
- Schema flexibility: frequent structure changes, heterogeneous data
- Document-centric: natural JSON/BSON data model
- Horizontal scaling: need to shard across multiple servers
- High write throughput: IoT, logging, real-time analytics
- Nested/hierarchical data: embedded documents preferred
- Rapid prototyping: schema evolution without migrations
Best for: Content management, catalogs, IoT time series, real-time analytics, mobile apps, user profiles
Choose PostgreSQL When:
- Strong consistency: ACID transactions critical
- Complex relationships: many-to-many joins, referential integrity
- SQL requirement: team expertise, reporting tools, BI systems
- Data integrity: strict schema validation, constraints
- Mature ecosystem: extensive tooling, extensions
- Complex queries: window functions, CTEs, analytical workloads
Best for: Financial systems, e-commerce transactions, ERP, CRM, data warehousing, analytics
Both Support:
- JSON/JSONB storage and querying
- Full-text search capabilities
- Geospatial queries and indexing
- Replication and high availability
- ACID transactions (MongoDB 4.0+)
- Strong security features
Quick Start
MongoDB Setup
# Atlas (Cloud) - Recommended
# 1. Sign up at mongodb.com/atlas
# 2. Create M0 free cluster
# 3. Get connection string
# Connection
mongodb+srv://user:pass@cluster.mongodb.net/db
# Shell
mongosh "mongodb+srv://cluster.mongodb.net/mydb"
# Basic operations
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 Setup
# Ubuntu/Debian
sudo apt-get install postgresql postgresql-contrib
# Start service
sudo systemctl start postgresql
# Connect
psql -U postgres -d mydb
# Basic operations
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';
Common Operations
Create/Insert
// 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);
Read/Query
// 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;
Update
// 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';
Delete
// MongoDB
db.users.deleteOne({ name: "Bob" })
db.users.deleteMany({ status: "deleted" })
-- PostgreSQL
DELETE FROM users WHERE name = 'Bob';
DELETE FROM users WHERE status = 'deleted';
Indexing
// 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);
Reference Navigation
MongoDB References
- mongodb-crud.md - CRUD operations, query operators, atomic updates
- mongodb-aggregation.md - Aggregation pipeline, stages, operators, patterns
- mongodb-indexing.md - Index types, compound indexes, performance optimization
- mongodb-atlas.md - Atlas cloud setup, clusters, monitoring, search
PostgreSQL References
- postgresql-queries.md - SELECT, JOINs, subqueries, CTEs, window functions
- postgresql-psql-cli.md - psql commands, meta-commands, scripting
- postgresql-performance.md - EXPLAIN, query optimization, vacuum, indexes
- postgresql-administration.md - User management, backups, replication, maintenance
Python Utilities
Database utility scripts in scripts/:
- db_migrate.py - Generate and apply migrations for both databases
- db_backup.py - Backup and restore MongoDB and PostgreSQL
- db_performance_check.py - Analyze slow queries and recommend indexes
# Generate migration
python scripts/db_migrate.py --db mongodb --generate "add_user_index"
# Run backup
python scripts/db_backup.py --db postgres --output /backups/
# Check performance
python scripts/db_performance_check.py --db mongodb --threshold 100ms
Key Differences Summary
| Feature |
MongoDB |
PostgreSQL |
| Data Model |
Document (JSON/BSON) |
Relational (Tables/Rows) |
| Schema |
Flexible, dynamic |
Strict, predefined |
| Query Language |
MongoDB Query Language |
SQL |
| Joins |
$lookup (limited) |
Native, optimized |
| Transactions |
Multi-document (4.0+) |
Native ACID |
| Scaling |
Horizontal (sharding) |
Vertical (primary), Horizontal (extensions) |
| Indexes |
Single, compound, text, geo, etc |
B-tree, hash, GiST, GIN, etc |
Best Practices
MongoDB:
- Use embedded documents for 1-to-few relationships
- Reference documents for 1-to-many or many-to-many
- Index frequently queried fields
- Use aggregation pipeline for complex transformations
- Enable authentication and TLS in production
- Use Atlas for managed hosting
PostgreSQL:
- Normalize schema to 3NF, denormalize for performance
- Use foreign keys for referential integrity
- Index foreign keys and frequently filtered columns
- Use EXPLAIN ANALYZE to optimize queries
- Regular VACUUM and ANALYZE maintenance
- Connection pooling (pgBouncer) for web apps
Resources
1---2name: databases3description: MongoDB and PostgreSQL database administration. Databases: MongoDB (document store, aggregation, Atlas), PostgreSQL (relational, SQL, psql). Capabilities: schema design, query optimization, indexing, migrations, replication, sharding, backup/restore, user management, performance analysis. Actions: design, query, optimize, migrate, backup, restore, index, shard databases. Keywords: MongoDB, PostgreSQL, SQL, NoSQL, BSON, aggregation pipeline, Atlas, psql, pgAdmin, schema design, index, query optimization, EXPLAIN, replication, sharding, backup, restore, migration, ORM, Prisma, Mongoose, connection pooling, transactions, ACID. Use when: designing database schemas, writing complex queries, optimizing query performance, creating indexes, performing migrations, setting up replication, implementing backup strategies, managing database permissions, troubleshooting slow queries.4license: MIT5---67# Databases Skill89Unified guide for working with MongoDB (document-oriented) and PostgreSQL (relational) databases. Choose the right database for your use case and master both systems.1011## When to Use This Skill1213Use when:14- Designing database schemas and data models15- Writing queries (SQL or MongoDB query language)16- Building aggregation pipelines or complex joins17- Optimizing indexes and query performance18- Implementing database migrations19- Setting up replication, sharding, or clustering20- Configuring backups and disaster recovery21- Managing database users and permissions22- Analyzing slow queries and performance issues23- Administering production database deployments2425## Database Selection Guide2627### Choose MongoDB When:28- Schema flexibility: frequent structure changes, heterogeneous data29- Document-centric: natural JSON/BSON data model30- Horizontal scaling: need to shard across multiple servers31- High write throughput: IoT, logging, real-time analytics32- Nested/hierarchical data: embedded documents preferred33- Rapid prototyping: schema evolution without migrations3435**Best for:** Content management, catalogs, IoT time series, real-time analytics, mobile apps, user profiles3637### Choose PostgreSQL When:38- Strong consistency: ACID transactions critical39- Complex relationships: many-to-many joins, referential integrity40- SQL requirement: team expertise, reporting tools, BI systems41- Data integrity: strict schema validation, constraints42- Mature ecosystem: extensive tooling, extensions43- Complex queries: window functions, CTEs, analytical workloads4445**Best for:** Financial systems, e-commerce transactions, ERP, CRM, data warehousing, analytics4647### Both Support:48- JSON/JSONB storage and querying49- Full-text search capabilities50- Geospatial queries and indexing51- Replication and high availability52- ACID transactions (MongoDB 4.0+)53- Strong security features5455## Quick Start5657### MongoDB Setup5859```bash60# Atlas (Cloud) - Recommended61# 1. Sign up at mongodb.com/atlas62# 2. Create M0 free cluster63# 3. Get connection string6465# Connection66mongodb+srv://user:pass@cluster.mongodb.net/db6768# Shell69mongosh "mongodb+srv://cluster.mongodb.net/mydb"7071# Basic operations72db.users.insertOne({ name: "Alice", age: 30 })73db.users.find({ age: { $gte: 18 } })74db.users.updateOne({ name: "Alice" }, { $set: { age: 31 } })75db.users.deleteOne({ name: "Alice" })76```7778### PostgreSQL Setup7980```bash81# Ubuntu/Debian82sudo apt-get install postgresql postgresql-contrib8384# Start service85sudo systemctl start postgresql8687# Connect88psql -U postgres -d mydb8990# Basic operations91CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT, age INT);92INSERT INTO users (name, age) VALUES ('Alice', 30);93SELECT * FROM users WHERE age >= 18;94UPDATE users SET age = 31 WHERE name = 'Alice';95DELETE FROM users WHERE name = 'Alice';96```9798## Common Operations99100### Create/Insert101```javascript102// MongoDB103db.users.insertOne({ name: "Bob", email: "bob@example.com" })104db.users.insertMany([{ name: "Alice" }, { name: "Charlie" }])105```106107```sql108-- PostgreSQL109INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');110INSERT INTO users (name, email) VALUES ('Alice', NULL), ('Charlie', NULL);111```112113### Read/Query114```javascript115// MongoDB116db.users.find({ age: { $gte: 18 } })117db.users.findOne({ email: "bob@example.com" })118```119120```sql121-- PostgreSQL122SELECT * FROM users WHERE age >= 18;123SELECT * FROM users WHERE email = 'bob@example.com' LIMIT 1;124```125126### Update127```javascript128// MongoDB129db.users.updateOne({ name: "Bob" }, { $set: { age: 25 } })130db.users.updateMany({ status: "pending" }, { $set: { status: "active" } })131```132133```sql134-- PostgreSQL135UPDATE users SET age = 25 WHERE name = 'Bob';136UPDATE users SET status = 'active' WHERE status = 'pending';137```138139### Delete140```javascript141// MongoDB142db.users.deleteOne({ name: "Bob" })143db.users.deleteMany({ status: "deleted" })144```145146```sql147-- PostgreSQL148DELETE FROM users WHERE name = 'Bob';149DELETE FROM users WHERE status = 'deleted';150```151152### Indexing153```javascript154// MongoDB155db.users.createIndex({ email: 1 })156db.users.createIndex({ status: 1, createdAt: -1 })157```158159```sql160-- PostgreSQL161CREATE INDEX idx_users_email ON users(email);162CREATE INDEX idx_users_status_created ON users(status, created_at DESC);163```164165## Reference Navigation166167### MongoDB References168- **[mongodb-crud.md](references/mongodb-crud.md)** - CRUD operations, query operators, atomic updates169- **[mongodb-aggregation.md](references/mongodb-aggregation.md)** - Aggregation pipeline, stages, operators, patterns170- **[mongodb-indexing.md](references/mongodb-indexing.md)** - Index types, compound indexes, performance optimization171- **[mongodb-atlas.md](references/mongodb-atlas.md)** - Atlas cloud setup, clusters, monitoring, search172173### PostgreSQL References174- **[postgresql-queries.md](references/postgresql-queries.md)** - SELECT, JOINs, subqueries, CTEs, window functions175- **[postgresql-psql-cli.md](references/postgresql-psql-cli.md)** - psql commands, meta-commands, scripting176- **[postgresql-performance.md](references/postgresql-performance.md)** - EXPLAIN, query optimization, vacuum, indexes177- **[postgresql-administration.md](references/postgresql-administration.md)** - User management, backups, replication, maintenance178179## Python Utilities180181Database utility scripts in `scripts/`:182- **db_migrate.py** - Generate and apply migrations for both databases183- **db_backup.py** - Backup and restore MongoDB and PostgreSQL184- **db_performance_check.py** - Analyze slow queries and recommend indexes185186```bash187# Generate migration188python scripts/db_migrate.py --db mongodb --generate "add_user_index"189190# Run backup191python scripts/db_backup.py --db postgres --output /backups/192193# Check performance194python scripts/db_performance_check.py --db mongodb --threshold 100ms195```196197## Key Differences Summary198199| Feature | MongoDB | PostgreSQL |200|---------|---------|------------|201| Data Model | Document (JSON/BSON) | Relational (Tables/Rows) |202| Schema | Flexible, dynamic | Strict, predefined |203| Query Language | MongoDB Query Language | SQL |204| Joins | $lookup (limited) | Native, optimized |205| Transactions | Multi-document (4.0+) | Native ACID |206| Scaling | Horizontal (sharding) | Vertical (primary), Horizontal (extensions) |207| Indexes | Single, compound, text, geo, etc | B-tree, hash, GiST, GIN, etc |208209## Best Practices210211**MongoDB:**212- Use embedded documents for 1-to-few relationships213- Reference documents for 1-to-many or many-to-many214- Index frequently queried fields215- Use aggregation pipeline for complex transformations216- Enable authentication and TLS in production217- Use Atlas for managed hosting218219**PostgreSQL:**220- Normalize schema to 3NF, denormalize for performance221- Use foreign keys for referential integrity222- Index foreign keys and frequently filtered columns223- Use EXPLAIN ANALYZE to optimize queries224- Regular VACUUM and ANALYZE maintenance225- Connection pooling (pgBouncer) for web apps226227## Resources228229- MongoDB: https://www.mongodb.com/docs/230- PostgreSQL: https://www.postgresql.org/docs/231- MongoDB University: https://learn.mongodb.com/232- PostgreSQL Tutorial: https://www.postgresqltutorial.com/