The Evolution of Data Systems: Why We Have So Many Databases

Share
The Evolution of Data Systems: Why We Have So Many Databases

If you have ever looked at a modern system's architecture diagram, you have probably wondered the same thing every newcomer wonders: why are there so many different databases in here? There is a relational database over here, something called a document store over there, a cache, a search engine, a data warehouse, and lately a "vector" database too. Why can't one database just do everything?

It is a fair question, and the answer is the most useful thing you can learn about data. We did not end up with a dozen kinds of database because engineers like collecting toys. We ended up here because, again and again, the data got bigger, or a new shape, or asked a new kind of question that the existing tools simply could not answer well. Each new kind of database was invented to solve a specific pain that the previous generation could not.

So the best way to understand all of them is not to memorize a list. It is to walk the timeline and watch each one get born. Once you see the problem each was created to solve, you will never confuse them again, and you will be able to look at any system and understand why each piece is there.

The evolution of data systems, era by era

This article is the map. It is the story of how we got from a single file on a single machine to the sprawling data systems of today, and what each stop on that journey was actually for. The companion deep-dive articles go inside each database family one at a time; this one is the thread that connects them.

The thirty-second tour

Before we slow down, here is the whole arc in one breath, because it helps to know where the road goes before you walk it.

How one database became many, era by era

Data started in plain files. Then the relational database brought order, structure, and trustworthy transactions, and it ruled for thirty years. Then the internet arrived and produced more data than any single machine could hold, which forced us to spread data across many machines, and that broke some of the relational database's core promises. Out of that pressure came a whole family of "NoSQL" databases, each making a different trade to handle a different shape of data. Meanwhile, a separate branch grew up specifically for analytics, the work of asking big questions across enormous piles of historical data. And today we are in an era of specialized and combined systems, including the vector databases that power modern AI.

Every one of those steps was a response to a real limit. Let us watch them happen.

Era one: before structure, just files

In the earliest days, data lived in flat files. A file was a long list of records, one after another, and to find something you read the file from the top until you got to it. There was no real structure, no relationships, and no safety. If two programs wrote to the same file at the same time, they could corrupt each other's work. If the power went out halfway through an update, you were left with a mess and no easy way to recover.

This worked when data was small and simple. It fell apart as soon as businesses wanted to ask real questions, "show me every customer in this city who ordered last month," because answering that meant scanning everything, and keeping related facts consistent across many files was nearly impossible. The pain was clear: we needed structure, relationships, and safety.

Era two: the relational revolution

In the 1970s a researcher named E. F. Codd proposed an idea so good that it dominated for the next three decades: organize data into tables. Each table is a grid of rows and columns. A row is one record (one customer, one order), and a column is one field (a name, an email, a price). Crucially, tables can reference each other, so an "orders" table can point at the "customers" table, and you can combine them with an operation called a join. This is the relational model, and the language we use to query it is SQL.

The relational model: tables of rows, held together by ACID guarantees

The relational database did two things brilliantly. First, it gave data a clean, well-defined structure with relationships between tables, so you could model a real business faithfully and ask complex questions. Second, and this is the part people underrate, it made data trustworthy through a set of guarantees known by the acronym ACID:

  • Atomic. A change happens completely or not at all. When you move money from one account to another, you never end up with the money having left one account but not arrived in the other. The whole transaction succeeds, or the whole thing is rolled back as if it never happened.
  • Consistent. The database's rules are always respected. If a column must be unique, or must not be empty, the database refuses any change that would break that. The data can never drift into an invalid state.
  • Isolated. When many users change data at the same time, the database keeps their transactions from stepping on each other. Each one behaves as if it had the database to itself.
  • Durable. Once the database confirms a change is saved, it stays saved, even if the machine loses power one second later.

These four promises are why banks, airlines, and essentially every serious business ran on relational databases for decades, and why they still do for anything where correctness matters more than anything else. When someone says SQL, PostgreSQL, MySQL, or Oracle, this is the world they mean. If you want the full tour of this family, the deep-dive on relational databases goes much further.

For a long time, this was simply what "a database" meant. Then the world changed.

Era three: the web breaks the single machine

The relational database has one quiet assumption baked into it: that it runs on one strong machine (perhaps with a backup copy). For thirty years that was fine, because you could always buy a bigger machine. This approach is called scaling up: when you need more power, you get a beefier server.

Then the consumer internet arrived, and suddenly some companies had hundreds of millions of users generating data every second. The amount of data, and the number of requests, grew faster than any single machine could ever handle, no matter how much you spent. You physically could not buy a server big enough. The only way forward was scaling out: instead of one giant machine, use hundreds or thousands of ordinary, cheap ones working together.

That sounds simple, but spreading data across many machines breaks things that a single machine made easy. The pioneers of web-scale infrastructure built distributed file systems that stored enormous files in large chunks spread across racks of commodity servers, and a processing approach called MapReduce that could crunch through those mountains of data by splitting the work into pieces, running them in parallel on every machine, and combining the results. This was the birth of "big data," and it proved you could store and process far more than any single computer could hold. We will come back to this analytics branch shortly, because it grew into its own world.

