Database Options // Reference

Every database family worth knowing, what each is actually for, and the honest trade-offs. Ordered from the smallest thing that could work up to the largest. Most projects need fewer databases than they think.

How to choose

Nine out of ten projects end at row one or two of this table. Read top to bottom and stop at the first row that fits.

DatabaseReach for it when…Why
SQLiteLocal app, one machine, data fits on diskZero setup, one file, ships inside your program
DuckDBAnalysis over CSV/Parquet, one machineColumnar speed without a server
PostgreSQLReal app, many users, needs to be correctThe default answer; does JSON, geo, search and vectors too
Redis / ValkeyCache, sessions, queues, rate limitsMicrosecond reads, purpose-built data structures
ClickHouseBillions of rows, dashboard queries in msColumnar OLAP built for scans and aggregates
TimescaleDB / VictoriaMetricsMetrics, sensors, logs with timestampsTime-partitioning and downsampling built in
Meilisearch / OpenSearchFull-text search with ranking and facetsInverted index, typo tolerance, relevance tuning
pgvector, then QdrantSemantic / embedding search (RAG)Start in the DB you already run; graduate if scale demands
Neo4jRelationships are the query (paths, hops)Traversal cost does not grow with total data size
Cassandra / ScyllaDBWrite volume exceeds one machine, always-onMasterless, linear write scaling, survives node loss
CockroachDBGlobal app, SQL, no downtime allowedDistributed SQL with real transactions across regions
The honest default. If you are unsure: SQLite for anything single-machine, PostgreSQL for anything with a network. Postgres absorbs the jobs of a document store, a search index, a geospatial DB, a queue, and a vector DB through extensions. Adding a second database is a cost — new backups, new failure mode, new consistency question — so make it earn its place.

The data models

Product names come and go; there are only a handful of underlying shapes. Know the shape and the product list becomes short.

ModelShape of dataBest atBad at
RelationalTables, rows, foreign keysCorrectness, joins, constraints, ad-hoc questionsDeeply nested or wildly variable records
Key-valueKey → opaque blobSpeed, simplicity, cachingAny query that isn't "get by key"
DocumentNested JSON per recordVariable schemas, whole-object readsCross-document joins, multi-doc integrity
Wide-columnPartition key → sorted columnsMassive write throughput, known access pathsAd-hoc queries, joins, aggregates
GraphNodes and edges, both with propertiesMulti-hop traversal, paths, network shapeBulk aggregates, scans over everything
Columnar / OLAPTables stored column by columnScanning billions of rows, aggregatesSingle-row updates and deletes
VectorFloat arrays + ANN indexSimilarity by meaning, not keywordExact filtering, precise recall guarantees

Row-store vs column-store is the split that explains most performance surprises. Row-stores (SQLite, Postgres, MySQL) keep a record together, so "fetch order #48219" is one read — great for transactions. Column-stores (DuckDB, ClickHouse, Parquet) keep each column together, so "average of one column over 2 billion rows" only touches that column — great for analytics, painful for row-at-a-time updates.

Embedded & file-based

No server process. The database is a library linked into your program and a file (or a few) on disk. Fastest possible setup, and often all you need.

SQLite 3

RelationalPublic domain

A full SQL relational engine in a single ~1 MB library, storing the whole database in one portable file. The most deployed database on earth — it is inside every phone, browser, and OS. Transactional (ACID), no daemon, no config, no network.

Pros
  • Zero administration; the DB is one file you can copy or email
  • Genuinely fast — beats a network DB for local reads
  • Rock-solid, exhaustively tested, stable file format
  • Built into Python, PHP, Android, iOS, browsers
  • WAL mode gives many concurrent readers
Cons
  • One writer at a time — not for write-heavy multi-user apps
  • No network access; the file must be local (never on NFS/SMB)
  • Loose typing by default; strict tables are opt-in
  • Thin ALTER TABLE, no built-in users or permissions
  • Row-store, so wide analytical scans are slow
Use when the data is for one machine, one app, or one person: desktop tools, CLI tools, mobile apps, caches, catalogs, test fixtures, and any "source of truth" file you want to hand someone as a single artifact.

DuckDB

Columnar OLAPMIT

"SQLite for analytics." Same embedded, single-file, no-server model, but stored column-wise with a vectorized engine. Queries CSV, JSON, Parquet, and remote S3 files directly in place, with no import step, and joins them against its own tables.

Pros
  • Enormous analytical speed on one laptop — often beats a cluster
  • Reads CSV/Parquet/JSON/Arrow in place, no ETL
  • Excellent, modern SQL dialect (QUALIFY, list ops, friendly errors)
  • Drops into Python/R next to pandas and Polars
  • Larger-than-memory queries spill to disk gracefully
Cons
  • Wrong tool for OLTP — many small concurrent writes are slow
  • Single-process writer; not a shared multi-user server
  • Young by DB standards; file format has churned across versions
  • No built-in replication, auth, or high availability
Use when you are analyzing data rather than serving an app: ad-hoc exploration, notebooks, dashboards over static exports, log/report crunching, or as the engine that builds a static site from a pile of files.

Berkeley DB

Key-valueAGPL / commercial

The original embedded key-value store (1991, now Oracle). Byte-string key to byte-string value, with B-tree, hash, and queue access methods, transactions and replication. Still buried in mail servers, LDAP directories, and package managers.

Pros
  • Extremely mature and fast for pure get/put workloads
  • Transactions and replication in an embedded library
  • Tiny footprint, decades of production hardening
Cons
  • License moved to AGPL in 2013 — a hard blocker for many products
  • No query language: you write all access paths yourself
  • Effectively legacy; new projects pick LMDB or RocksDB
Use when you are maintaining something that already uses it. For new work, choose LMDB (read-heavy) or RocksDB (write-heavy) instead.

LMDB

Key-valueOpenLDAP

A memory-mapped B+tree key-value store in about 10k lines of C. Readers never block and never lock; the OS page cache does the caching. Copy-on-write means it cannot corrupt on crash.

Pros
  • The fastest read path of any embedded store
  • Crash-proof by design, no recovery step on restart
  • Tiny, dependency-free, ACID transactions
Cons
  • Single writer; write throughput is modest
  • Fixed max map size you must set up front
  • Sparse tooling; no query layer at all
Use when you need a blazing read-mostly local index — model weights, caches, embeddings stores, search sidecars.

RocksDB / LevelDB

Key-valueApache 2.0 / BSD

Log-structured merge-tree (LSM) key-value engines from Facebook and Google. Writes land in memory and are flushed in sorted batches, so ingest is very fast. Rarely used directly — they are the storage layer inside Kafka Streams, TiDB, and many others.

Pros
  • Huge write throughput, good compression
  • Deeply tunable, proven at enormous scale
  • Ordered keys enable efficient range scans
Cons
  • Dozens of knobs; bad tuning means write stalls
  • Background compaction costs CPU and disk
  • Read latency less predictable than a B-tree
Use when you are building a database or a stateful stream processor and need a storage engine, not when you need an application database.

LanceDB

Embedded vectorApache 2.0

Embedded, file-based vector database on the Lance columnar format. Same "just a directory of files" model as SQLite/DuckDB but tuned for embeddings plus metadata, with versioning and local or S3 storage.

Pros
  • No server; drop a RAG index next to your app
  • Stores vectors and the original data together
  • Versioned tables, works straight off object storage
Cons
  • Young, moving fast, smaller community
  • Single-writer, not a multi-tenant service
  • Fewer filtering and hybrid-search features than Qdrant
Use when you want local semantic search without running another service.

H2 / Apache Derby / HSQLDB

Embedded SQL (JVM)MPL / Apache 2.0

Embedded SQL databases written in Java, running inside the JVM process. Their real job is testing: stand up a database in a unit test with no external service.

Pros
  • Pure Java, starts in milliseconds, in-memory mode
  • Partial Postgres/Oracle compatibility modes
  • Perfect for integration tests and demos
Cons
  • JVM-only; useless outside Java/Kotlin/Scala
  • Compatibility modes leak — tests pass, production fails
  • Not built for production scale
Use when you are on the JVM and want a throwaway DB in tests. Prefer a real Postgres in a container if the test touches SQL you rely on.

BoltDB / bbolt / BadgerDB

Embedded KV (Go)MIT / Apache 2.0

Pure-Go embedded key-value stores. Bolt (and its maintained fork bbolt) is a memory-mapped B+tree in the LMDB tradition; Badger is the LSM alternative for write-heavy work. Both compile straight into a Go binary with no CGO.

