Cloud Parts

Key-value, document or wide-column?

DimensionKey-value storesDocument databasesWide-column stores
In one lineA value under a keyA JSON document the database can look insidePartitions of rows, kept sorted, built for heavy writes
What the database seesA key and a value it never parsesEvery field, including nested objects and arraysRows with a partition key, clustering columns and other columns
How you readGet by key; some add ranges (DynamoDB sort keys) or data structures (Redis lists, sets, counters)Filter, sort and aggregate on any field; fetch by IDOne partition, or a sorted slice of it; little else without another table
Secondary indexesUsually none; DynamoDB has global secondary indexesOn any field, including nested ones and arraysLimited: Cassandra has Storage Attached Indexes since 5.0; Bigtable indexes only the row key
SchemaNonePer document, with optional validationDeclared columns in CQL; just column families in Bigtable and HBase
UpdatesReplace the whole value, or atomic operations like INCRChange single fields in place with operators like $setWrite individual columns; every write is appended, and deletes leave tombstones
How it scalesHash the key across partitionsShard by a chosen key; queries without it go to every shardPartitions spread by hash or key range, with replicas that take writes
Reach for it forSessions, carts, counters, feature flags, cluster configurationProduct catalogs, user profiles, contentTime series, event logs, messaging, IoT
ExamplesValkey, Redis, DynamoDB, etcdMongoDB, Firestore, DocumentDB, Cosmos DBCassandra, ScyllaDB, Bigtable, HBase, Keyspaces

Rule of thumb

All three hash or range-split a key to spread data across machines, which is why they get lumped together as NoSQL. The difference is how much of your data the database understands. If you only ever fetch by ID, a key-value store is enough; if you search by fields inside records, use documents; if you write a lot and read back ranges within a partition, use wide-column. Some products span two: DynamoDB is both key-value and document, and Redis has a JSON type.

Sources