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: databases-63description: Work with MongoDB (document database, BSON documents, aggregation pipelines, Atlas cloud) and PostgreSQL (relational database, SQL queries, psql CLI, pgAdmin). Use when designing database schemas, writing queries and aggregations, optimizing indexes for performance, performing database migrations, configuring replication and sharding, implementing backup and restore strategies, managing database users and permissions, analyzing query performance, or administering production databases.4license: MIT5---6
7# Databases Skill
8
9Unified guide for working with MongoDB (document-oriented) and PostgreSQL (relational) databases. Choose the right database for your use case and master both systems.
10
11## When to Use This Skill
12
13Use when:
14
15- Designing database schemas and data models
16- Writing queries (SQL or MongoDB query language)
17- Building aggregation pipelines or complex joins
18- Optimizing indexes and query performance
19- Implementing database migrations
20- Setting up replication, sharding, or clustering
21- Configuring backups and disaster recovery
22- Managing database users and permissions
23- Analyzing slow queries and performance issues
24- Administering production database deployments
25
26## Database Selection Guide
27
28### Choose MongoDB When:
29
30- Schema flexibility: frequent structure changes, heterogeneous data
31- Document-centric: natural JSON/BSON data model
32- Horizontal scaling: need to shard across multiple servers
33- High write throughput: IoT, logging, real-time analytics
34- Nested/hierarchical data: embedded documents preferred
35- Rapid prototyping: schema evolution without migrations
36
37**Best for:** Content management, catalogs, IoT time series, real-time analytics, mobile apps, user profiles
38
39### Choose PostgreSQL When:
40
41- Strong consistency: ACID transactions critical
42- Complex relationships: many-to-many joins, referential integrity
43- SQL requirement: team expertise, reporting tools, BI systems
44- Data integrity: strict schema validation, constraints
45- Mature ecosystem: extensive tooling, extensions
46- Complex queries: window functions, CTEs, analytical workloads
47
48**Best for:** Financial systems, e-commerce transactions, ERP, CRM, data warehousing, analytics
49
50### Both Support:
51
52- JSON/JSONB storage and querying
53- Full-text search capabilities
54- Geospatial queries and indexing
55- Replication and high availability
56- ACID transactions (MongoDB 4.0+)
57- Strong security features
58
59## Quick Start
60
61### MongoDB Setup
62
63```bash
64# Atlas (Cloud) - Recommended
65# 1. Sign up at mongodb.com/atlas
66# 2. Create M0 free cluster
67# 3. Get connection string
68
69# Connection
70mongodb+srv://user:pass@cluster.mongodb.net/db
71
72# Shell
73mongosh "mongodb+srv://cluster.mongodb.net/mydb"
74
75# Basic operations
76db.users.insertOne({ name: "Alice", age: 30 })
77db.users.find({ age: { $gte: 18 } })
78db.users.updateOne({ name: "Alice" }, { $set: { age: 31 } })
79db.users.deleteOne({ name: "Alice" })
80```
81
82### PostgreSQL Setup
83
84```bash
85# Ubuntu/Debian
86sudo apt-get install postgresql postgresql-contrib
87
88# Start service
89sudo systemctl start postgresql
90
91# Connect
92psql -U postgres -d mydb
93
94# Basic operations
95CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT, age INT);
96INSERT INTO users (name, age) VALUES ('Alice', 30);
97SELECT * FROM users WHERE age >= 18;
98UPDATE users SET age = 31 WHERE name = 'Alice';
99DELETE FROM users WHERE name = 'Alice';
100```
101
102## Common Operations
103
104### Create/Insert
105
106```javascript
107// MongoDB
108db.users.insertOne({ name: "Bob", email: "bob@example.com" });
109db.users.insertMany([{ name: "Alice" }, { name: "Charlie" }]);
110```
111
112```sql
113-- PostgreSQL
114INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');
115INSERT INTO users (name, email) VALUES ('Alice', NULL), ('Charlie', NULL);
116```
117
118### Read/Query
119
120```javascript
121// MongoDB
122db.users.find({ age: { $gte: 18 } });
123db.users.findOne({ email: "bob@example.com" });
124```
125
126```sql
127-- PostgreSQL
128SELECT * FROM users WHERE age >= 18;
129SELECT * FROM users WHERE email = 'bob@example.com' LIMIT 1;
130```
131
132### Update
133
134```javascript
135// MongoDB
136db.users.updateOne({ name: "Bob" }, { $set: { age: 25 } });
137db.users.updateMany({ status: "pending" }, { $set: { status: "active" } });
138```
139
140```sql
141-- PostgreSQL
142UPDATE users SET age = 25 WHERE name = 'Bob';
143UPDATE users SET status = 'active' WHERE status = 'pending';
144```
145
146### Delete
147
148```javascript
149// MongoDB
150db.users.deleteOne({ name: "Bob" });
151db.users.deleteMany({ status: "deleted" });
152```
153
154```sql
155-- PostgreSQL
156DELETE FROM users WHERE name = 'Bob';
157DELETE FROM users WHERE status = 'deleted';
158```
159
160### Indexing
161
162```javascript
163// MongoDB
164db.users.createIndex({ email: 1 });
165db.users.createIndex({ status: 1, createdAt: -1 });
166```
167
168```sql
169-- PostgreSQL
170CREATE INDEX idx_users_email ON users(email);
171CREATE INDEX idx_users_status_created ON users(status, created_at DESC);
172```
173
174## Reference Navigation
175
176### MongoDB References
177
178- **[mongodb-crud.md](references/mongodb-crud.md)** - CRUD operations, query operators, atomic updates
179- **[mongodb-aggregation.md](references/mongodb-aggregation.md)** - Aggregation pipeline, stages, operators, patterns
180- **[mongodb-indexing.md](references/mongodb-indexing.md)** - Index types, compound indexes, performance optimization
181- **[mongodb-atlas.md](references/mongodb-atlas.md)** - Atlas cloud setup, clusters, monitoring, search
182
183### PostgreSQL References
184
185- **[postgresql-queries.md](references/postgresql-queries.md)** - SELECT, JOINs, subqueries, CTEs, window functions
186- **[postgresql-psql-cli.md](references/postgresql-psql-cli.md)** - psql commands, meta-commands, scripting
187- **[postgresql-performance.md](references/postgresql-performance.md)** - EXPLAIN, query optimization, vacuum, indexes
188- **[postgresql-administration.md](references/postgresql-administration.md)** - User management, backups, replication, maintenance
189
190## Python Utilities
191
192Database utility scripts in `scripts/`:
193
194- **db_migrate.py** - Generate and apply migrations for both databases
195- **db_backup.py** - Backup and restore MongoDB and PostgreSQL
196- **db_performance_check.py** - Analyze slow queries and recommend indexes
197
198```bash
199# Generate migration
200python scripts/db_migrate.py --db mongodb --generate "add_user_index"
201
202# Run backup
203python scripts/db_backup.py --db postgres --output /backups/
204
205# Check performance
206python scripts/db_performance_check.py --db mongodb --threshold 100ms
207```
208
209## Key Differences Summary
210
211| Feature | MongoDB | PostgreSQL |
212| -------------- | -------------------------------- | ------------------------------------------- |
213| Data Model | Document (JSON/BSON) | Relational (Tables/Rows) |
214| Schema | Flexible, dynamic | Strict, predefined |
215| Query Language | MongoDB Query Language | SQL |
216| Joins | $lookup (limited) | Native, optimized |
217| Transactions | Multi-document (4.0+) | Native ACID |
218| Scaling | Horizontal (sharding) | Vertical (primary), Horizontal (extensions) |
219| Indexes | Single, compound, text, geo, etc | B-tree, hash, GiST, GIN, etc |
220
221## Best Practices
222
223**MongoDB:**
224
225- Use embedded documents for 1-to-few relationships
226- Reference documents for 1-to-many or many-to-many
227- Index frequently queried fields
228- Use aggregation pipeline for complex transformations
229- Enable authentication and TLS in production
230- Use Atlas for managed hosting
231
232**PostgreSQL:**
233
234- Normalize schema to 3NF, denormalize for performance
235- Use foreign keys for referential integrity
236- Index foreign keys and frequently filtered columns
237- Use EXPLAIN ANALYZE to optimize queries
238- Regular VACUUM and ANALYZE maintenance
239- Connection pooling (pgBouncer) for web apps
240
241## Resources
242
243- MongoDB: https://www.mongodb.com/docs/
244- PostgreSQL: https://www.postgresql.org/docs/
245- MongoDB University: https://learn.mongodb.com/
246- PostgreSQL Tutorial: https://www.postgresqltutorial.com/