Pros
  • Single static binary — nothing to install alongside your app
  • ACID transactions, simple bucket API
  • bbolt is what etcd and Consul store data in
Cons
  • Go only; no query language, no indexes you did not build
  • Bolt is single-writer and slow on random writes
  • Original BoltDB is archived — use bbolt
Use when you are shipping a Go service or CLI that needs local persistent state without a dependency.

ObjectBox / Realm

Embedded object DBApache 2.0 / commercial

Mobile-first embedded databases that store language objects directly instead of rows, skipping the object-relational mapping step. Realm (now MongoDB Atlas Device SDK) adds device-to-cloud sync.

Pros
  • No ORM layer; objects persist as-is
  • Very fast on phones, low battery cost
  • Live queries that update the UI automatically
Cons
  • Proprietary formats — data is not portable like a SQLite file
  • Realm's roadmap follows MongoDB's commercial interests
  • Schema migrations are more awkward than SQL
Use when building a mobile app where object mapping is the pain point. SQLite (via Room/GRDB) is still the safer default.

libSQL / Turso & Cloudflare D1

Distributed SQLiteMIT / proprietary service

SQLite reimagined for the network age. libSQL is an open fork adding replication and a server mode; Turso and Cloudflare D1 host it at the edge so each region reads from a local replica.

Pros
  • SQLite semantics and dialect, but reachable over HTTP
  • Read replicas at the edge give very low read latency
  • Cheap; database-per-tenant becomes practical
Cons
  • Writes still funnel through a single primary
  • Young platforms; you are trusting a vendor's uptime
  • Size limits per database on the hosted tiers
Use when you want SQLite's simplicity for a deployed web app, especially edge-hosted or one-database-per-customer designs.

Relational servers

Client/server SQL databases: the workhorse category. Strong consistency, joins, constraints, transactions, and decades of tooling.

PostgreSQL

RelationalPostgreSQL license

The most capable open-source relational database, and the correct default for almost any server-side application. Full ACID, rich SQL, and an extension system that lets it also do geospatial (PostGIS), time-series (TimescaleDB), vectors (pgvector), graph (Apache AGE), and full-text search without a second product.

Pros
  • Correctness first; the semantics rarely surprise you
  • Extensions cover most specialty databases well enough
  • Excellent JSONB support — document store when you need one
  • Strong types, CTEs, window functions, partial & expression indexes
  • Permissive license, no vendor, hosted everywhere
Cons
  • Needs tuning and monitoring: vacuum, bloat, connection limits
  • Each connection is a process — use PgBouncer at scale
  • Scales up well, scales out only with extra machinery
  • Major-version upgrades take planning
  • Row-store: not a substitute for a real OLAP engine at billions of rows
Use when anything talks to it over a network and the data matters. Web apps, APIs, SaaS, internal tools, anything with money or users in it.

MySQL / MariaDB

RelationalGPL v2 (dual) / GPL v2

The other giant of open-source SQL, and the engine behind most of the classic web stack. Simple replication, huge hosting support. MariaDB is the community fork, kept free of Oracle's dual-licensing.

Pros
  • Ubiquitous — every host, every framework, every tutorial
  • Very fast simple reads; straightforward replication
  • Enormous operational knowledge base
Cons
  • Weaker SQL than Postgres (analytics, types, extensibility)
  • Historic loose-typing and silent-coercion gotchas
  • Oracle stewardship of MySQL; the ecosystem is split
  • Thinner extension story — specialty work needs another DB
Use when a platform expects it (WordPress, older PHP apps, many managed stacks) or your team already runs it well. For a greenfield project, Postgres is the stronger pick.

Microsoft SQL Server

RelationalCommercial (free Express/Developer)

Microsoft's enterprise relational database. Superb tooling, a mature optimizer, and first-class integration with .NET, Active Directory, Power BI, and Azure.

Pros
  • Best-in-class management tooling and profiler
  • Strong optimizer, columnstore indexes, in-memory OLTP
  • Windows/.NET/Azure integration is seamless
Cons
  • Expensive, licensed per core
  • Vendor lock-in; T-SQL is not portable
  • Heavier to run and to automate than Postgres
Use when you are a Microsoft shop, or an existing system, report stack, or compliance requirement already demands it.

Oracle Database

RelationalCommercial

The high end of enterprise relational: extreme reliability features, RAC clustering, partitioning, and the deepest optimizer in the business. Also the most expensive and the most audited license in software.

Pros
  • Handles the largest, most demanding single-instance workloads
  • Unmatched HA/DR features and PL/SQL maturity
  • Ubiquitous in banking, telecom, government ERP
Cons
  • Cost is severe and license audits are a real risk
  • Needs specialist DBAs
  • Total lock-in; migrating away is a multi-year project
Use when you inherited it or a contract requires it. Nobody chooses Oracle for a new project on technical merit alone.

Firebird

RelationalIPL / IDPL

Descendant of Borland InterBase. Small, embeddable or server-mode, ACID, with a single-file database. A quieter middle ground between SQLite and Postgres.

Pros
  • Runs embedded or client/server from the same file
  • Very low resource use; simple to deploy in appliances
  • Real stored procedures and multi-user concurrency
Cons
  • Small community; hiring and tooling are hard
  • Few managed hosting options
  • Lags on modern SQL features
Use when you ship a desktop or kiosk product that needs multi-user SQL locally without installing a server stack.

Microsoft Access / FileMaker Pro

Desktop database + UICommercial

Database and application builder in one: tables, forms, reports, and a GUI, aimed at non-programmers. Access uses the Jet/ACE engine in an .accdb file; FileMaker is the cross-platform equivalent.

Pros
  • A working data-entry app in an afternoon with no code
  • Reports and forms included; familiar to office staff
Cons
  • Falls apart past a handful of concurrent users or ~2 GB
  • File corruption on a network share is a classic failure
  • Hard to version, test, or migrate away from
Use when a small team needs a form-driven internal tool now and nobody will be writing code. Plan the exit to SQL Server or Postgres early.

Distributed SQL (NewSQL)

SQL semantics and real transactions, spread over many nodes. You get horizontal scale and survive-a-node-loss without giving up joins — at the price of higher latency per transaction and much more operational surface.

CockroachDB

Distributed SQLBSL → Apache after 3y

Postgres-wire-compatible SQL that shards and replicates itself automatically across nodes and regions, with serializable transactions. Designed to survive machine, rack, and region failure without operator action.

Pros
  • Speaks the Postgres protocol — most drivers just work
  • Survives node/AZ/region loss with no failover script
  • Data can be pinned per-region for residency laws
  • Scales writes by adding nodes
Cons
  • Cross-node consensus adds latency to every write
  • Postgres compatible, not Postgres — extensions do not port
  • Expensive to run; needs at least three nodes to mean anything
  • Source-available license, not true open source
Use when downtime is genuinely unacceptable or users are spread across continents. Otherwise a well-run Postgres with a replica is simpler and faster.

YugabyteDB

Distributed SQLApache 2.0

Distributed SQL that reuses the actual PostgreSQL query layer on top of a sharded, replicated storage engine, so compatibility is closer than most rivals. Also offers a Cassandra-style API.

Pros
  • Reuses real Postgres code — high compatibility
  • Fully Apache-licensed
  • Two APIs (SQL and wide-column) on one storage layer
Cons
  • Same distributed write latency cost
  • Smaller community than Cockroach or Postgres
  • Operationally complex; tuning knowledge is scarce
Use when you want distributed SQL and Postgres fidelity under a permissive license.

TiDB

Distributed SQL / HTAPApache 2.0

MySQL-compatible distributed SQL with a companion columnar store (TiFlash), so the same cluster serves transactions and analytics — "HTAP" — without a separate pipeline.

Pros
  • MySQL wire compatible; scales writes horizontally
  • Row and column replicas kept in sync automatically
  • Removes a whole ETL stage for many teams
Cons
  • Many moving parts (TiKV, PD, TiDB, TiFlash) to operate
  • Heavy resource footprint
  • Analytics still slower than a dedicated ClickHouse
Use when you have outgrown a single MySQL and want to keep the dialect while adding scale and live analytics.

Google Cloud Spanner

Managed distributed SQLProprietary (GCP)

The system that created this category: globally distributed, externally consistent SQL using atomic-clock-backed timestamps. Fully managed only.

Pros
  • Global strong consistency with five-nines availability
  • No operations work at all; scales transparently
  • Battle-proven at Google scale
