Overview
The database uses a migration-based approach for managing schema changes over time. Migration files are stored in thesource/DB/Migrations/ directory.
Migration Strategy
File-Based Migrations
Each migration is a standalone SQL file that can be executed independently:Naming Convention
Migration files follow a descriptive naming pattern:add_{feature}- Adds new functionalityinsert_{data}- Seeds or inserts datamigrate_{entity}- Data migration from legacy system- No timestamps in filenames (execution order managed manually)
Migration Types
Feature Additions
Feature Additions
Migrations that add new modules or features to the system.Key Features:
Example: add_reminders_module.sql
- Uses
WHERE NOT EXISTSto make migrations idempotent - Includes verification query at the end
- Grants permissions to appropriate roles
Schema Modifications
Schema Modifications
Migrations that alter existing table structures.Best Practices:
Example: add_public_name_to_users.sql
- Use
IF NOT EXISTSclauses - Provide default values or update existing records
- Create helper functions when needed
Data Seeding
Data Seeding
Migrations that insert reference or configuration data.Key Points:
Example: insert_sla_policies.sql
- Uses
ON CONFLICTfor upsert behavior - Defines SLA timelines as PostgreSQL intervals
- Updates existing policies if schema changes
Data Migration from Legacy Systems
Data Migration from Legacy Systems
Migrations that transform and import data from old database schemas.Migration Patterns:
Example: migrate_data_customers.sql
- Maps old column names to new schema
- Handles NULL values with
NULLIFandCOALESCE - Uses
ON CONFLICT DO NOTHINGfor idempotency - Preserves original IDs when possible
Table Creation
Table Creation
Execution Order
Migrations should generally be executed in this order:- Schema modifications - ALTER TABLE statements
- Table creation - New tables and indexes
- Data seeding - Reference data and catalogs
- Feature additions - Module and permission setup
- Data migrations - Import from legacy systems
Idempotency
All migrations should be idempotent (safe to run multiple times):Table/Column Creation
Data Insertion
Function/Trigger Creation
Running Migrations
Manual Execution
Migrations are typically run manually via psql:Batch Execution
For multiple migrations:Rollback Strategy
While migrations don’t include automatic rollback scripts, you can create reverse migrations:Best Practices
Test First
Always test migrations on a development/staging database before production.
Make Idempotent
Use
IF NOT EXISTS, ON CONFLICT, and WHERE NOT EXISTS clauses.Document Changes
Include comments explaining why the migration is needed.
Backup Data
Take a database backup before running migrations in production.
Version Control
Migration files are version controlled in the Git repository:- What the migration does
- Why it’s needed
- Any dependencies or prerequisites
Migration Tracking
Consider creating a migration tracking table:Next Steps
Seeding Data
Learn about initial data setup
Table Schemas
View complete table definitions