But there was a deeper problem hiding here, one that affects every system that spreads data across machines. To understand the entire generation of databases that came next, you have to understand one unavoidable trade-off.

The trade-off at the heart of it all: CAP

Imagine your data lives on two machines (call them replicas) that keep copies of each other so that if one dies, the other carries on. Now imagine the network connection between them breaks for a moment, which, at scale, is not a rare disaster but a routine Tuesday. The two machines can no longer talk to each other. This situation is called a network partition.

CAP: when the network splits, you must choose consistency or availability

The CAP theorem says that during a partition like this, you can have at most two of three desirable properties: Consistency (every read sees the latest write), Availability (every request gets an answer), and Partition tolerance (the system keeps working even when the network splits). Since networks absolutely will split, partition tolerance is not really optional. So the real choice, in the moment of a split, is brutally simple: do you favor consistency or availability?

Watch what that choice actually means:

A network split forces a choice between staying correct and staying up

When a write lands on one replica but the network prevents it from reaching the other, and then a reader asks the out-of-date replica for the value, the system has exactly two honest options. It can refuse to answer, sacrificing availability to avoid serving stale data (this is the CP, consistency-first choice). Or it can answer with the old value, staying available but admitting that for a moment, different users might see different things (the AP, availability-first choice). There is no third option that magically gives you both; physics and the broken network won't allow it.

This is not an abstract puzzle. It is the single most important reason there are so many databases. Different applications make this trade differently. A bank wants consistency: it would rather reject a transaction than risk showing the wrong balance. A social feed wants availability: it would rather show you a slightly stale list of likes than show you an error page. Once you understand that this trade-off exists and that reasonable systems choose opposite sides of it, the explosion of database types in the next era makes perfect sense.

Era four: the NoSQL families

In the late 2000s and 2010s, a wave of new databases appeared, loosely grouped under the name NoSQL. The name is a little misleading; it does not really mean "no SQL," more like "not only SQL." What unites them is that they gave up some of the relational database's rules, often a bit of its strict consistency or its rigid table structure, in exchange for the ability to scale across many machines and to handle data shapes that tables modeled awkwardly.

The important thing to understand is that NoSQL is not one database. It is four quite different families, each built for a different shape of data and a different question.

The four NoSQL families, each built for a different shape of data

Document databases store data as flexible documents, usually in the JSON format you may have seen, where a single record can contain nested fields and lists. Unlike a relational table, every document can have a slightly different shape, so you do not have to design a rigid schema up front. This is wonderful for things like product catalogs, user profiles, and content feeds, where each item naturally carries a bundle of varied attributes. MongoDB and CouchDB are the names you will hear. The deep-dive on document databases covers how to model data well in this style, which is genuinely different from relational thinking.

Wide-column databases are built for enormous, never-ending streams of writes, the kind generated by chat messages, sensor readings, or location updates. They organize data so that you can write huge volumes quickly and read back ranges of it efficiently, and they spread naturally across many machines. This is also where the CAP trade-off becomes concrete: some, like Cassandra, lean toward availability (AP), while others, like HBase, lean toward consistency (CP). The wide-column deep-dive explains the partitioning model that makes this possible.

Key-value stores are the simplest idea of all: you hand the database a key and it hands you back a value, extremely fast. There is no querying across fields, no joins, just lightning-quick lookups by key. This makes them perfect for caching, user sessions, counters, and anything where you need an answer in well under a millisecond. Redis and DynamoDB live here. Because caching is such a central use of this family, its deep-dive pairs naturally with everything you may already know about caches.

Graph databases turn the relationships themselves into the main event. Instead of tables, they store nodes (people, products, accounts) and the edges that connect them (friend-of, bought, transferred-money-to). When your most important questions are about connections, "who are the friends of my friends," "what's the shortest path between these accounts," "people who bought this also bought what," a graph database answers in a single natural step what would take a relational database many painful joins. Neo4j and Neptune are common examples, and the graph deep-dive shows why traversals beat joins for this kind of work.

Notice the pattern: none of these replaced the relational database. They sit alongside it, each picking up a job it was never great at.

The other axis: running the business vs. analyzing it

There is a second split running through this whole story, one that is easy to miss but explains another huge chunk of the database zoo. It is the difference between operational and analytical work.

Two different jobs: running the business versus analyzing it

Operational work, often called OLTP (online transaction processing), is the moment-to-moment running of an application: place this order, update that profile, add this comment. These are many small reads and writes, each touching just a record or two, and they need to be fast and correct right now. Relational and document databases are built for this. They store data row by row, which is exactly what you want when you are grabbing or changing one whole record at a time.