Cons
  • Costly, with a real floor price even when idle
  • Total GCP lock-in
  • Schema and query restrictions vs. plain Postgres
Use when you are already on GCP and need global consistency more than you need cost control.

Vitess / PlanetScale

MySQL sharding layerApache 2.0 / SaaS

A sharding and connection-pooling layer in front of real MySQL servers, built at YouTube. Applications see one MySQL; Vitess routes queries to the right shard. PlanetScale is the managed version, with branching workflows for schema changes.

Pros
  • Scales MySQL horizontally without rewriting the app
  • Online schema changes with no locking
  • Proven at extreme scale (YouTube, Slack, GitHub)
Cons
  • Cross-shard joins and transactions are limited
  • Substantial operational complexity if self-hosted
  • Foreign keys are discouraged or unsupported
Use when a single MySQL has run out of headroom and you want to keep MySQL rather than migrate to a new engine.

Analytical / OLAP engines

Column-oriented engines built to scan enormous tables and return aggregates fast. They trade away cheap single-row updates to get it.

ClickHouse

Columnar OLAPApache 2.0

The fastest widely-available open-source analytical database. Ingests millions of rows per second and answers aggregate queries over billions of rows in well under a second. Powers most "real-time analytics" products you have used.

Pros
  • Exceptional scan and aggregate performance
  • Very high compression — storage cost drops hard
  • Materialized views compute rollups on ingest
  • Runs fine on one big box before you ever cluster it
Cons
  • Updates and deletes are expensive and asynchronous
  • Weak transactions; not for OLTP or anything with money in it
  • Joins are second-class — you denormalize instead
  • Schema/index design mistakes are hard to undo later
Use when you serve dashboards, product analytics, log/event analysis, or observability data that keeps growing and is mostly append-only.

Apache Druid

Real-time OLAPApache 2.0

Columnar store designed for streaming ingest and sub-second slice-and-dice over time-partitioned event data, with high query concurrency.

Pros
  • Ingests from Kafka and is queryable within seconds
  • Handles thousands of concurrent dashboard users
  • Automatic time partitioning and rollup
Cons
  • Many separate node types; heavy to operate
  • Join support is limited
  • ClickHouse usually matches it with far less complexity
Use when you need streaming ingest plus very high concurrency on user-facing analytics.

Apache Pinot

Real-time OLAPApache 2.0

Built at LinkedIn for user-facing analytics at millisecond latency — the engine behind "who viewed your profile" style features.

Pros
  • Lowest-latency tier for high-QPS analytical lookups
  • Rich indexing (star-tree, inverted, range)
  • Real-time and batch ingestion together
Cons
  • Significant cluster complexity
  • Narrow SQL surface
  • Overkill unless you truly serve analytics to end users
Use when analytics are a customer-facing feature with strict latency budgets at high request rates.

Trino / Presto

Query engineApache 2.0

Not a database — a distributed SQL engine that queries data where it already lives: S3 files, Postgres, Kafka, MongoDB, and more, joining across them in one query.

Pros
  • One SQL surface over many disconnected systems
  • No data movement or duplication required
  • Scales out for very large ad-hoc scans
Cons
  • Stores nothing — performance is hostage to the sources
  • Cluster to run and tune; memory-hungry
  • Slower than ClickHouse or DuckDB on a single dataset
Use when data is scattered across systems and you need to federate queries rather than consolidate storage.

MonetDB

Columnar OLAPMPL 2.0

The research pioneer of column-store databases and the ancestor of much of what DuckDB and ClickHouse do today. Still solid for academic and mid-size analytics.

Pros
  • Full SQL with genuine column-store performance
  • Lightweight compared to cluster engines
Cons
  • Small community, thin tooling
  • Largely superseded by DuckDB for single-node work
Use when you specifically want a server-mode single-node column store with full SQL. Otherwise reach for DuckDB.

StarRocks / Apache Doris

Columnar OLAPApache 2.0

MySQL-protocol columnar engines aimed squarely at ClickHouse, but with genuinely good join performance — so you can keep a normalized star schema instead of denormalizing everything.

Pros
  • Fast multi-table joins, unusual for this category
  • Speaks MySQL wire protocol; any BI tool connects
  • Real-time upserts via primary-key tables
Cons
  • Smaller Western community; docs lag the code
  • Cluster to operate (FE/BE nodes)
  • Raw single-table scan speed still trails ClickHouse
Use when you want ClickHouse-class analytics but your model really needs joins.

SingleStore

HTAPCommercial

MySQL-compatible database holding both rowstore and columnstore tables, so one system serves transactions and analytics on live data.

Pros
  • Genuinely fast at both OLTP and OLAP
  • Removes the ETL delay between app and dashboard
  • Distributed, MySQL-compatible
Cons
  • Commercial licensing, memory-hungry
  • Beaten by specialists at either end
Use when the business needs analytics on data that is seconds old and you would rather buy one system than run two.

Vertica / Greenplum / Exasol

MPP warehouseCommercial / Apache 2.0

The previous generation of on-premise massively-parallel warehouses. Greenplum is Postgres-derived and open source; Vertica and Exasol are commercial and very fast.

Pros
  • Mature optimizers and full SQL, including window-heavy analytics
  • Run in your own datacenter — no cloud dependency
Cons
  • Fixed cluster sizing; storage and compute are coupled
  • Losing ground to cloud warehouses and ClickHouse
  • Licensing and hardware costs are significant
Use when data must stay on-premise and you need warehouse-grade SQL over tens of terabytes.

Cloud data warehouses

Managed, separate-storage-from-compute analytics platforms. You pay per query or per second of compute instead of running servers.

Snowflake

Managed warehouseProprietary SaaS

The reference cloud warehouse: independent compute "warehouses" over shared storage, so teams do not contend, plus zero-copy cloning and time travel.

Pros
  • No infrastructure to manage; scales instantly
  • Zero-copy clones and time travel make dev environments trivial
  • Strong governance, sharing, and multi-cloud support
Cons
  • Costs escalate quietly; needs active FinOps discipline
  • Vendor lock-in on features and SQL extensions
  • Latency floor makes it unsuited to user-facing queries
Use when an organization needs a governed central warehouse and would rather buy than operate.

Google BigQuery

Managed warehouseProprietary (GCP)

Serverless warehouse with no cluster concept at all — submit SQL, pay for bytes scanned or reserved slots. Excellent for petabyte-scale ad-hoc work and GA4 data.

Pros
  • Truly serverless; nothing to size or start
  • Handles enormous scans without tuning
  • Built-in ML, geospatial, and streaming ingest
Cons
  • Per-byte pricing punishes SELECT * habits
  • GCP lock-in; egress costs to leave
  • Seconds-level latency, not for app queries
Use when you are on GCP, or need to query huge datasets occasionally without owning any infrastructure.

Amazon Redshift

Managed warehouseProprietary (AWS)

AWS's warehouse, Postgres-derived, now with a serverless mode and Spectrum for querying S3 directly.

Pros
  • Deep AWS integration (S3, Glue, IAM, QuickSight)
  • Familiar Postgres-ish SQL
  • Predictable cost on reserved clusters
Cons
  • Classic clusters need vacuum/distkey/sortkey babysitting
  • Concurrency limits bite sooner than Snowflake
  • Aging architecture relative to competitors
Use when you are committed to AWS and the data already lives in S3.

Databricks SQL / Delta Lake

LakehouseProprietary + Apache 2.0 format

Spark-based lakehouse: analytics and machine learning over open table formats in object storage, with a SQL warehouse layer on top.

Pros
  • One platform for ETL, ML, and BI
  • Open storage format — data is not trapped
  • Handles unstructured and streaming data well
Cons
  • Complex and expensive; Spark expertise required
  • Cold-start delays on clusters
  • Overkill for anything a single node could analyze
Use when data engineering and ML teams share one very large data estate.

Key-value stores & caches

Get and put by key, in microseconds. The simplest model, and the one that scales most easily — because it refuses to do anything complicated.

Redis / Valkey

In-memory KVRSALv2/SSPL — Valkey is BSD

In-memory data-structure server: strings, hashes, lists, sets, sorted sets, streams, HyperLogLogs, geo indexes, pub/sub. Sub-millisecond, with optional disk persistence. Valkey is the Linux Foundation fork created after Redis changed license.

Pros
  • Extremely fast; the standard cache layer
  • Data structures solve real problems: leaderboards, rate limits, queues, locks
  • Simple to run, tiny config surface
  • Pub/sub and streams for lightweight messaging
