Microservices Tutorial 0/47 lessons ~6 min read Lesson 9

    Database-per-Service

    Database-per-service gives each microservice private data storage — no shared tables, no cross-service SQL joins.

    Course progress0%
    Focus
    21 guided sections
    Practice signal
    Examples included
    Career prep
    Interview Q&A included

    Introduction

    Database-per-service gives each microservice private data storage — no shared tables, no cross-service SQL joins. Integration happens via APIs and events, not foreign keys across databases.

    The story

    A "microservices" rewrite kept one Postgres schema — every service queried orders JOIN users. Deployments still coupled; it was a distributed monolith. Splitting schemas forced proper APIs and cut accidental coupling.

    The business problem

    Teams that skip disciplined Database-per-Service thinking pay in coupling, outages, and failed microservices interviews:

    • Distributed ops: no tracing or health checks — hours to debug one checkout failure.
    • Coupling: shared databases and libraries recreate monolith pain across the network.
    • Deploy blast radius: one bad service deploy takes down unrelated domains.
    • Team boundaries: services aligned to tech layers instead of business capabilities.

    The problem teams faced

    This lesson addresses:

    • When and why Database-per-Service matters in decomposed architectures.
    • How to define service boundaries and contracts under interview time pressure.
    • Trade-offs vs alternatives — what staff engineers articulate in architecture reviews.
    • Production patterns and failure modes in distributed systems.

    Understanding the topic

    Core idea: Database-per-Service in microservices architecture.

    • Problem — distributed ops and coupling this topic addresses.
    • Service design — boundaries, contracts, and data ownership.
    • Trade-offs — sync vs async, consistency, deploy blast radius.
    • Interview — how this appears in decomposition loops.

    Internal architecture

    Database-per-Service — microservices view:

    text
    Order Service → orders_db (Postgres)
    User Service → users_db (Postgres)
    Catalog Svc → catalog_db (Postgres + ES index)
    Order needs user name → call User API or cache denormalized snapshot
    Never: SELECT * FROM users.orders JOIN shared schema

    Visual explanation

    Three diagrams: service architecture, decomposition process, and operational lens:

    Database-per-Service architecture
    Database-per-Service
    Entry point
    Service
    Domain logic
    Events
    Async path
    Private DB
    Data ownership
    Service view — name boundaries and data ownership in interviews.
    Database-per-Service in microservices practice
    Bounded context
    Domain boundary
    Service contract
    API + events
    Data ownership
    DB-per-service
    Resilience
    CB · timeout
    Repeat this loop for every microservices decomposition question.
    Resilience & operations
    Coupling risk
    Find first
    Isolate failure
    Bulkhead · CB
    Observe
    Traces · metrics
    Iterate
    Extract next
    Always close with failure isolation and observability at scale.

    Informative example

    Example — Database-per-Service:

    text
    OrderPlaced event carries: orderId, userId, lineItems
    Payment service stores payment records locally
    Reporting: CDC → warehouse for cross-service analytics
    Cross-service query at runtime = design smell → fix with CQRS read model

    Execution workflow

    1Database-per-Service in microservices practice
    1 / 5

    Identify bounded context

    Domain language and team ownership.

    Conway's law applies.

    Real-world use

    Netflix pioneered microservices at scale with hundreds of services and chaos engineering. Amazon's two-pizza teams and service-oriented architecture shaped modern decomposition. Uber migrated from monolith to domain-aligned services for independent deploys. Spotify uses squad-aligned microservices with internal platform tooling. These journeys inform every pattern in this course.

    Production case study

    A "microservices" rewrite kept one Postgres schema — every service queried orders JOIN users. Deployments still coupled; it was a distributed monolith. Splitting schemas forced proper APIs and cut acc…

    • Context: monolith pain or decomposition scenario from this lesson.
    • Decision: service boundary and communication choices explained.
    • Outcome: deploy frequency, incident isolation, or latency impact.

    Trade-offs

    • Pro: team autonomy and isolated failure domains.
    • Con: distributed complexity — tracing, sagas, contract tests.
    • Con: premature decomposition costs more than a modular monolith.

    Decision framework

    • Start modular monolith; extract when bounded context and team force are proven.
    • Database-per-service — integrate via API and events, not shared schema.
    • Document rejected alternatives — ADR or interview closing statement.

    Best practices

    • Align services to business capabilities, not technical layers.
    • Draw sync vs async paths; propagate trace context on every hop.
    • Health checks + readiness gates before traffic shift.

    Anti-patterns to avoid

    • Distributed monolith — shared DB, coupled deploys, synchronous chains everywhere.
    • Nano-services — operational overhead exceeds team benefit.
    • Shared libraries hiding domain coupling between teams.

    Common mistakes

    • Splitting before bounded contexts are clear — endless refactor.
    • Cross-service transactions without saga or idempotency.

    Debugging tips

    • Follow one trace_id through the decomposition diagram.
    • Ask "what couples these services?" for every sync call.

    Optimization strategies

    • Replace sync chains with domain events where latency allows.
    • BFF to aggregate calls — don't make clients orchestrate services.

    Common misconceptions

    • Microservices ≠ always better — monolith wins for small teams and unclear domains.
    • Interviews test decomposition judgment — not memorizing Netflix's service count.

    Advanced interview questions

    Interview Prep

    Practice concise answers, then expand each card for the explanation.

    3 questions
    1IntermediateQuestionHow would you decompose a monolith involving Database-per-Service?+

    Answer

    Identify bounded contexts, assign data ownership per service, choose sync vs async integration, and explain saga or eventual consistency for cross-service workflows.

    Follow-up

    Which service would you extract first and why?
    2IntermediateQuestionWhat breaks if Database-per-Service is wrong?+

    Answer

    Coupling increases — shared deploys, cascading failures, or data inconsistency across services. Name concrete failure modes and mitigations (circuit breaker, outbox, idempotency).

    Follow-up

    How do you detect this in production?
    3AdvancedQuestionSenior trade-off for Database-per-Service?+

    Answer

    Team autonomy vs operational cost; consistency vs availability across services; build vs buy for gateway, mesh, and event backbone. State when you'd keep logic in the monolith.

    Follow-up

    Migration path from current state?

    Summary

    You can explain Database-per-Service in microservices interviews and production RFCs — with bounded contexts, data ownership, and resilience patterns. Teach it back without notes.

    Ready to mark this lesson complete?Track your journey across the entire course.