Database Architecture
PostgreSQL database architecture and structure. The database is managed using Drizzle ORM with automatic migrations and type-safe queries.
What You’ll Learn
Section intitulée « What You’ll Learn »This guide will help you understand:
- ✅ Database structure and main tables
- ✅ How tables are related
- ✅ Indexing strategy
- ✅ Migration management
- ✅ Query optimization
- ✅ Best practices
Overview
Section intitulée « Overview »The PostgreSQL database stores all persistent data. The schema is defined using Drizzle ORM and managed through migrations.
Structure
Section intitulée « Structure »Main Tables
Section intitulée « Main Tables »| Table | Purpose | Key Fields |
|---|---|---|
users |
User accounts | id, email, name, status |
products |
Product catalog | id, name, price, status |
orders |
Customer orders | id, status, total, date |
order_lines |
Order items | id, order_id, product_id, quantity |
storage |
Stock management | id, product_id, quantity, location |
breeding |
Breeding records | id, location_id, population |
organizations |
Organizations | id, name, type |
sessions |
User sessions | id, user_id, token, expires_at |
Relations
Section intitulée « Relations »Tables are linked by foreign keys, ensuring referential integrity:
orders→users(customer)order_lines→ordersandproductsstorage→productsbreeding→locationsandproducts
Learn more: Database Schema Documentation
Indexing
Section intitulée « Indexing »Indexes optimize query performance:
| Index Type | Use Case | Example |
|---|---|---|
| Primary Key | Unique identifiers | id columns |
| Foreign Key | Join operations | user_id, product_id |
| Composite | Multi-column queries | (status, created_at) |
| Unique | Uniqueness constraints | email, token |
| Full-text | Search operations | name, description |
Migrations
Section intitulée « Migrations »Drizzle migrations manage schema evolution:
# Generate migrations from schema changesbunx drizzle-kit generate
# Apply migrationsbunx drizzle-kit migrate
# Check migration statusbunx drizzle-kit checkBest Practices:
- Always review generated migrations
- Test migrations in development first
- Use transactions for data migrations
- Keep migrations small and focused
Query Optimization
Section intitulée « Query Optimization »Connection Pooling
Section intitulée « Connection Pooling »Connection pooling improves performance:
import { drizzle } from 'drizzle-orm/postgres-js';import postgres from 'postgres';
const connectionString = Bun.env.DATABASE_URL;const client = postgres(connectionString, { max: 20, // Maximum connections idle_timeout: 20, connect_timeout: 10,});
export const db = drizzle(client);Query Patterns
Section intitulée « Query Patterns »Use efficient query patterns:
// ✅ Good: Use indexesconst products = await db.select().from(products).where(eq(products.status, 'ACTIVE')).limit(20);
// ❌ Bad: Full table scanconst allProducts = await db.select().from(products);Quick Reference
Section intitulée « Quick Reference »| Task | Documentation |
|---|---|
| Database schema | Database Schema |
| Migrations | Drizzle Kit |
| Query helpers | Drizzle Query Library |
Next Steps
Section intitulée « Next Steps »Continue learning:
- 📊 Data Flow - Data flow patterns
- 📈 Scalability - Scalability strategies
- 📋 Database Schema - Complete schema documentation
- 🛠️ Drizzle Query Library - Query helpers
Related Topics
Section intitulée « Related Topics »- Data Flow - Data flow patterns
- Scalability - Scalability strategies
- Database Schema - Complete schema documentation
- Architecture Overview - System architecture