Cons
  • Dataset must fit in RAM — expensive per GB
  • Persistence is best-effort; treat it as a cache, not a system of record
  • Single-threaded core for commands; one slow command blocks everything
  • Clustering adds real constraints on multi-key operations
  • Licensing split — check which fork you are installing
Use when you need caching, sessions, rate limiting, job queues, locks, or ephemeral counters. Not as your only copy of anything.

Memcached

In-memory cacheBSD

A pure multi-threaded memory cache. No data structures, no persistence, no clustering — just key to blob, and it never pretends otherwise.

Pros
  • Multi-threaded; scales across cores better than Redis for plain caching
  • Extremely simple and predictable memory behavior
Cons
  • No persistence, no replication, no data types
  • Redis does this job plus much more
Use when you want the plainest possible cache in front of a database and nothing else.

Amazon DynamoDB

Managed KV / documentProprietary (AWS)

Fully managed key-value and document store with single-digit-millisecond latency at any scale, priced per request. You design the table around your access patterns before you write a line of code.

Pros
  • Effectively unlimited scale with zero operations
  • Predictable latency regardless of table size
  • On-demand pricing scales to near zero when idle
  • Streams give you change-data-capture for free
Cons
  • Access patterns must be known up front; ad-hoc queries are painful
  • No joins; you denormalize aggressively
  • Costs surprise on scan-heavy or hot-key workloads
  • Total AWS lock-in
Use when you are on AWS with well-understood, high-volume access patterns — carts, sessions, device state, event stores.

etcd / Consul

Coordination KVApache 2.0 / BUSL

Strongly consistent (Raft) key-value stores for configuration, service discovery, leader election, and distributed locks. etcd is what Kubernetes stores its state in.

Pros
  • Linearizable reads and reliable watches on key changes
  • Purpose-built for coordination primitives
Cons
  • Small data only — megabytes, not gigabytes
  • Every write costs a consensus round; low throughput
  • Catastrophically misused as an application database
Use when services need to agree on configuration or elect a leader. Never for user data.

Riak KV

Distributed KVApache 2.0

Masterless, eventually-consistent distributed key-value store modeled on Amazon's Dynamo paper. Prioritizes staying writable during network partitions.

Pros
  • No single point of failure; accepts writes during partitions
  • Tunable consistency per request
Cons
  • You must resolve conflicting versions in application code
  • Community has shrunk considerably
Use when availability beats consistency and you can handle conflict resolution yourself. Mostly of historical interest now.

Aerospike

Distributed KVAGPL / commercial

Key-value store engineered around NVMe SSDs: indexes in RAM, data on flash, so it delivers sub-millisecond latency at RAM-like speed for a fraction of the cost.

Pros
  • Predictable sub-millisecond latency at millions of ops/sec
  • Far cheaper per terabyte than an in-memory store
  • Strong consistency mode available
Cons
  • Commercial licensing for the useful features
  • Wants specific SSD hardware to hit its numbers
  • Narrow query model
Use when ad tech, fraud scoring, or real-time bidding needs huge throughput with a hard latency ceiling.

FoundationDB

Ordered KVApache 2.0

Apple's distributed, strictly serializable ordered key-value store. Deliberately minimal — it provides transactions and durability, and you build the data model on top. Famous for its deterministic simulation testing.

Pros
  • Real ACID transactions across a distributed cluster
  • Extraordinarily well tested; very hard to break
  • Layers let you build document, graph, or SQL models on it
Cons
  • No query language and no data model out of the box
  • Transaction size and 5-second duration limits
  • You are building a database, not using one
Use when you are building infrastructure that needs a transactional foundation. Snowflake and others use it internally.

Hazelcast / Apache Ignite

In-memory data gridApache 2.0

Distributed in-memory grids that spread a dataset across a cluster's RAM and run computation next to the data, with SQL and compute-grid APIs on top.

Pros
  • Memory-speed access to a dataset larger than one machine
  • Compute runs where the data lives; SQL over the grid
  • Common as a caching tier for JVM enterprise systems
Cons
  • RAM cost; complex cluster tuning and rebalancing
  • JVM-centric; GC pauses under pressure
  • Durability is an afterthought in most deployments
Use when a Java enterprise system needs a shared, distributed cache with query and compute built in.

Tarantool

In-memory KV + app serverBSD-2

In-memory database with a built-in Lua application server, so stored procedures are real code running beside the data. Write-ahead logging makes it durable.

Pros
  • Redis-class speed with durability and secondary indexes
  • Business logic runs in-process — no network round trips
Cons
  • Small community outside Eastern Europe
  • Lua-centric; unusual operational model
Use when you want Redis speed but need durability and indexes, and are comfortable off the beaten path.

Document databases

Store whole nested JSON records instead of normalized tables. Good when the record is the natural unit and its shape varies.

MongoDB

DocumentSSPL (source-available)

The dominant document database. Stores BSON documents in collections, with secondary indexes, an aggregation pipeline, sharding, and (since v4) multi-document transactions.

Pros
  • Flexible schema; fields can vary per document
  • Objects map straight onto application structures
  • Horizontal sharding and replica sets are built in
  • Excellent developer experience and Atlas hosting
Cons
  • "Schemaless" becomes undocumented schema in application code
  • Joins ($lookup) are weak and slow — you duplicate data instead
  • Duplicated data means multi-place updates and drift
  • SSPL blocks some commercial hosting uses
  • Postgres JSONB covers many of the same cases inside a relational DB
Use when records are genuinely heterogeneous and mostly read and written whole — product catalogs, CMS content, event payloads, user profiles with varying attributes.

Apache CouchDB

DocumentApache 2.0

Document store whose defining feature is multi-master replication with automatic conflict flagging — including to PouchDB in a browser or on a phone.

Pros
  • Best-in-class offline-first sync story
  • Plain HTTP/JSON API; crash-resistant append-only storage
Cons
  • Slower and less flexible querying than Mongo
  • Map/reduce views feel dated
  • Small ecosystem
Use when clients work offline and must sync later — field data collection, mobile-first tools, remote sites.

Firebase Firestore

Managed documentProprietary (GCP)

Managed document DB with real-time listeners and client-side SDKs, so browsers and phones talk to it directly under declarative security rules.

Pros
  • Real-time updates and offline cache with no backend code
  • Auth, hosting, and functions in one platform
  • Fastest path from idea to working app
Cons
  • Query model is very restrictive (no joins, limited compound filters)
  • Per-document-read pricing punishes list-heavy screens
  • Security rules are the entire security model — easy to get wrong
  • Hard to migrate off
Use when you are shipping a mobile or web app fast and want live sync without writing a server.

PostgreSQL JSONB

Document-in-relationalPostgreSQL license

Not a separate product — a reminder. Postgres stores and indexes JSON documents (GIN indexes, path operators, jsonb_path_query) inside a relational database, so structured and unstructured data live in one transaction.

Pros
  • Documents and relations in the same ACID transaction
  • One database to back up, monitor, and secure
  • Add real columns later as the schema settles
Cons
  • No automatic sharding for huge document volumes
  • Deeply nested queries are more verbose than Mongo's
Use when only part of your data is document-shaped — which is the usual case. Try this before adding MongoDB.

Couchbase

Document + cacheBSL / commercial

Document database with a memory-first architecture — it began life as Memcached — plus a SQL-like query language (SQL++/N1QL), full-text search, and mobile sync.

Pros
  • Cache and database in one tier; very low read latency
  • SQL++ is far more familiar than Mongo's query syntax
  • Strong mobile sync story (Couchbase Lite)
Cons
  • Memory-hungry; working set wants to fit in RAM
  • Source-available licensing
  • Smaller ecosystem than MongoDB
Use when you would otherwise deploy MongoDB plus Redis and would rather run one system.

RavenDB

DocumentAGPL / commercial

.NET-native document database with fully ACID multi-document transactions — unusual in this category — and automatic index creation from the queries you run.

Pros
  • ACID by default across documents
  • Indexes itself based on observed queries
  • Excellent C#/.NET client experience
Cons
  • Small community outside .NET
  • Commercial license for production features
Use when a .NET team wants documents without giving up transactions.

Azure Cosmos DB

Managed multi-modelProprietary (Azure)

Microsoft's globally distributed managed database, exposing document, wide-column, graph, and key-value APIs over one engine, with five explicitly selectable consistency levels and latency SLAs.

