Aller au contenu

Database Architecture

PostgreSQL database architecture and structure. The database is managed using Drizzle ORM with automatic migrations and type-safe queries.

This guide will help you understand:

  • ✅ Database structure and main tables
  • ✅ How tables are related
  • ✅ Indexing strategy
  • ✅ Migration management
  • ✅ Query optimization
  • ✅ Best practices

The PostgreSQL database stores all persistent data. The schema is defined using Drizzle ORM and managed through migrations.

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

Tables are linked by foreign keys, ensuring referential integrity:

  • orders → users (customer)
  • order_lines → orders and products
  • storage → products
  • breeding → locations and products

Learn more: Database Schema Documentation

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

Drizzle migrations manage schema evolution:

Fenêtre de terminal
# Generate migrations from schema changes
bunx drizzle-kit generate
# Apply migrations
bunx drizzle-kit migrate
# Check migration status
bunx drizzle-kit check

Best Practices:

  • Always review generated migrations
  • Test migrations in development first
  • Use transactions for data migrations
  • Keep migrations small and focused

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);

Use efficient query patterns:

// ✅ Good: Use indexes
const products = await db.select().from(products).where(eq(products.status, 'ACTIVE')).limit(20);
// ❌ Bad: Full table scan
const allProducts = await db.select().from(products);
Task Documentation
Database schema Database Schema
Migrations Drizzle Kit
Query helpers Drizzle Query Library

Continue learning:

  1. 📊 Data Flow - Data flow patterns
  2. 📈 Scalability - Scalability strategies
  3. 📋 Database Schema - Complete schema documentation
  4. 🛠️ Drizzle Query Library - Query helpers