Context
Problem Statement
HDIM needed database isolation strategy for 29+ microservices. Shared database would create coupling; separate database servers would be expensive and complex. PostgreSQL supports multiple logical databases per instance—enabling service isolation with single infrastructure footprint.
Options Considered
Option 1: Database-per-Service (Multiple Logical Databases on Single PostgreSQL Instance)
Description: Each of 29 microservices has own logical database within single PostgreSQL 16 instance
Pros:
Cons:
Estimated Effort: 1 week setup
Risk Level: Low (proven pattern)
Option 2: Shared Database with Schema-per-Service
Description: Single database with 29 schemas, one per service
Pros:
Cons:
Risk Level: High (coupling risk)
Option 3: Separate PostgreSQL Instances per Service
Description: 29 separate PostgreSQL servers (or 3 instances × 10 services)
Pros:
Cons:
Estimated Effort: 4 weeks
Risk Level: High (operational complexity)
Decision
We chose Option 1 (Database-per-Service on Single PostgreSQL Instance) because:
Consequences
Positive
Negative
Implementation
Database Inventory (29 Total)
Core Databases:
Additional Databases (23 more):
PostgreSQL Configuration
docker-compose.yml
postgres:
image: postgres:16-alpine
environment:
POSTGRES_USER: healthdata
POSTGRES_PASSWORD: <secret>
POSTGRES_DB: template1
volumes:
- ./docker/postgres/init-multi-db.sh:/docker-entrypoint-initdb.d/init-databases.sh
ports:
- "5435:5432"
Init Script
docker/postgres/init-multi-db.sh
CREATE DATABASE fhir_db;
CREATE DATABASE patient_db;
CREATE DATABASE quality_db;
... (all 29)
GRANT ALL PRIVILEGES ON DATABASE fhir_db TO healthdata;
Success Criteria
Monitoring & Validation
Metrics
| Metric | Target |
|--------|--------|
| Database count | 29 |
| Shared tables | 0 |
| Service database isolation | 100% |
| Backup success rate | 99.9% |
References
Footer
ADR #: 004
Version: 1.0
Status: Active and Deployed
Last Updated: 2026-01-19
_Decision Date: Phase 1 (September 2025)_
_Formalized: January 2026_