Design Desk

Storage & Data

Databases (SQL vs NoSQL)

Why a rigid schema and joins buy correctness guarantees that a flexible, schemaless store trades away for write scale, and why most real systems end up using both.

Storage & DataFoundation5 min read

After this lesson, you should be able to:

  • Distinguish what a relational schema enforces at write time from what a NoSQL store defers to application code.
  • Explain why multi-record joins and ACID transactions are the real trade against horizontal write scale, not 'old versus new.'
  • Recognize that NoSQL doesn't eliminate schema, it moves where a bad write gets caught, insert time versus a broken read in production.
  • Identify when an access pattern, like a need for cross-record reporting joins, should override a scalability-driven database choice.

At a Glance

  • A relational database enforces structure and relationships at write time. A NoSQL store defers that enforcement to your application code, or drops it entirely.
  • The real trade isn't "old vs new." It's whether you need multi-record joins and transactions, or write throughput across many machines, more.
  • Most systems at real scale use both: relational for the data that needs strict correctness, NoSQL for the data that needs to grow past what one machine can hold.

01 The Problem

A growing e-commerce platform starts with one Postgres database holding everything: users, orders, inventory, product listings. Two problems show up as it scales. Product listings across categories don't fit one rigid table shape: electronics need "voltage" and "battery life," clothing needs "size" and "fabric," and every new category means another migration or another wall of nullable columns. Separately, a flash sale drives 50,000 writes a second at a "cart_sessions" table, and that table on a single Postgres primary becomes the bottleneck no matter how it's indexed, because writes to one table on one machine only scale so far.

Two options, both costly. Keep everything in Postgres, and you're stuck bending a rigid schema around data that doesn't want one, with a write ceiling you can't index your way past. Move it into a schemaless document store instead, and you lose the ability to join orders against inventory in one query, you're stitching that together in application code, and you've given up the guarantee that an order and its inventory decrement happen together or not at all.

Neither is free. This is the SQL vs NoSQL tension.

02 What It Is

SQL means relational: data lives in tables with a schema, columns and types, enforced at write time. Relationships between tables are foreign keys, queried with joins, and multi-table writes are usually wrapped in a transaction so they succeed or fail together. NoSQL isn't one thing, it's a family: document stores hold a flexible record per entry, key-value stores trade query flexibility for a fast lookup by key, column-family stores are built for high write throughput spread across many machines. What they share is dropping or deferring what relational databases enforce, schema, joins, strict cross-record transactions, in exchange for flexible record shape and horizontal write scale.

The trade isn't really "structure vs no structure." A NoSQL store still has a schema, it's just enforced by your application code instead of the database. That doesn't remove the cost of a schema, it moves who pays it and when the mistake gets caught: a rejected write at insert time, or a broken read in production at 2am.

In Plain Terms

A shared kitchen with a printed recipe card taped to every station forces every cook to measure the same way, in the same order, every time, and a cook who skips a step gets stopped before the dish goes out. A kitchen with no recipe cards lets a fast cook improvise and move faster on a busy night, but nothing stops two cooks from making the same dish two different ways, and nobody finds out until a customer sends one version back. Neither kitchen is wrong. They're built for different problems: one for consistency you can count on, one for speed when the rules can bend.

03 How It Works

Rendering diagram…

The relational query walks two joins to assemble one answer from three tables, each written once. The document query needs no join because the customer and item data were copied into the order document at write time, at the cost of that copy going stale if the customer's name or the item's price changes later.

04 Trade-offs

 SQL (relational)NoSQL (document / key-value)
SchemaFixed at write time; a bad write is rejected before it landsFlexible per record; a bad write lands, and the mismatch surfaces later, in application code
Multi-record consistencyACID transactions guarantee a multi-table write succeeds or fails as one unitUsually atomic only within a single document or key, not across several
Querying relationshipsJoins let you ask new questions of existing data without redesigning storageRelationships are embedded or denormalized at write time; an unanticipated query means restructuring the data
Write scaleScales vertically well; horizontally hard, writes to one table serialize through one primaryBuilt to shard writes across many machines from the start

Watch out

It's tempting to hear "NoSQL" and think "no schema, more flexible, always more scalable." NoSQL databases don't eliminate schema, they stop enforcing it at the database layer, which means your application code becomes the schema, undocumented and unchecked until a bad write actually happens. And "scalable" really means "scales writes across machines by giving up cross-record transactions," not a free upgrade with no trade-off. The honest framing is which constraint you can afford to lose, not which technology is newer.

05 Where You'll Actually See This

The payment gateway case study's own Compare section is this exact trade-off in miniature: Postgres, relational, as the durable, transactionally-safe ledger, Redis, key-value, as the fast pre-check layer in front of it. Neither replaces the other, which is the normal shape of this decision in a real system, not an either/or.

That fast layer isn't magic, it's caching: the mechanism that makes a key-value store like Redis a genuine speed win instead of just a second place to keep the same data.

The "write scale" row above also glosses over a real decision: a NoSQL store that shards writes across machines by default still has to pick what to shard by. Database sharding is that decision made explicit, the same choice you'd have to make by hand behind a relational database instead of having it built in.

How to reason about it

When asked to justify a database choice, don't reach for "NoSQL scales better." Name the specific constraint you're trading: are you giving up joins, giving up cross-record transactions, or giving up a strict schema, and what does that cost when the data doesn't fit the shape you assumed. If you can point to one query or one write pattern that actually needs what NoSQL buys you, that's a real answer.

06 Quick Check

A team picks a NoSQL document store for their new order-management system because 'it's more scalable,' then six months later needs a monthly report joining orders, customers, and refunds across the whole dataset, and finds it painful. What was the actual mistake?