Analytical work, often called OLAP (online analytical processing), is the opposite: questions like "what was our average revenue per region over the last three years?" These scan across millions or billions of rows but usually only look at a few columns. For this, a totally different storage layout wins, one that stores data column by column, so the database can rip through just the columns it needs without touching the rest. This is what data warehouses are built for, with names like BigQuery, Redshift, and the Parquet file format underneath many of them.

This is also where the big-data tools from era three grew up. The raw, store-everything-cheaply approach became the data lake, a place to dump vast amounts of raw data. The fast, structured, query-it-quickly approach was the data warehouse. For years you had to choose, and most companies painfully maintained both. The modern answer, the lakehouse (built on technologies like Delta Lake and Apache Iceberg), combines them: the cheap, flexible storage of a lake with the speed and structure of a warehouse, in one place. The analytical deep-dive walks through warehouses, the MapReduce lineage and its faster successors, and the lakehouse.

The lesson here is that the same data is often stored twice, in two completely different ways, because running the business and analyzing the business are genuinely different jobs that reward opposite designs.

Era five: the modern era, and AI's new database

That brings us to today, where the story is converging in interesting ways.

One thread is convergence. After a decade of giving up SQL and ACID to get scale, engineers asked the obvious question: can we have both? NewSQL and distributed SQL databases (such as Spanner and CockroachDB) answered yes, more or less, by bringing relational guarantees and the familiar SQL language to systems that still spread across many machines. At the same time, multi-model databases emerged that can act as a document store, a key-value store, and a graph all at once, so smaller teams don't have to run four different systems.

The other thread is AI, which created a genuinely new requirement. Modern machine learning represents the meaning of text, images, and audio as long lists of numbers called embeddings (or vectors). Two pieces of content that mean similar things end up with vectors that are close together. To build features like semantic search ("find documents that mean this, even if they don't share any words") or to give an AI model relevant context, you need to store millions of these vectors and very quickly find the ones nearest to a given vector. Traditional databases are terrible at this. So a new family, the vector database, was born to do exactly this one thing well, using clever approximate-nearest-neighbor techniques. Pinecone, Weaviate, and the pgvector extension are names you will increasingly hear, and the vector deep-dive explains how similarity search actually works, because it is the foundation of the current AI wave.

So how do you actually choose?

After all this, the practical question is: faced with a real system, how do you reason about which database goes where? You do not need to memorize products. You need to ask a few questions about the data and the questions you'll ask of it:

  • What shape is the data? Neat records with clear relationships favor relational. Flexible, self-contained bundles favor document. Pure connections favor graph. Endless write streams favor wide-column. Simple lookups favor key-value.
  • What's the most important question? Exact transactions favor relational and consistency. Big historical aggregations favor an analytical warehouse. "What's similar to this?" favors vectors. "What's connected to this?" favors graphs.
  • How much, and how fast? If the data and traffic outgrow a single machine, you are choosing a distributed system, and you are choosing your side of the CAP trade-off whether you realize it or not.
  • How fresh must reads be? A bank needs the latest truth every time (consistency). A view counter is fine being slightly behind (availability).

Here is the whole landscape on a single page, every era and family with its real-world examples and the one property that defines it. Keep this one handy; it is the map this entire article has been drawing.

The data systems timeline on one page: each family, its examples, and its defining property

The grown-up term for using several databases together, each for the job it's best at, is polyglot persistence. A real system might keep its core records in a relational database, cache hot lookups in a key-value store, push activity into a search engine, stream events to an analytics warehouse, and serve AI features from a vector store. That architecture diagram with a dozen databases is not over-engineering. It is each part of the system using the right tool for its specific job.

Why a TPM should care

You are not going to be choosing index types or tuning a database. But the shape of a system's data layer drives an enormous amount of what you actually manage: cost, reliability, scaling limits, and how hard certain features will be to build. A few habits pay off:

  • Know which trade-offs a system has already made. If a core service is built on an availability-first (AP) store, then "why did two users briefly see different numbers?" is an expected behavior, not a bug, and you should set expectations accordingly. The CAP choice your teams made months ago shows up in your incident reviews.
  • Expect the same data to live in several places. When an engineer says the operational database and the analytics warehouse "don't match yet," that is usually normal lag between an OLTP system and an OLAP one, not data loss. Knowing this saves a lot of false alarms.
  • Treat a new database as a real cost. Every additional database is another thing to run, secure, back up, and pay for. When a team proposes adding one, the right question is whether the job genuinely needs a different shape of store, or whether an existing one can do it. Often a new store is exactly right; sometimes it is resume-driven. Knowing the families helps you tell the difference.
  • See the AI shift coming. If your roadmap has anything touching semantic search, recommendations, or large language models, a vector database is probably in your future, with its own cost and operational story. Better to understand why it's there before it appears in an architecture review.

The reason there are so many databases is not complexity for its own sake. It is that "data" is not one thing, and the questions we ask of it are not one question. Each database in that diagram is a different era's hard-won answer to a different problem. Once you can read the diagram that way, as a story rather than a zoo, the whole data layer stops being intimidating and starts making sense. The deep-dive articles take it from here, one family at a time.