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
Converted and distributed by TomeVault — claim your Tome and manage your conversions.
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. Use when this capability is needed.4---56# Databases Skill78Unified guide for working with MongoDB (document-oriented) and PostgreSQL (relational) databases. Choose the right database for your use case and master both systems.910<triggers>11<trigger>Designing database schemas and data models</trigger>12<trigger>Writing queries (SQL or MongoDB query language)</trigger>13<trigger>Building aggregation pipelines or complex joins</trigger>14<trigger>Optimizing indexes and query performance</trigger>15<trigger>Implementing database migrations</trigger>16<trigger>Setting up replication, sharding, or clustering</trigger>17<trigger>Configuring backups and disaster recovery</trigger>18<trigger>Managing database users and permissions</trigger>19<trigger>Analyzing slow queries and performance issues</trigger>20<trigger>Administering production database deployments</trigger>21</triggers>2223## Database Selection Guide2425### Choose MongoDB When:26- Schema flexibility: frequent structure changes, heterogeneous data27- Document-centric: natural JSON/BSON data model28- Horizontal scaling: need to shard across multiple servers29- High write throughput: IoT, logging, real-time analytics30- Nested/hierarchical data: embedded documents preferred31- Rapid prototyping: schema evolution without migrations3233**Best for:** Content management, catalogs, IoT time series, real-time analytics, mobile apps, user profiles3435### Choose PostgreSQL When:36- Strong consistency: ACID transactions critical37- Complex relationships: many-to-many joins, referential integrity38- SQL requirement: team expertise, reporting tools, BI systems39- Data integrity: strict schema validation, constraints40- Mature ecosystem: extensive tooling, extensions41- Complex queries: window functions, CTEs, analytical workloads4243**Best for:** Financial systems, e-commerce transactions, ERP, CRM, data warehousing, analytics4445### Both Support:46- JSON/JSONB storage and querying47- Full-text search capabilities48- Geospatial queries and indexing49- Replication and high availability50- ACID transactions (MongoDB 4.0+)51- Strong security features5253## Quick Start5455### MongoDB Setup5657<example type="usage">58<code language="bash">59# Atlas (Cloud) - Recommended60# 1. Sign up at mongodb.com/atlas61# 2. Create M0 free cluster62# 3. Get connection string6364# Connection65mongodb+srv://user:pass@cluster.mongodb.net/db6667# Shell68mongosh "mongodb+srv://cluster.mongodb.net/mydb"6970# Basic operations71db.users.insertOne({ name: "Alice", age: 30 })72db.users.find({ age: { $gte: 18 } })73db.users.updateOne({ name: "Alice" }, { $set: { age: 31 } })74db.users.deleteOne({ name: "Alice" })75</code>76</example>7778### PostgreSQL Setup7980<example type="usage">81<code language="bash">82# Ubuntu/Debian83sudo apt-get install postgresql postgresql-contrib8485# Start service86sudo systemctl start postgresql8788# Connect89psql -U postgres -d mydb9091# Basic operations92CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT, age INT);93INSERT INTO users (name, age) VALUES ('Alice', 30);94SELECT * FROM users WHERE age >= 18;95UPDATE users SET age = 31 WHERE name = 'Alice';96DELETE FROM users WHERE name = 'Alice';97</code>98</example>99100## Common Operations101102### Create/Insert103104<example type="usage">105<code language="javascript">106// MongoDB107db.users.insertOne({ name: "Bob", email: "bob@example.com" })108db.users.insertMany([{ name: "Alice" }, { name: "Charlie" }])109</code>110</example>111112<example type="usage">113<code language="sql">114-- PostgreSQL115INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');116INSERT INTO users (name, email) VALUES ('Alice', NULL), ('Charlie', NULL);117</code>118</example>119120### Read/Query121122<example type="usage">123<code language="javascript">124// MongoDB125db.users.find({ age: { $gte: 18 } })126db.users.findOne({ email: "bob@example.com" })127</code>128</example>129130<example type="usage">131<code language="sql">132-- PostgreSQL133SELECT * FROM users WHERE age >= 18;134SELECT * FROM users WHERE email = 'bob@example.com' LIMIT 1;135</code>136</example>137138### Update139140<example type="usage">141<code language="javascript">142// MongoDB143db.users.updateOne({ name: "Bob" }, { $set: { age: 25 } })144db.users.updateMany({ status: "pending" }, { $set: { status: "active" } })145</code>146</example>147148<example type="usage">149<code language="sql">150-- PostgreSQL151UPDATE users SET age = 25 WHERE name = 'Bob';152UPDATE users SET status = 'active' WHERE status = 'pending';153</code>154</example>155156### Delete157158<example type="usage">159<code language="javascript">160// MongoDB161db.users.deleteOne({ name: "Bob" })162db.users.deleteMany({ status: "deleted" })163</code>164</example>165166<example type="usage">167<code language="sql">168-- PostgreSQL169DELETE FROM users WHERE name = 'Bob';170DELETE FROM users WHERE status = 'deleted';171</code>172</example>173174### Indexing175176<example type="usage">177<code language="javascript">178// MongoDB179db.users.createIndex({ email: 1 })180db.users.createIndex({ status: 1, createdAt: -1 })181</code>182</example>183184<example type="usage">185<code language="sql">186-- PostgreSQL187CREATE INDEX idx_users_email ON users(email);188CREATE INDEX idx_users_status_created ON users(status, created_at DESC);189</code>190</example>191192## Reference Navigation193194### MongoDB References195- **[mongodb-crud.md](references/mongodb-crud.md)** - CRUD operations, query operators, atomic updates196- **[mongodb-aggregation.md](references/mongodb-aggregation.md)** - Aggregation pipeline, stages, operators, patterns197- **[mongodb-indexing.md](references/mongodb-indexing.md)** - Index types, compound indexes, performance optimization198- **[mongodb-atlas.md](references/mongodb-atlas.md)** - Atlas cloud setup, clusters, monitoring, search199200### PostgreSQL References201- **[postgresql-queries.md](references/postgresql-queries.md)** - SELECT, JOINs, subqueries, CTEs, window functions202- **[postgresql-psql-cli.md](references/postgresql-psql-cli.md)** - psql commands, meta-commands, scripting203- **[postgresql-performance.md](references/postgresql-performance.md)** - EXPLAIN, query optimization, vacuum, indexes204- **[postgresql-administration.md](references/postgresql-administration.md)** - User management, backups, replication, maintenance205206## Python Utilities207208Database utility scripts in `scripts/`:209- **db_migrate.py** - Generate and apply migrations for both databases210- **db_backup.py** - Backup and restore MongoDB and PostgreSQL211- **db_performance_check.py** - Analyze slow queries and recommend indexes212213<example type="usage">214<code language="bash">215# Generate migration216python scripts/db_migrate.py --db mongodb --generate "add_user_index"217218# Run backup219python scripts/db_backup.py --db postgres --output /backups/220221# Check performance222python scripts/db_performance_check.py --db mongodb --threshold 100ms223</code>224</example>225226## Key Differences Summary227228| Feature | MongoDB | PostgreSQL |229|---------|---------|------------|230| Data Model | Document (JSON/BSON) | Relational (Tables/Rows) |231| Schema | Flexible, dynamic | Strict, predefined |232| Query Language | MongoDB Query Language | SQL |233| Joins | $lookup (limited) | Native, optimized |234| Transactions | Multi-document (4.0+) | Native ACID |235| Scaling | Horizontal (sharding) | Vertical (primary), Horizontal (extensions) |236| Indexes | Single, compound, text, geo, etc | B-tree, hash, GiST, GIN, etc |237238## Best Practices239240**MongoDB:**241- Use embedded documents for 1-to-few relationships242- Reference documents for 1-to-many or many-to-many243- Index frequently queried fields244- Use aggregation pipeline for complex transformations245- Enable authentication and TLS in production246- Use Atlas for managed hosting247248**PostgreSQL:**249- Normalize schema to 3NF, denormalize for performance250- Use foreign keys for referential integrity251- Index foreign keys and frequently filtered columns252- Use EXPLAIN ANALYZE to optimize queries253- Regular VACUUM and ANALYZE maintenance254- Connection pooling (pgBouncer) for web apps255256<constraints>257<constraint severity="critical">Always enable authentication in production databases</constraint>258<constraint severity="critical">Never expose database ports directly to the internet</constraint>259<constraint severity="high">Always use TLS/SSL for database connections in production</constraint>260<constraint severity="high">Implement automated backups with tested restore procedures</constraint>261<constraint severity="medium">Index foreign keys in PostgreSQL to prevent full table scans on joins</constraint>262<constraint severity="medium">MongoDB $lookup has performance limitations - consider denormalization for frequent joins</constraint>263</constraints>264265## Resources266267- MongoDB: https://www.mongodb.com/docs/268- PostgreSQL: https://www.postgresql.org/docs/269- MongoDB University: https://learn.mongodb.com/270- PostgreSQL Tutorial: https://www.postgresqltutorial.com/271272---273> Converted and distributed by [TomeVault](https://tomevault.io/claim/zircote) — claim your Tome and manage your conversions.274<!-- tomevault:4.0:skill_md:2026-04-13 -->