36 comparisons
Comparisons

Weigh the choice. Then pick.

Side-by-side write-ups of the tools backend engineers choose between. Each page covers the same eight or so dimensions, a short decision wizard, a benchmark with a cited source, alternatives, and explicit situational picks. No vendor framing, no taste-driven rankings, just the trade-offs that matter at scale.

Also available Handbook decision pages → When-to-shard, when-to-introduce-a-queue, how-to-estimate-cost. Decision frameworks instead of head-to-heads.
PLATE — THE SHAPE OF A CHOICEFIG. I · VOL. IITwo answers. One question. Owned trade-off.vsABWEIGH · CHOOSE · DEFEND36 COMPARISONS

Jump to a category

I
Category · 7 comparisons

Databases

The store underneath. Pick by feature depth, not popularity.

Relational engines, the one decision most teams get wrong by defaulting to whatever they already know. The comparisons here weigh feature depth, replication, ecosystem reach, and cost.

Postgres vs MySQL

Postgres has the deeper feature set and the more honest engine. MySQL has the broader ecosystem and the easier replication story. New projects without strong reasons should default to Postgres.

8 dimensions · 8 scenarios · benchmark
Read

MongoDB vs Postgres

The historical answer flipped between 2018 and 2024. Postgres with JSONB now matches Mongo on document workloads while giving you SQL, joins, and transactions for free. Pick Mongo if you need its horizontal sharding out of the box; pick Postgres for almost everything else.

8 dimensions · 8 scenarios · benchmark
Read

SQL vs NoSQL

Default to a relational database. Schemas, joins, and ACID transactions are exactly what most applications need, and Postgres alone covers an enormous range. Reach for a NoSQL store when you have a specific shape it fits better: massive write throughput, a flexible/evolving document shape, or a graph/time-series access pattern that relational engines model awkwardly.

6 dimensions · 6 scenarios
Read

Supabase vs Neon

Both give you managed Postgres. Supabase wraps it in a full backend platform — auth, storage, realtime, auto-generated APIs, edge functions — so you can build an app without a separate backend. Neon focuses on the database itself, with serverless separation of storage and compute, instant branching, and scale-to-zero that makes per-PR database previews trivial. Pick Supabase for an all-in-one app backend; Neon when you want a best-in-class serverless Postgres under your own stack.

6 dimensions · 5 scenarios
Read

Cassandra vs Scylla

ScyllaDB is a ground-up C++ reimplementation of Cassandra that keeps CQL and the data model but replaces the JVM with a shard-per-core, thread-per-core architecture — usually delivering lower and more predictable tail latency on fewer, denser nodes. Cassandra is the mature original with the widest community, broadest ecosystem, and the safety of the Apache Foundation. Choose Scylla for raw per-node performance and tighter latency SLAs; choose Cassandra for ecosystem maturity and vendor-neutral governance.

6 dimensions · 5 scenarios
Read

SQLite vs DuckDB

Both are in-process, zero-config, single-file databases — the difference is the workload. SQLite is a row store tuned for transactional, point-read/write OLTP: app state, mobile, edge, embedded. DuckDB is a columnar, vectorized engine tuned for analytical OLAP: scans, aggregations, joins over large tables, and querying Parquet/CSV in place. They are complements, not rivals: SQLite stores your app’s rows; DuckDB crunches your analytics.

6 dimensions · 5 scenarios
Read

DuckDB vs ClickHouse

Both are vectorised columnar engines and both are absurdly fast on one machine. The split is the deployment model. DuckDB is a library: analytics inside your process, against files, on a laptop or a Lambda, zero servers. ClickHouse is a service: continuous ingestion, materialized rollups, and thousands of concurrent dashboard queries against a cluster that is always on. Pick the shape, not the speed.

8 dimensions · 8 scenarios
Read
II
Category · 2 comparisons

Caches

In-memory layers. Pick by data shape and persistence needs.

The thin layer between request and database. Comparisons here weigh data structures, threading, persistence, clustering, and the post-2024 license picture.

III
Category · 2 comparisons

API protocols

How services talk. Pick by audience: internal vs public.

The wire between systems. Comparisons here weigh transport, contracts, streaming, browser support, and the tooling moat that quietly decides everything.

IV
Category · 2 comparisons

Messaging

Streams or queues. Two different shapes of problem.

Distributed event logs and traditional brokers serve overlapping but distinct workloads. The comparisons here weigh throughput, replay, routing, and operational shape.

VI
Category · 2 comparisons

Frontend

UI frameworks, build tools, runtimes. The hireability axis.

Frontend stack choices weigh ecosystem reach, bundle size, developer experience, and the long-term hiring picture. Trade-offs cut differently than infrastructure.

VII
Category · 1 comparison

Edge

Reverse proxies and ingress. Pick by config model and ecosystem.

The front door to every system. Comparisons here weigh configuration model (dynamic discovery vs static file), raw performance, observability, and TLS automation.

V
Category · 1 comparison

Orchestration

Schedulers and platforms. Pick by team size and workload mix.

Cluster orchestrators decide where workloads run. The comparisons here weigh installation tax, ecosystem reach, workload-type breadth, and operational footprint.

VIII
Category · 1 comparison

Containers

Runtimes and engines. Daemon vs daemonless, root vs rootless.

The layer between your code and the kernel. Comparisons here weigh architecture (client-server vs daemonless), licensing, security defaults, and ecosystem maturity.

IX
Category · 1 comparison

Infrastructure as Code

Provisioning tools. Pick by license, ecosystem, and governance.

The tool that turns your cloud config into a repository. Comparisons here weigh license terms, vendor governance, registry depth, and the operational story for shared state.

X
Category · 1 comparison

Runtimes

JavaScript and language runtimes. Pick by maturity vs speed.

Where your code actually executes. Comparisons here weigh raw speed, npm/package compatibility, built-in toolchain, and the production maturity that operational lore demands.

XI
Category · 1 comparison

Languages

Backend languages. Pick by productivity, performance, and hiring math.

The language your team writes in shapes everything: hire pipeline, ecosystem reach, time-to-first-deploy, and the kinds of bugs you ship. Comparisons here weigh productivity, performance, ecosystem fit, and the operational story.

XII
Category · 1 comparison

Serverless

Functions-as-a-service. Pick by latency, language support, and cloud lock-in.

Compute that lives between requests. Comparisons here weigh runtime model (isolates vs microVMs), cold-start tax, geographic distribution, language coverage, and platform integration.

XIII
Category · 1 comparison

Service mesh

mTLS + policy + observability for Kubernetes. Pick by power vs simplicity.

The layer that intercepts service-to-service traffic. Comparisons here weigh data-plane footprint (Envoy vs Rust micro-proxy), control-plane complexity, multi-cluster maturity, and operational tax per pod.

Three-way · 2 comparisons

Three at once.

When the real choice is between three contenders, not two.


How these pages work

Each comparison opens with a one-line verdict, a quick-take list, a decision wizard, a side-by-side scorecard, a per-dimension deep dive, a benchmark with a cited source, alternatives for the "neither" cases, and explicit picks for specific situations.

Benchmarks are sourced from primary material — official benchmark suites, vendor whitepapers, independent retests — and retested where possible. Methodology is named in each context line. If a comparison reads as biased or out of date, tell us. Corrections usually land within a day.