Pros
  • Turnkey global replication with latency guarantees
  • Choose consistency per workload, not per product
  • Mongo and Cassandra wire compatibility eases migration
Cons
  • Request-unit pricing is genuinely hard to predict
  • Compatibility APIs are partial — expect surprises
  • Deep Azure lock-in
Use when you are on Azure and need multi-region writes without building the machinery.

Wide-column stores

Partition key plus sorted clustering columns. Built for write volume and predictable access paths at a scale where joins stop being possible.

Apache Cassandra

Wide-columnApache 2.0

Masterless distributed database where every node accepts writes and data is replicated by a hash ring. Tunable consistency per query. Designed so that losing machines does not cause an outage.

Pros
  • Write throughput scales linearly with nodes
  • No leader, no failover event, multi-datacenter native
  • Predictable performance at petabyte scale
Cons
  • Model the tables around queries; ad-hoc analysis is impossible
  • No joins, weak aggregates, limited transactions
  • Tombstones and repair are ongoing operational chores
  • Needs a real cluster and real expertise to be worth it
Use when you write more than one machine can absorb and the queries are known in advance — telemetry, messaging history, time-ordered feeds.

ScyllaDB

Wide-columnSource-available / commercial

A C++ rewrite of Cassandra with a shard-per-core architecture. Same data model and drivers, dramatically better latency and hardware efficiency.

Pros
  • Often 3-10x the throughput per node vs. Cassandra
  • No JVM garbage-collection pauses
  • Drop-in for Cassandra drivers
Cons
  • Same modeling constraints as Cassandra
  • Licensing has moved away from open source
  • Tuned for big machines; small deployments waste it
Use when you want Cassandra's model on far fewer servers.

Apache HBase

Wide-columnApache 2.0

The open-source BigTable clone, running on HDFS. Strongly consistent per row, with fast random access on top of a Hadoop data lake.

Pros
  • Strong per-row consistency at very large scale
  • Integrates directly with the Hadoop/Spark stack
Cons
  • Requires HDFS and ZooKeeper — heavy dependency chain
  • Declining ecosystem as Hadoop fades
  • Painful operations relative to Cassandra
Use when a Hadoop estate already exists. Not a new-project choice.

Google Cloud Bigtable

Managed wide-columnProprietary (GCP)

The original wide-column store, offered as a managed service. Single-digit millisecond reads at petabyte scale, with the HBase API.

Pros
  • Scales to petabytes with flat latency and no operations
  • Ideal for time-ordered keys and huge append streams
Cons
  • One index only — the row key. Design it perfectly or start over
  • No transactions across rows, no joins
  • Expensive minimum node count; GCP lock-in
Use when you have enormous, well-understood, time-ordered data on GCP — IoT fleets, financial ticks, ad events.

Graph databases

Nodes and edges as first-class citizens. Worth it only when the connections themselves are the question — otherwise a join table is cheaper.

Neo4j

GraphGPLv3 community / commercial

The leading property-graph database, queried with Cypher. Stores pointers between nodes directly, so traversal cost depends on how many hops you take, not on how big the database is.

Pros
  • Multi-hop queries stay fast where SQL joins collapse
  • Cypher is readable and expresses paths naturally
  • Strong visualization and graph-algorithm libraries
  • ACID transactions
Cons
  • Bulk aggregates and full scans are slow
  • Community edition has no clustering
  • Memory-hungry; the working graph wants to fit in RAM
  • A second database to operate and staff
Use when traversal is the product: fraud rings, network and infrastructure topology, recommendations, org and ownership chains, knowledge graphs.

Memgraph

In-memory graphBSL

In-memory, Cypher-compatible graph database aimed at streaming graph workloads and real-time analysis.

Pros
  • Much lower query latency than disk-based graphs
  • Cypher-compatible; consumes Kafka streams natively
Cons
  • Graph must fit in memory
  • Small ecosystem; source-available license
Use when the graph changes constantly and answers must be immediate — live fraud scoring, network monitoring.

ArangoDB

Multi-modelBUSL

One engine offering document, graph, and key-value models with a single query language (AQL), so you can join documents and traverse edges in one statement.

Pros
  • Three models without three databases
  • Good traversal performance plus normal document queries
Cons
  • Jack of all trades — beaten by specialists in each
  • Smaller community; license moved to BUSL
Use when a project genuinely needs two models and you want to operate only one server.

Apache AGE (Postgres)

Graph extensionApache 2.0

A Postgres extension adding openCypher graph queries to tables you already have, so graph and relational data share one transaction and one backup.

Pros
  • No new database to run
  • Mix SQL and Cypher against the same data
Cons
  • Slower than Neo4j on deep traversals
  • Partial Cypher coverage; less mature tooling
Use when you have some graph questions but not enough to justify a dedicated graph database.

Amazon Neptune

Managed graphProprietary (AWS)

Managed graph database supporting both property graphs (Gremlin, openCypher) and RDF triples (SPARQL) on the same storage layer.

Pros
  • No cluster to operate; automatic backups and replicas
  • Both graph standards in one service
Cons
  • Slower than a tuned Neo4j on deep traversals
  • Always-on instance cost; VPC-only access
  • Limited visibility into query plans
Use when you need graph queries on AWS and do not want to run a graph cluster.

JanusGraph / TigerGraph / Dgraph

Distributed graphApache 2.0 / commercial

Graph databases built to scale past one machine. JanusGraph layers Gremlin over Cassandra or HBase; TigerGraph is a commercial parallel engine for deep-link analytics; Dgraph is a distributed native graph with a GraphQL-style language.

Pros
  • Handle graphs too large for a single Neo4j instance
  • TigerGraph excels at deep multi-hop analytics on billions of edges
Cons
  • Much heavier to operate; JanusGraph needs a storage cluster underneath
  • Query languages differ — skills do not transfer cleanly
  • Dgraph's stewardship has been unstable
Use when the graph genuinely will not fit on one large machine.

RDF triplestores — Virtuoso, GraphDB, Stardog, Blazegraph

Semantic graphMixed

Store data as subject-predicate-object triples following W3C standards (RDF, OWL, SPARQL) and can infer new facts from ontologies. This is the technology behind linked open data and Wikidata.

Pros
  • Standardized model and query language across vendors
  • Reasoning engines derive implied facts automatically
  • Ideal for merging heterogeneous vocabularies
Cons
  • SPARQL and ontology modeling have a steep learning curve
  • Slower than property graphs on plain traversal
  • Small talent pool; academic-leaning tooling
Use when you must integrate data across organizations using shared vocabularies, or publish machine-readable open data.

Time-series databases

Timestamped, append-heavy, rarely updated data with a retention policy. Specialists compress it 10-50x and make time-window queries cheap.

TimescaleDB

Time-series (Postgres)Apache 2.0 / TSL

Postgres extension that auto-partitions tables by time ("hypertables") and adds columnar compression, continuous aggregates, and retention policies — while keeping full SQL, joins, and every Postgres tool you already use.

Pros
  • It is still Postgres: joins, constraints, extensions, backups
  • 90%+ compression on older chunks
  • Continuous aggregates keep rollups fresh automatically
  • One database for both metrics and relational metadata
Cons
  • Not as fast as purpose-built engines at extreme ingest rates
  • Advanced features sit under the non-open TSL license
  • Inherits Postgres tuning and vacuum duties
Use when sensor, market, or metric data must sit next to relational data and you want to keep writing plain SQL.

InfluxDB

Time-seriesMIT / commercial

The best-known dedicated time-series database, with its own line-protocol ingest and a full stack for collection, dashboards, and alerting.

Pros
  • Simple, high-rate ingest built for agents and devices
  • Retention and downsampling policies out of the box
  • Mature monitoring ecosystem (Telegraf, Grafana)
Cons
  • Query language has changed twice (InfluxQL → Flux → SQL) — painful migrations
  • High cardinality tags degrade it badly
  • Clustering is a paid feature
Use when you are collecting device or infrastructure metrics and want a purpose-built stack. Check the version story before committing.

Prometheus

MetricsApache 2.0

The standard for infrastructure monitoring. Pulls metrics from HTTP endpoints, stores them locally, and queries with PromQL. Alerting is built in.

Pros
  • The de facto monitoring standard; everything exports to it
  • PromQL is excellent for rates, percentiles, and alerts
  • Single binary, no dependencies
Cons
  • Deliberately not durable long-term storage
  • Single node; scaling needs Thanos, Cortex, or Mimir
  • Not for business data or anything requiring exact values
