| name | database-management |
| description | Database schema design, migrations, query optimization, and ORM best practices. Use for database setup, performance tuning, and data modeling. |
🗄️ Database Management Skill
Schema Design Patterns
Normalization Levels
| Level | Description | When to Use |
|---|
| 1NF | No repeating groups | Always |
| 2NF | No partial dependencies | Transactional data |
| 3NF | No transitive dependencies | Most applications |
| Denormalized | Redundant data | Read-heavy workloads |
Common Patterns
CREATE TABLE users (id SERIAL PRIMARY KEY, name VARCHAR(100));
CREATE TABLE posts (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES users(id),
content TEXT
);
CREATE TABLE tags (id SERIAL PRIMARY KEY, name VARCHAR(50));
CREATE TABLE post_tags (
post_id INTEGER REFERENCES posts(id),
tag_id INTEGER REFERENCES tags(id),
PRIMARY KEY (post_id, tag_id)
);
Migration Strategies
Prisma
npx prisma migrate dev --name add_users_table
npx prisma migrate deploy
npx prisma migrate reset
Drizzle
npx drizzle-kit generate:pg
npx drizzle-kit push:pg
Safe Migration Checklist
Query Optimization
Index Strategies
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_posts_user_date ON posts(user_id, created_at);
CREATE INDEX idx_active_users ON users(email) WHERE active = true;
Common N+1 Problem
const users = await User.findAll();
for (const user of users) {
user.posts = await Post.findAll({ where: { userId: user.id } });
}
const users = await User.findAll({
include: [{ model: Post }]
});
ORM Best Practices
| Practice | Description |
|---|
| Use Transactions | Wrap related operations |
| Connection Pooling | Reuse connections |
| Soft Deletes | Use deleted_at instead of DELETE |
| Audit Fields | Always add created_at, updated_at |
| Use Migrations | Never modify schema manually |
Backup & Recovery
pg_dump -U user -d database > backup.sql
psql -U user -d database < backup.sql
mysqldump -u user -p database > backup.sql