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.
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
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
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
Read/Query
Update
Delete
Indexing
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
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: 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---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<triggers>12<trigger>Designing database schemas and data models</trigger>13<trigger>Writing queries (SQL or MongoDB query language)</trigger>14<trigger>Building aggregation pipelines or complex joins</trigger>15<trigger>Optimizing indexes and query performance</trigger>16<trigger>Implementing database migrations</trigger>17<trigger>Setting up replication, sharding, or clustering</trigger>18<trigger>Configuring backups and disaster recovery</trigger>19<trigger>Managing database users and permissions</trigger>20<trigger>Analyzing slow queries and performance issues</trigger>21<trigger>Administering production database deployments</trigger>22</triggers>2324## Database Selection Guide2526### Choose MongoDB When:27- Schema flexibility: frequent structure changes, heterogeneous data28- Document-centric: natural JSON/BSON data model29- Horizontal scaling: need to shard across multiple servers30- High write throughput: IoT, logging, real-time analytics31- Nested/hierarchical data: embedded documents preferred32- Rapid prototyping: schema evolution without migrations3334**Best for:** Content management, catalogs, IoT time series, real-time analytics, mobile apps, user profiles3536### Choose PostgreSQL When:37- Strong consistency: ACID transactions critical38- Complex relationships: many-to-many joins, referential integrity39- SQL requirement: team expertise, reporting tools, BI systems40- Data integrity: strict schema validation, constraints41- Mature ecosystem: extensive tooling, extensions42- Complex queries: window functions, CTEs, analytical workloads4344**Best for:** Financial systems, e-commerce transactions, ERP, CRM, data warehousing, analytics4546### Both Support:47- JSON/JSONB storage and querying48- Full-text search capabilities49- Geospatial queries and indexing50- Replication and high availability51- ACID transactions (MongoDB 4.0+)52- Strong security features5354## Quick Start5556### MongoDB Setup5758<example type="usage">59<code language="bash">60# 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</code>77</example>7879### PostgreSQL Setup8081<example type="usage">82<code language="bash">83# Ubuntu/Debian84sudo apt-get install postgresql postgresql-contrib8586# Start service87sudo systemctl start postgresql8889# Connect90psql -U postgres -d mydb9192# Basic operations93CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT, age INT);94INSERT INTO users (name, age) VALUES ('Alice', 30);95SELECT * FROM users WHERE age >= 18;96UPDATE users SET age = 31 WHERE name = 'Alice';97DELETE FROM users WHERE name = 'Alice';98</code>99</example>100101## Common Operations102103### Create/Insert104105<example type="usage">106<code language="javascript">107// MongoDB108db.users.insertOne({ name: "Bob", email: "bob@example.com" })109db.users.insertMany([{ name: "Alice" }, { name: "Charlie" }])110</code>111</example>112113<example type="usage">114<code language="sql">115-- PostgreSQL116INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');117INSERT INTO users (name, email) VALUES ('Alice', NULL), ('Charlie', NULL);118</code>119</example>120121### Read/Query122123<example type="usage">124<code language="javascript">125// MongoDB126db.users.find({ age: { $gte: 18 } })127db.users.findOne({ email: "bob@example.com" })128</code>129</example>130131<example type="usage">132<code language="sql">133-- PostgreSQL134SELECT * FROM users WHERE age >= 18;135SELECT * FROM users WHERE email = 'bob@example.com' LIMIT 1;136</code>137</example>138139### Update140141<example type="usage">142<code language="javascript">143// MongoDB144db.users.updateOne({ name: "Bob" }, { $set: { age: 25 } })145db.users.updateMany({ status: "pending" }, { $set: { status: "active" } })146</code>147</example>148149<example type="usage">150<code language="sql">151-- PostgreSQL152UPDATE users SET age = 25 WHERE name = 'Bob';153UPDATE users SET status = 'active' WHERE status = 'pending';154</code>155</example>156157### Delete158159<example type="usage">160<code language="javascript">161// MongoDB162db.users.deleteOne({ name: "Bob" })163db.users.deleteMany({ status: "deleted" })164</code>165</example>166167<example type="usage">168<code language="sql">169-- PostgreSQL170DELETE FROM users WHERE name = 'Bob';171DELETE FROM users WHERE status = 'deleted';172</code>173</example>174175### Indexing176177<example type="usage">178<code language="javascript">179// MongoDB180db.users.createIndex({ email: 1 })181db.users.createIndex({ status: 1, createdAt: -1 })182</code>183</example>184185<example type="usage">186<code language="sql">187-- PostgreSQL188CREATE INDEX idx_users_email ON users(email);189CREATE INDEX idx_users_status_created ON users(status, created_at DESC);190</code>191</example>192193## Reference Navigation194195### MongoDB References196- **[mongodb-crud.md](references/mongodb-crud.md)** - CRUD operations, query operators, atomic updates197- **[mongodb-aggregation.md](references/mongodb-aggregation.md)** - Aggregation pipeline, stages, operators, patterns198- **[mongodb-indexing.md](references/mongodb-indexing.md)** - Index types, compound indexes, performance optimization199- **[mongodb-atlas.md](references/mongodb-atlas.md)** - Atlas cloud setup, clusters, monitoring, search200201### PostgreSQL References202- **[postgresql-queries.md](references/postgresql-queries.md)** - SELECT, JOINs, subqueries, CTEs, window functions203- **[postgresql-psql-cli.md](references/postgresql-psql-cli.md)** - psql commands, meta-commands, scripting204- **[postgresql-performance.md](references/postgresql-performance.md)** - EXPLAIN, query optimization, vacuum, indexes205- **[postgresql-administration.md](references/postgresql-administration.md)** - User management, backups, replication, maintenance206207## Python Utilities208209Database utility scripts in `scripts/`:210- **db_migrate.py** - Generate and apply migrations for both databases211- **db_backup.py** - Backup and restore MongoDB and PostgreSQL212- **db_performance_check.py** - Analyze slow queries and recommend indexes213214<example type="usage">215<code language="bash">216# Generate migration217python scripts/db_migrate.py --db mongodb --generate "add_user_index"218219# Run backup220python scripts/db_backup.py --db postgres --output /backups/221222# Check performance223python scripts/db_performance_check.py --db mongodb --threshold 100ms224</code>225</example>226227## Key Differences Summary228229| Feature | MongoDB | PostgreSQL |230|---------|---------|------------|231| Data Model | Document (JSON/BSON) | Relational (Tables/Rows) |232| Schema | Flexible, dynamic | Strict, predefined |233| Query Language | MongoDB Query Language | SQL |234| Joins | $lookup (limited) | Native, optimized |235| Transactions | Multi-document (4.0+) | Native ACID |236| Scaling | Horizontal (sharding) | Vertical (primary), Horizontal (extensions) |237| Indexes | Single, compound, text, geo, etc | B-tree, hash, GiST, GIN, etc |238239## Best Practices240241**MongoDB:**242- Use embedded documents for 1-to-few relationships243- Reference documents for 1-to-many or many-to-many244- Index frequently queried fields245- Use aggregation pipeline for complex transformations246- Enable authentication and TLS in production247- Use Atlas for managed hosting248249**PostgreSQL:**250- Normalize schema to 3NF, denormalize for performance251- Use foreign keys for referential integrity252- Index foreign keys and frequently filtered columns253- Use EXPLAIN ANALYZE to optimize queries254- Regular VACUUM and ANALYZE maintenance255- Connection pooling (pgBouncer) for web apps256257<constraints>258<constraint severity="critical">Always enable authentication in production databases</constraint>259<constraint severity="critical">Never expose database ports directly to the internet</constraint>260<constraint severity="high">Always use TLS/SSL for database connections in production</constraint>261<constraint severity="high">Implement automated backups with tested restore procedures</constraint>262<constraint severity="medium">Index foreign keys in PostgreSQL to prevent full table scans on joins</constraint>263<constraint severity="medium">MongoDB $lookup has performance limitations - consider denormalization for frequent joins</constraint>264</constraints>265266## Resources267268- MongoDB: https://www.mongodb.com/docs/269- PostgreSQL: https://www.postgresql.org/docs/270- MongoDB University: https://learn.mongodb.com/271- PostgreSQL Tutorial: https://www.postgresqltutorial.com/