Use when monitoring servers, containers, and services. Pair it with long-term storage if you need history.

VictoriaMetrics

MetricsApache 2.0

Prometheus-compatible metrics database designed for far better compression, high cardinality tolerance, and long retention, as a drop-in remote-write target.

Pros
  • Much lower disk and memory use than Prometheus or Thanos
  • Handles high cardinality without falling over
  • Single binary or clustered; PromQL compatible
Cons
  • Some PromQL edge-case differences (MetricsQL)
  • Smaller community than Prometheus itself
Use when Prometheus retention or cardinality has become the problem.

QuestDB

Time-series SQLApache 2.0

Column-store time-series database with SQL plus time-specific extensions like SAMPLE BY and ASOF JOIN, aimed at financial tick data.

Pros
  • Very fast ingest with ordinary SQL on top
  • ASOF joins solve a real and awkward problem
  • Accepts Influx line protocol and Postgres wire
Cons
  • Younger, smaller ecosystem
  • Replication and HA are newer and less proven
Use when you handle market data, trading, or IoT streams and want SQL rather than a bespoke query language.

kdb+ / q

Time-series (finance)Commercial

The column-store used across investment banks for tick data, with its own terse array language, q. Decades old and still the speed benchmark for time-series analytics.

Pros
  • Unmatched speed on ordered time-series analytics
  • Tiny footprint; the whole system is a few megabytes
  • Standard in capital markets — skills are portable in that industry
Cons
  • Very expensive licensing
  • q is famously cryptic; small hiring pool
  • Almost no ecosystem outside finance
Use when you are in trading or market data and the latency budget justifies the cost.

Thanos / Cortex / Mimir

Prometheus long-term storageApache 2.0 / AGPL

Systems that sit behind Prometheus to give it what it deliberately lacks: unlimited retention in object storage, global query across clusters, and multi-tenancy.

Pros
  • Years of metric history on cheap object storage
  • One query view across many Prometheus servers
  • Keeps PromQL and existing dashboards intact
Cons
  • Several components to deploy and tune
  • Historical queries can be slow
  • VictoriaMetrics often does the same job more simply
Use when you run many Prometheus servers and need long retention with a single pane of glass.

Graphite / Whisper

Metrics (legacy)Apache 2.0

The pre-Prometheus metrics standard: dotted metric names pushed via StatsD into fixed-size Whisper files that downsample automatically as data ages.

Pros
  • Dead simple push model; storage size is fixed and predictable
  • Still widely supported by dashboards and agents
Cons
  • No labels or dimensions — metric names get unwieldy
  • Heavy disk I/O; superseded by Prometheus
Use when maintaining an existing deployment. Do not start here.

Inverted indexes, tokenization, stemming, typo tolerance, and relevance ranking. A search engine is a derived index, never your system of record.

Elasticsearch

SearchElastic v2 / SSPL / AGPL

Distributed Lucene-based search and analytics engine. Handles full-text search, log analytics, aggregations, geospatial queries, and vector search in one cluster.

Pros
  • Enormously capable; deep relevance and aggregation control
  • Scales horizontally to petabytes of logs
  • Huge ecosystem (Kibana, Beats, Logstash)
Cons
  • Resource-hungry and genuinely hard to operate well
  • Near-real-time, not real-time; eventual consistency
  • Shard sizing mistakes are expensive to fix
  • Licensing history is a maze — check your version
Use when search or log analytics is a core feature at scale and you have someone to run the cluster.

OpenSearch

SearchApache 2.0

AWS's fork of Elasticsearch 7.10, kept fully Apache-licensed, with its own dashboards and security plugins.

Pros
  • Truly open license with no usage restrictions
  • Security and alerting included, not paid add-ons
  • Managed on AWS
Cons
  • Same operational weight as Elasticsearch
  • Trails upstream on some newer features
  • Client libraries have diverged — mind the versions
Use when you want Elasticsearch's capability without its licensing questions.

Meilisearch

SearchMIT

Instant-search engine focused on typo tolerance and sane defaults. Single binary, configured in minutes, tuned for search-as-you-type.

Pros
  • Relevant results with almost no tuning
  • Sub-50ms responses; excellent typo handling
  • Trivial to deploy and operate
Cons
  • Index should fit comfortably in RAM
  • Not for log analytics or heavy aggregation
  • Less relevance control than Elasticsearch
Use when you want great product/docs/site search on a modest corpus without running a cluster. Typesense is a near-equivalent alternative.

Typesense

SearchGPL v3

Open-source, typo-tolerant instant search built as an Algolia alternative, with built-in clustering and hybrid keyword-plus-vector search.

Pros
  • Fast, simple API; high-availability clustering included
  • Hybrid semantic + keyword search built in
Cons
  • In-memory index caps dataset size per node
  • GPL may matter for embedded distribution
Use when you want Algolia-style search self-hosted.

PostgreSQL full-text search

Search-in-relationalPostgreSQL license

Built-in tsvector indexing with stemming, ranking, and trigram fuzzy matching via pg_trgm. Not as strong as Lucene, but there is nothing to deploy and nothing to keep in sync.

Pros
  • No second system, no sync lag, no split brain
  • Combine search with SQL filters and joins freely
  • Good enough well past most people's assumptions
Cons
  • Weaker relevance tuning and language support
  • Degrades on very large corpora or heavy faceting
Use when search is a feature, not the product. Start here and move to Meilisearch or OpenSearch only when it actually hurts.

Apache Solr

SearchApache 2.0

The other major Lucene search server, and the older one. Configuration-driven rather than API-driven, with very strong faceting and enterprise document handling.

Pros
  • Excellent faceting and relevance control
  • Fully Apache-licensed, no license drama
  • Very mature; strong in library and enterprise catalogs
Cons
  • XML/config-heavy; dated developer experience
  • Weaker for log analytics than Elasticsearch
  • Shrinking community
Use when you need deep faceted catalog search under a permissive license, or you already run it.

Manticore Search / Sphinx

SearchGPL v2 / v3

Lightweight C++ search engines that speak the MySQL protocol, so you query the index with SQL. Manticore is the maintained continuation of Sphinx.

Pros
  • Very low resource use — fast on modest hardware
  • SQL interface; trivial to bolt onto a MySQL app
Cons
  • Small community, thin documentation
  • Fewer analytics and aggregation features
Use when you want fast full-text search on a small server without running a JVM cluster.

Vespa

Search + vector + rankingApache 2.0

Yahoo's serving engine: full-text, vector search, structured filters, and machine-learned ranking models evaluated inside the engine at query time, all on live updatable data.

Pros
  • The strongest hybrid retrieval plus ML ranking story available
  • Real-time writes, no index rebuild step
  • Proven at very large scale
Cons
  • Steepest learning curve in this section
  • Heavy resource requirements; complex configuration
  • Small community relative to Elasticsearch
Use when recommendations or search ranking is the core product and you need models scoring results server-side.

Algolia

Managed searchProprietary SaaS

Hosted instant-search API with excellent client libraries and analytics. The benchmark for search-as-you-type user experience.

Pros
  • Outstanding developer and end-user experience
  • Nothing to operate; global edge network
  • Built-in A/B testing and search analytics
Cons
  • Costs climb steeply with records and operations
  • Data leaves your infrastructure
  • Meilisearch/Typesense cover most of it self-hosted
Use when search quality is commercially important and you would rather buy the result than build it.

Vector databases

Store embeddings — arrays of floats — and find nearest neighbours by cosine or dot product. This is the retrieval layer behind RAG and semantic search.

pgvector (Postgres)

Vector extensionPostgreSQL license

Adds a vector column type plus HNSW and IVFFlat indexes to Postgres, so embeddings live in the same table and same transaction as the rows they describe.

Pros
  • No new service; vectors and metadata never drift apart
  • Combine similarity with arbitrary SQL filters and joins
  • Available on essentially every managed Postgres
Cons
  • Slower than dedicated engines past roughly 10-50M vectors
  • Index builds are memory-heavy and slow
  • Fewer knobs for recall/latency trade-offs
Use when you are adding semantic search or RAG to an app that already has Postgres. This is the right first move for nearly everyone.

Qdrant

VectorApache 2.0

Rust vector database with strong filtered search — payload conditions applied during the ANN traversal rather than after it, which is where naive systems lose results.

Pros
  • Excellent filtered vector search and recall control
  • Quantization cuts memory dramatically
  • Clean API, easy to self-host, permissive license
