Bỏ qua

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-servicenotification-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.md là "ổ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