ADR-0002: Database-per-service, mỗi service 1 Postgres container riêng
- Status: Accepted
- Date: ~2026-06-27 (backfilled 2026-07-25)
- Supersedes: —
- Superseded by: —
Bối cảnh
Với kiến trúc microservices (ADR-0001),
cần quyết định mô hình chia sẻ database: một Postgres instance dùng chung
nhiều database (multi-DB), hay mỗi service một Postgres container riêng.
field-service và notification-service còn dùng thêm MongoDB (Mongoose)
cho các domain phù hợp dữ liệu phi cấu trúc/linh hoạt hơn.
Quyết định
Áp dụng database-per-service: mỗi service NestJS sở hữu Postgres container
riêng (qua TypeORM, module dùng chung ở libs/database), thay vì một Postgres
instance với nhiều database. field-service/notification-service dùng thêm
MongoDB cho phần dữ liệu phù hợp document-based.
Lựa chọn khác đã cân nhắc
- Single Postgres, multi-DB (mỗi service 1 database trong cùng instance):
tiết kiệm tài nguyên hơn, nhưng dễ tạo coupling ngầm (service này lỡ query
chéo database khác) và khó reset/migrate độc lập từng service khi dev local — loại,
ghi nhận trong
docs/INFRASTRUCTURE.mdlà "ổn định hơn cho local dev, dễ reset từng service DB". - Shared schema trong 1 database: vi phạm trực tiếp nguyên tắc bounded context, service có thể vô tình đọc/ghi bảng của service khác — loại.
Hệ quả
- Được: cô lập hoàn toàn schema/data giữa các service; reset/seed/migrate từng service độc lập không ảnh hưởng service khác; dễ maps 1-1 với việc từng service có thể có PostgreSQL version/tuning riêng khi cần.
- Đánh đổi: nhiều container Postgres hơn khi dev local (tốn RAM); không có transaction xuyên service ở tầng DB — mọi phối hợp dữ liệu liên service phải qua API hoặc message (Kafka/BullMQ).
Liên kết
- Docs liên quan:
docs/DATABASE.md,docs/INFRASTRUCTURE.md,docs/requirements/05-DATABASE-SCHEMA.md - ADR liên quan: ADR-0001