Cons
  • Another service to run, back up, and secure
  • Metadata must be duplicated from your primary DB
  • Young, fast-moving project
Use when pgvector's latency or scale stops being acceptable, or filtered similarity search is central.

Milvus

VectorApache 2.0

Distributed vector database aimed at billion-scale collections, with GPU indexing and separated storage and compute.

Pros
  • Handles the largest vector workloads
  • Many index types; GPU acceleration
Cons
  • Complex architecture (etcd, object storage, message queue)
  • Heavy for anything under ~100M vectors
Use when vector count is genuinely in the hundreds of millions or billions.

Chroma

VectorApache 2.0

Developer-first vector store that runs embedded in a Python process or as a small server. The usual starting point for LLM prototypes.

Pros
  • Three lines to a working RAG index
  • Embedded mode — no infrastructure
Cons
  • Not built for production scale or concurrency
  • API has churned across versions
Use when prototyping. Plan the move to pgvector or Qdrant before launch.

Weaviate

VectorBSD-3

Vector database with built-in embedding modules and hybrid keyword-plus-vector search, so it can generate embeddings for you at ingest time.

Pros
  • Hybrid search out of the box
  • Built-in vectorizer modules; GraphQL API
Cons
  • Heavier resource use; more concepts to learn
  • Module coupling can lock you to their pipeline
Use when you want hybrid retrieval and would rather the database own the embedding step.

FAISS

Vector libraryMIT

Meta's similarity-search library — not a database. Indexes live in memory in your process; persistence, filtering, and updates are your problem.

Pros
  • The performance benchmark others are measured against
  • Every ANN index variant, plus GPU support
  • No service, no network hop
Cons
  • No persistence, metadata, filtering, or concurrency layer
  • Rebuilding an index for updates is on you
Use when you are doing offline batch similarity work or building your own retrieval system.

Pinecone

Managed vectorProprietary SaaS

The best-known managed vector database. Serverless indexes, no tuning, and it handles sharding and replication for you.

Pros
  • Zero operations; scales without you thinking about it
  • Consistently good recall without index tuning
  • Mature integrations across the LLM tooling ecosystem
Cons
  • Cost grows quickly with vector count and query volume
  • Embeddings and metadata leave your infrastructure
  • Closed source; no self-hosted option
Use when you want production vector search immediately and would rather pay than operate it.

File & table formats

Not databases, but increasingly used in place of one: files in a folder or a bucket, queried directly by DuckDB, Spark, or Trino.

Apache Parquet

Columnar fileApache 2.0

The standard columnar file format. Column-wise storage with per-column compression and statistics, so engines skip whole blocks they do not need.

Pros
  • 5-20x smaller than equivalent CSV
  • Every analytical tool reads it; carries a real schema
  • Predicate and column pushdown make scans cheap
Cons
  • Immutable — no row-level update or delete
  • Not human-readable; needs tooling to inspect
  • Poor for single-row lookups
Use when archiving or sharing analytical datasets. Replace CSV with it by default.

Apache Arrow

In-memory formatApache 2.0

A standard in-memory columnar layout, so pandas, Polars, DuckDB, Spark, and R can hand data to each other with no serialization cost.

Pros
  • Zero-copy data exchange between tools and languages
  • Underpins most modern analytics stacks
Cons
  • In-memory representation, not a storage format
  • Rarely something you use directly
Use when moving data between analytical libraries without paying conversion cost.

Apache Iceberg

Table formatApache 2.0

Adds database semantics to a pile of Parquet files in object storage: ACID commits, schema evolution, hidden partitioning, and time travel. The emerging open standard for lakehouses.

Pros
  • Transactions and time travel over cheap object storage
  • Engine-neutral — Spark, Trino, DuckDB, Snowflake all read it
  • Schema and partition changes without rewriting data
Cons
  • Needs a catalog service and file maintenance jobs
  • Latency is minutes-to-seconds, not milliseconds
  • Only worth it at real data-lake scale
Use when many engines and teams must share very large tables without a proprietary warehouse.

Delta Lake

Table formatApache 2.0

Databricks' equivalent of Iceberg: a transaction log over Parquet giving ACID, upserts (MERGE), and time travel.

Pros
  • Excellent Spark integration and upsert support
  • Mature, widely deployed
Cons
  • Best features still track the Databricks platform
  • Iceberg has more momentum as the neutral choice
Use when you are on Databricks or Spark-heavy.

DuckLake

Table formatMIT

DuckDB's lakehouse format that keeps the metadata in an ordinary SQL database instead of a tree of manifest files — simpler than Iceberg, with Parquet still holding the data.

Pros
  • Far simpler metadata layer; fast multi-table transactions
  • Data stays as plain Parquet you can read anywhere
Cons
  • New, with a small ecosystem
  • Requires a SQL catalog database alongside the files
Use when you want lakehouse semantics without operating Iceberg's machinery.

Apache Hudi

Table formatApache 2.0

The third open table format, built at Uber around incremental upserts and change-data-capture into a data lake.

Pros
  • Best of the three at frequent record-level updates and deletes
  • Incremental pull — read only what changed since last run
Cons
  • Most complex configuration of the three formats
  • Iceberg has won more of the ecosystem
Use when a lake must absorb a constant stream of updates, such as CDC from an operational database.

ORC & Avro

File formatsApache 2.0

ORC is the columnar format from the Hive world — similar in role to Parquet. Avro is row-oriented with a schema attached, the standard for Kafka messages and streaming records.

Pros
  • ORC: strong compression, excellent in Hive/Spark stacks
  • Avro: schema evolution built for message pipelines
Cons
  • ORC has narrower tool support than Parquet
  • Avro is row-based — poor for analytical scans
Use when Hive/Spark conventions call for ORC, or Kafka pipelines need Avro schemas. Otherwise Parquet.

Streaming & event databases

Databases where the input is a continuous stream and the output is kept permanently up to date, rather than recomputed when someone asks.

Apache Kafka

Distributed logApache 2.0

Not a database — a durable, replayable, ordered log. Producers append, many consumers read at their own pace, and messages persist for a configured retention. The backbone that connects most of the systems on this page.

Pros
  • Extremely high throughput with durable ordering per partition
  • Replay lets you rebuild any downstream store from scratch
  • Decouples producers from consumers cleanly
Cons
  • No queries — you cannot ask it a question
  • Heavy to operate (though ZooKeeper is now gone)
  • Routinely deployed where a simple queue would do
Use when multiple systems need the same event stream, or you want the ability to rebuild derived stores by replaying history.

Materialize / RisingWave

Streaming SQLBSL / Apache 2.0

Streaming databases that keep SQL materialized views incrementally up to date as new events arrive. You write ordinary SQL; the result is always current, with no scheduled refresh.

Pros
  • Complex joins and aggregates stay fresh in milliseconds
  • Plain SQL and the Postgres wire protocol
  • Removes hand-written stream-processing code
Cons
  • Memory cost scales with the state your views hold
  • Young category; Materialize is source-available
  • Not a system of record — it derives from streams
Use when a dashboard, alert, or API must reflect events within a second and the logic is more than a running count.

EventStoreDB

Event sourcingCommercial / OSS core

Purpose-built for event sourcing: the append-only stream of events is the data, and current state is a projection of it. Nothing is ever updated in place.

Pros
  • Complete, immutable audit history by construction
  • Rebuild any view by replaying events
  • Temporal queries: what did we know last Tuesday?
Cons
  • Event sourcing is a demanding architectural commitment
  • Simple queries need projections built in advance
  • Schema versioning of old events is a permanent chore
Use when the history of how state changed matters as much as the state — finance, compliance, order lifecycles.

Immutable, versioned & multi-model

Databases built around a distinctive idea: never delete, keep every version, or serve several models at once.

immudb / Amazon QLDB

LedgerApache 2.0 / proprietary

Append-only databases with cryptographic verification: every record is hashed into a Merkle tree, so tampering with history is mathematically detectable.

Pros
  • Provable, tamper-evident audit trail
  • Meets strict regulatory record-keeping requirements
  • Simpler and faster than a blockchain for the same goal
Cons
  • Storage only grows; you cannot truly delete (a GDPR problem)
  • Limited query capability
  • AWS has announced the end of QLDB — check status before adopting
Use when an auditor or regulator must be able to prove the history was not altered.

Dolt

Versioned SQLApache 2.0

"Git for data." A MySQL-compatible database where you commit, branch, diff, and merge the actual table contents, with full history preserved.

Pros
  • Cell-level diffs and merges between branches of data
  • Full provenance — every change is attributable
  • Pull-request workflows for datasets
Cons
  • Slower and larger than plain MySQL
  • Niche; small ecosystem
Use when a shared reference dataset is edited by several people and you need review and rollback — pricing tables, taxonomies, config catalogs.

Datomic

Immutable temporalProprietary (free tier)

Stores immutable facts as entity-attribute-value-time tuples, so the database is an accumulating record. Queries can run "as of" any past moment, and reads happen in the application process rather than on a server.

Pros
  • Time travel is a first-class query feature
  • Reads scale by adding application processes, not database nodes
  • Datalog is powerful for recursive and relationship queries
Cons
  • Clojure-centric; very small talent pool
  • Proprietary, with a single vendor
  • Writes go through one transactor — a throughput ceiling
Use when auditability and historical queries dominate and the team is already on the JVM/Clojure.

SurrealDB

Multi-modelBSL

Newer multi-model database combining documents, graph relations, and SQL-like queries, with live queries and permissions designed for direct browser access.

Pros
  • Documents, relations, and graph edges in one query language
  • Real-time subscriptions and row-level auth built in
  • Embeddable or server mode
Cons
  • Young and still stabilizing; breaking changes have been common
  • Unproven at scale; source-available license
Use when prototyping something that wants several models at once and you can tolerate churn. Not yet a safe bet for critical systems.

Managed & serverless platforms

Not new engines — packaging. Mostly Postgres or MySQL with the operations, scaling, and often an API layer handled for you.

PlatformEngine underneathWhat it addsWatch out for
SupabasePostgreSQLAuth, auto-generated REST/GraphQL APIs, realtime, storage, row-level securityYou still own schema and RLS policy correctness
NeonPostgreSQLServerless with storage/compute separation, instant database branching, scale-to-zeroCold starts after idle; young platform
PlanetScaleMySQL (Vitess)Schema branching, non-blocking migrations, horizontal shardingForeign keys restricted; free tier withdrawn
Amazon RDS / AuroraPostgres, MySQLManaged backups, failover, read replicas; Aurora rewrites the storage layerAurora costs more and locks you in further
Cloudflare D1SQLite (libSQL)Edge-deployed SQLite bound to WorkersSize limits; single-primary writes
Fauna / XataCustom / PostgresAPI-first databases with built-in search and typed clientsFauna's shutdown shows the platform risk here
Platform risk is real. These services can change pricing, remove free tiers, or shut down entirely — Fauna and AWS QLDB both did. Prefer platforms running a standard engine you could export and self-host on a bad day.

Legacy & enterprise

You will not choose these, but you will meet them. Knowing what they are makes migration conversations shorter.

SystemWhat it isWhere you meet it
IBM Db2IBM's relational database, including the mainframe z/OS editionBanking and insurance cores; still processes enormous transaction volumes
IBM InformixRelational engine strong in embedded and IoT deploymentsRetail POS systems, telecom equipment
TeradataThe original MPP data warehouse applianceLarge retail and telecom warehouses predating the cloud
SAP HANAIn-memory column store that runs SAP's own ERPAnywhere SAP S/4HANA is deployed; rarely chosen independently
Sybase ASEAncestor of SQL Server, now SAP-ownedTrading and financial systems from the 1990s
dBase / FoxPro / Paradox1980s-90s desktop file databases (.dbf)Legacy business apps, and GIS shapefile attribute tables
MUMPS / InterSystems IRISHierarchical database and language from 1966, still actively developedHospital records — Epic and VistA run on it
IMS / VSAMIBM hierarchical database and file access methodMainframe COBOL systems; still core to some airlines and banks

Comparison matrix

The main options at a glance. "Scale" is the point at which the usual answer stops being "add more RAM".

DatabaseModelDeploymentTransactionsScales bySweet spot
SQLiteRelational (row)Embedded, 1 fileFull ACIDBigger diskLocal & single-user apps
DuckDBRelational (column)Embedded, 1 fileACID, 1 writerBigger machineAnalytics on a laptop
PostgreSQLRelational (row)ServerFull ACIDVertical + read replicasThe default app database
MySQL / MariaDBRelational (row)ServerFull ACIDVertical + replicasClassic web stacks
SQL ServerRelational (row)ServerFull ACIDVertical + AGMicrosoft estates
CockroachDBDistributed SQLClusterSerializableAdd nodesGlobal, no-downtime SQL
ClickHouseColumnar OLAPServer / clusterWeakAdd nodesBillion-row dashboards
BigQuery / SnowflakeColumnar OLAPManaged SaaSWarehouse-levelAutomaticCompany-wide warehouse
Redis / ValkeyKey-valueServerLimitedAdd RAM / shardsCache, queues, counters
DynamoDBKV / documentManaged SaaSPer-item + limitedAutomaticKnown patterns, huge scale
MongoDBDocumentServer / clusterMulti-doc (v4+)ShardingVariable-shape records
Cassandra / ScyllaWide-columnClusterTunable, weakAdd nodesExtreme write volume
Neo4jGraphServerFull ACIDVertical (RAM)Multi-hop relationships
TimescaleDBTime-series (row+col)Server (Postgres)Full ACIDVertical + chunksMetrics beside real data
PrometheusMetricsSingle binaryNoneFederation / MimirInfrastructure monitoring
Elasticsearch / OpenSearchSearch indexClusterNoneAdd nodesSearch & log analytics
Meilisearch / TypesenseSearch indexSingle binaryNoneAdd RAMSite & product search
pgvectorVector (in Postgres)Server (Postgres)Full ACIDVerticalRAG under ~10M vectors
Qdrant / MilvusVectorServer / clusterNoneAdd nodesLarge-scale similarity
Parquet + DuckDBFilesNoneNoneBigger machineArchives, exports, sharing

Common mistakes

1. Choosing for scale you do not have. Cassandra, Spanner, and Milvus solve problems that appear past millions of writes per hour. Below that they are pure cost. A single Postgres box handles more than almost anyone expects.
2. Adding a database instead of an index. Most "the database is slow" problems are a missing index, an N+1 query loop, or no connection pooler. Measure with EXPLAIN ANALYZE before adopting a new engine.
3. Treating a cache or a search index as the source of truth. Redis, Elasticsearch, Qdrant, and Prometheus all lose data by design. Own the truth in a durable database and rebuild the rest.
4. "Schemaless" meaning no schema. The schema still exists — it has just moved into application code where nothing validates it. Document databases need discipline, migration plans, and validation rules just as much as relational ones.
5. Running OLTP on an OLAP engine, or the reverse. ClickHouse hates single-row updates. Postgres hates scanning two billion rows. Both failures look like "it got slow" long before anyone names the real cause.
6. Ignoring the license. MongoDB (SSPL), Redis (RSALv2), Elasticsearch, Cockroach (BSL), Scylla, and ArangoDB have all moved off open-source licenses. It rarely matters for internal tools and matters a lot if you resell or host the product.
7. No backup you have actually restored. A backup that has never been restored is a hypothesis. Test the restore, time it, and write down the steps.

Glossary

TermMeaning
ACIDAtomicity, Consistency, Isolation, Durability — the guarantee that a transaction fully happens or fully does not, and survives a crash.
OLTPOnline transaction processing: many small reads and writes. Apps.
OLAPOnline analytical processing: few huge scans and aggregates. Dashboards.
HTAPBoth of the above in one system.
CAP theoremDuring a network partition you must choose availability or consistency. You cannot keep both.
Eventual consistencyReplicas converge after a delay; a read may return stale data.
ShardingSplitting data across machines by key so no one node holds it all.
ReplicationCopying data to other nodes for redundancy or read scaling.
LSM treeWrite-optimized structure: buffer in memory, flush sorted files, compact later. Fast writes, costly background work.
B-treeRead-optimized balanced index. Predictable lookups, more write amplification.
WALWrite-ahead log: record the change before applying it, so a crash can be replayed.
MVCCMulti-version concurrency control: readers see a snapshot and never block writers.
CardinalityNumber of distinct values. High cardinality wrecks naive time-series indexes.
ANNApproximate nearest neighbour: trade a little recall for a lot of speed in vector search.
HNSWThe prevailing ANN index — a navigable small-world graph. Fast, memory-hungry.
EmbeddingA vector of floats representing meaning, so similar things sit near each other.
DenormalizationDeliberately duplicating data to avoid joins. Faster reads, harder updates.