Databases & Data Science
A primer for people who direct the work rather than do it — built to let you evaluate an architecture, interrogate a claim, and tell the difference between a hard problem and an expensively-solved easy one.
Section 1
The one idea
If you retain nothing else, retain this. Every subsequent argument in the field is a variation on it.
A database is not a place where data is kept. Filing cabinets keep data. A database is a machine for answering questions about data without the questioner needing to know how the data is stored. That separation — between the question and the retrieval — is the entire intellectual content of the field, and it is why the discipline exists at all.
Before 1970, it did not exist. The dominant systems were navigational: IBM's IMS (hierarchical) and the CODASYL network model. To get an answer, a programmer wrote code that walked a pointer structure — start at this record, follow this link, then that one. Charles Bachman, who designed the first of these and won the 1973 Turing Award for it, titled his award lecture The Programmer as Navigator, and he meant it admiringly: the programmer steered through the data.
The consequence was brutal and is worth feeling. The access path was baked into the application code. If someone reorganised the storage — added an index, changed the ordering, split a file — every program that touched it broke. Data and the programs that read it were welded together. Asking a question nobody had anticipated meant writing a new program.
Edgar Codd, a mathematician at IBM San Jose, published A Relational Model of Data for Large Shared Data Banks in Communications of the ACM in June 1970. His opening sentence names the target directly:
The move was to represent all data as relations — mathematical sets of tuples, which is to say tables with no inherent order and no pointers — and to let users state what they wanted as a logical expression, leaving the system to figure out how to get it. This is called physical data independence, and it is the load-bearing idea.
Three things fall out of it, and each one is still generating money and arguments in 2026:
- Declarative querying. You describe the result, not the route.
SELECTis not an instruction; it is a specification. - The optimiser. Someone has to convert the specification into an actual route. That someone is a program, and it is the most sophisticated component in the system.
- Storage independence. You can change the physical layout — add indexes, re-partition, move to different hardware, switch to columnar — without rewriting the questions.
Codd's model was resisted for a decade, largely by people with working navigational systems and performance numbers to defend. The 1974 SIGMOD "Great Debate" between Codd and Bachman is the canonical confrontation. Codd won, and the reason he won is the reason to care: the value of being able to ask an unanticipated question grows without limit, and the cost of the optimiser is paid once by the vendor.
Key points
- A database's job is question-answering, not storage. Any vendor conversation that stays on storage is skipping the hard part.
- Physical data independence is the innovation. Separating what you want from how it is fetched is what allows a data asset to outlive the applications built on it.
- Every "we don't need SQL" movement is a proposal to give this up in exchange for something — usually speed or scale. Sometimes that trade is right. Ask what is being traded, and ask who pays the bill later.
- When someone tells you the schema is "flexible" because there isn't one, the constraint has not been removed. It has been moved into every application that reads the data, which is exactly where it lived in 1968.
Section 2
How a database actually works
Five mechanisms. Understand these and most production surprises stop being surprising.
A relational database is not one thing; it is a stack of five machines that mostly ignore each other. Nearly every performance mystery, outage, and vendor argument you will encounter lives in one of these five, and knowing which one is most of the diagnostic work.
2.1 The optimiser, and why it is the source of most mystery
In 1979 Patricia Selinger and colleagues at IBM published Access Path Selection in a Relational Database Management System — the System R optimiser paper. It is arguably the most practically consequential systems paper of the era, because it is what made Codd's idea viable rather than merely elegant.
The problem it solved: a query joining five tables has hundreds of possible execution orders, and the difference between the best and worst is routinely a factor of thousands. Selinger's answer was a cost-based optimiser — estimate the cost of candidate plans using statistics about the data, and pick the cheapest. Dynamic programming prunes the search.
Now the consequence, which is the thing to actually carry with you. The optimiser's decisions depend on estimates, and the estimates are frequently wrong. It guesses how many rows a filter will return. If the guess is off by 100×, the plan is wrong, and the query does not fail — it just becomes slow, sometimes catastrophically, sometimes overnight, with no code change. Stonebraker and Pavlo, reviewing fifty years of the field in 2024, are blunt: "The optimizer remains the hardest part of building a DBMS."
This is why databases have a reputation for unpredictability, and why it is not fixable by buying a bigger machine. It is intrinsic to the bargain of declarative querying: you handed over control of the route in exchange for not having to think about it, and occasionally the system chooses badly on your behalf.
What a plan looks like
You do not need to write these. You need to be able to look at one and see the shape of the problem, which is a genuinely learnable skill and one of the highest-leverage things on this page.
-- The question, stated declaratively. Note that nothing here says HOW.
SELECT c.country, COUNT(*) AS orders, SUM(o.total) AS revenue
FROM orders o
JOIN customers c ON c.id = o.customer_id
WHERE o.placed_at >= '2026-01-01'
GROUP BY c.country;
-- What the optimiser decided to actually do (Postgres, abbreviated):
HashAggregate (cost=18422 rows=41)
Group Key: c.country
-> Hash Join (cost=17903 rows=284119) ← join strategy: hash
Hash Cond: (o.customer_id = c.id)
-> Index Scan using orders_placed_at_idx on orders o
Index Cond: (placed_at >= '2026-01-01') ← index used. good.
rows=284119 actual rows=1904322 ← ESTIMATE OFF BY 6.7×
-> Hash (rows=51204)
-> Seq Scan on customers c ← whole table into RAM
Three things are legible here without any expertise. The filter on placed_at used
an index, which is good. The customers table was read in full and hashed into memory,
which is fine at 51,000 rows and would not be at 51 million. And the estimate was wrong by nearly
seven-fold — the optimiser planned for 284,000 rows and got 1.9 million. That gap is the thing that
will eventually bite: at some point the hash table no longer fits in memory, it spills to disk, and
the query time goes up by an order of magnitude with no warning.
2.2 Indexes: why the data structure decides which questions are cheap
Rudolf Bayer and Edward McCreight published the B-tree in 1972 (Organization and Maintenance of Large Ordered Indices, Acta Informatica). Fifty-four years later it is still the default index in essentially every relational database, which is unusual longevity for anything in computing and worth a moment's respect.
The mechanism, in one paragraph: a B-tree keeps keys in sorted order in a shallow, wide tree. Finding a value takes a number of steps proportional to the logarithm of the table size — so going from a million rows to a billion rows adds roughly two or three disk reads, not a thousand times more work. That logarithm is the whole trick.
2.3 Transactions: the guarantee, and the fine print
Jim Gray's 1981 paper The Transaction Concept: Virtues and Limitations formalised the idea; Theo Härder and Andreas Reuter coined the acronym ACID in 1983. It means:
- Atomicity — all of a change happens, or none of it. No half-transfers.
- Consistency — declared rules (constraints) hold before and after.
- Isolation — concurrent transactions do not corrupt each other's view.
- Durability — once committed, it survives a crash.
Atomicity and durability are close to absolute in mature systems. Isolation is where the honesty lives, and where you should push.
Perfect isolation — serializable, meaning the result is identical to running the transactions one at a time — is expensive. So databases offer weaker levels that are faster. In 1995 Hal Berenson, Phil Bernstein, Jim Gray, Jim Melton, Elizabeth O'Neil and Patrick O'Neil published A Critique of ANSI SQL Isolation Levels, showing that the standard's definitions were ambiguous and did not describe what real systems actually did.
2.4 The write-ahead log, and why writes are the hard side
Durability is achieved by writing the intended change to an append-only log before modifying the data itself. If the machine dies, the log is replayed on restart. The canonical treatment is ARIES (C. Mohan et al., IBM, ACM TODS 1992).
inference The advisory consequence: the log is a serialised bottleneck, and it is why read scaling and write scaling are completely different problems. Adding read capacity is easy — copy the data, serve from replicas. Adding write capacity means either a bigger single machine, or splitting the data across machines and giving up the ability to transact across the split. Almost every distributed-database war story is a version of that second sentence.
Key points
- Five machines, five failure modes. Parser, optimiser, executor, access methods, storage — plus transactions and the log cutting across all of them. Diagnose by localising.
- The optimiser guesses, and its guesses degrade as data changes. "It got slow and we didn't change anything" is not a mystery; it is the normal behaviour of a cost-based optimiser meeting new data.
- An index is a bet on which questions get asked. It speeds up the questions matching its ordering, slows down every write, and does nothing for the rest.
- Isolation is the soft part of ACID. Ask what level you run at. Wrong answers under concurrency arrive silently.
- Reads scale easily; writes do not. Any vendor claim of unlimited scale is a claim about reads unless it explicitly says otherwise.
Section 3
Data modelling — the load-bearing layer
The discipline underneath both database engineering and data science. It is where most expensive failures are actually born, and it is the one nobody owns.
You asked whether databases become easy if you are a good data scientist. The honest answer is that the question has the layering wrong, and this section is why.
Between "we have a database" and "we can answer questions" sits a decision nobody thinks of as technical: what are the things, what is true about them, and at what level of detail do we record it? This is data modelling. It is not statistics and it is not engineering. It is closer to ontology, and it is done — well or badly, explicitly or by accident — before either discipline can do anything useful.
3.1 Grain: the single most consequential decision
Grain means: what does one row represent? It sounds trivial. It is not, and getting it wrong is unrecoverable without a rebuild.
Consider a consulting firm recording client work. One row per engagement? Per invoice? Per consultant-day? Per timesheet entry? Each choice makes an entire class of question answerable and another class permanently unanswerable. If you record one row per invoice, you cannot ever ask about utilisation by consultant, because the information was never captured — no amount of analytical sophistication recovers it. The data scientist arrives two years later, is asked about utilisation, and produces an estimate. The estimate is presented with confidence intervals. The confidence intervals are meaningless, because the uncertainty is not statistical — it is that the quantity was never measured.
3.2 Normalisation: what it actually prevents
Codd's normal forms (1970–74) are widely taught as tidiness rules. They are not. They are a defence against a specific class of corruption: update anomalies — states in which the database can hold two contradictory answers to the same question.
The underlying concept is the functional dependency: attribute B is functionally dependent on A if knowing A determines B. Knowing an employee ID determines their date of birth. Normalisation says, roughly: every fact should be stored in exactly one place, determined by the key of the table it lives in. Third normal form is often summarised as — every non-key attribute depends on the key, the whole key, and nothing but the key.
-- UNNORMALISED. One row per order line; client data repeated on every line.
order_id | line | product | client_name | client_city | client_vat
---------+------+-----------+----------------+-------------+-------------
4471 | 1 | Advisory | Nordisk A/S | Aarhus | DK18475902
4471 | 2 | Workshop | Nordisk A/S | Aarhus | DK18475902
4488 | 1 | Advisory | Nordisk AS | Århus | DK18475902
^^^^^^^^^^^ ^^^^^ same client — which is true?
-- The three anomalies this creates:
-- UPDATE: client moves city — you must change every row. Miss one and the
-- database holds two contradictory cities, neither flagged wrong.
-- INSERT: you cannot record a new client until they place an order. The fact
-- "this client exists" has nowhere to live.
-- DELETE: deleting the last order for a client erases the client entirely.
-- NORMALISED. Each fact stated once, in the table whose key determines it.
CREATE TABLE clients (
client_id INT PRIMARY KEY, ← the determinant
name TEXT NOT NULL,
city TEXT,
vat_number TEXT UNIQUE ← one client per VAT number, enforced
);
CREATE TABLE order_lines (
order_id INT,
line_no INT,
product TEXT NOT NULL,
client_id INT REFERENCES clients(client_id), ← the DB refuses orphan rows
PRIMARY KEY (order_id, line_no)
);
Read what the normalised version buys, because it is not aesthetics. UNIQUE on the
VAT number means the database will now refuse to create a duplicate client. REFERENCES
means it will refuse to record an order against a client that does not exist. These are business
rules, enforced by the engine, for every application that ever touches this data — including ones
written after everyone involved has left the company.
inference This is the part that matters for your advisory work. A constraint in the database is a rule the organisation cannot accidentally break. A rule enforced in application code is a rule that holds until someone writes a second application. Most "our data quality is terrible" situations are organisations that chose the second option, usually without knowing they were choosing.
3.3 The counter-argument, stated properly
Normalisation has a real cost: answering a question now requires joins, and joins are work. The standard response is denormalisation — deliberately duplicating data to avoid joins. Every NoSQL system of the 2010s made this its headline pitch.
Stonebraker and Pavlo's 2024 review dismantles the pitch in three clauses that are worth memorising, because you will hear the pitch again:
Point (3) is the deep one and it connects straight back to Section 1. Pre-joining bakes an access path into the stored layout — which is precisely what Codd's 1970 paper set out to abolish. You have re-invented the navigational database, with better hardware.
established That said, denormalisation is genuinely correct in one setting, and this is not a concession — it is the industry's settled position. In analytical systems, where data is written once and read many times and nothing is being updated in place, the update anomalies cannot occur. This is why the analytical world uses a deliberately denormalised design.
3.4 The star schema, and why it won
Two architectures fought over enterprise data warehousing in the 1990s. Bill Inmon (Building the Data Warehouse, 1992) argued for a normalised, enterprise-wide warehouse as the single source of truth, with departmental marts derived from it. Ralph Kimball (The Data Warehouse Toolkit, 1996) argued for dimensional modelling: build conformed subject-area marts directly, organised as facts surrounded by dimensions.
established Kimball's dimensional approach won the practical argument, and the star schema remains the default shape of analytical data in 2026 — it survived Hadoop, the death of Hadoop, the cloud warehouse, and the lakehouse essentially unchanged. inference My read on why: Inmon's design optimises for correctness-at-the-enterprise-level, which requires enterprise-level agreement before delivering value. Kimball's optimises for delivering one usable subject area quickly. Organisations reliably choose the thing that ships, and the enterprise model that requires universal agreement before it produces anything is a model that never produces anything.
3.5 Where the meaning goes to die
Two mechanisms silently destroy the meaning of data over time. Both are modelling problems, and both are invisible in any dashboard.
Slowly changing dimensions. A client moves from "mid-market" to "enterprise". If you overwrite the attribute, every historical report changes retroactively — last year's revenue mix shifts because a category label changed today. If you version the row instead (Kimball's "Type 2"), history is preserved but every query must now specify as of when. Most organisations overwrite, because it is easier, and then are puzzled that the same report run twice gives different answers. established This is a documented, named, solved problem that is nonetheless still one of the most common causes of untrustworthy corporate reporting.
Semantic drift. The column is called active_customer. In 2019 it
meant "purchased in the last 12 months." In 2022 someone changed it to "has a live contract." The
column name did not change. No documentation records the change. Every trend line crossing that
boundary is now measuring two different things and presenting them as one.
inference I would argue this is the single most under-diagnosed
cause of bad executive decisions from good-looking data, precisely because it is invisible: the
chart is smooth, the pipeline is green, the number is wrong.
Key points
- Grain is the decision that cannot be undone. What one row represents determines which questions are answerable forever. Ask it first, ask it of every dataset.
- Normalisation prevents contradiction, not untidiness. Constraints in the database are organisational rules that cannot be accidentally broken; the same rule in application code lasts until the second application.
- Denormalise for analytics, normalise for operations. The split is not fashion — it follows from whether data is updated in place.
- Kimball's star schema is still the default analytical shape thirty years on, and is also the shape LLMs handle best. That is not a coincidence: it is uniform and self-describing.
- The failure you will meet most often is semantic, not technical. A definition changed and the column name didn't. There is no tool that detects this — only documentation discipline and someone who remembers.
- Modelling failures masquerade as analytics failures. When the answer looks wrong, check what was measured before you check how it was analysed.
Section 4
Six decades, six arguments
The history is not a march of progress. It is one argument, restaged roughly every twelve years, with better hardware each time.
There is a reason to learn this history rather than just the current state, and it is not cultural literacy. The field has a documented pattern: a new workload appears, someone declares the relational model obsolete, builds a system that abandons it, discovers over five to eight years why the abandoned parts existed, and re-adds them. Michael Stonebraker and Andrew Pavlo have now written this paper twice — in 2005 and again in 2024 — and the second one is largely a list of which predictions from the first came true.
inference For an advisor this is directly monetisable. If you can recognise which stage of the cycle a proposal sits in, you can price its risk without understanding its implementation. A technology in year two of the cycle is being sold on the things it removed; the same technology in year seven is being sold on having added them back.
4.1 What actually happened in the NoSQL decade
This is the era most worth understanding properly, because it is the one whose vocabulary is still in circulation and whose lessons are most frequently mis-stated.
Between 2003 and 2007 Google and Amazon published a run of papers describing systems built for problems almost nobody else had. Google's The Google File System (2003), MapReduce (2004) and Bigtable (2006); Amazon's Dynamo (2007). These were honest engineering documents about running at a scale where individual machine failure is constant rather than exceptional.
The industry read them as a general recommendation. It was not. Amazon's Dynamo paper is explicit that it was built for the shopping cart — a workload where losing a write is worse than briefly showing an inconsistent state, and where there are no joins because there is nothing to join. inference The mass adoption that followed was, in most cases, organisations with a few million rows adopting an architecture designed for constant hardware failure at planetary scale, and paying its costs without needing its benefits.
The costs were real and specific:
- "Schemaless" moved the schema, it did not remove it. The structure still exists; it now lives implicitly in every application that reads the data, undocumented and unenforced. Five years later, nobody knows which of the seven shapes in the collection are still valid.
- No joins meant application-side joins. Fetch, fetch again, combine in application code — which is a hand-written nested-loop join without an optimiser, over the network.
- Eventual consistency is a programming model, not a setting. It requires the application to handle stale reads and conflicting writes explicitly. Most did not; they simply had rare, undiagnosable bugs.
established The resolution is documented and not seriously disputed: by the end of the 2010s essentially every major NoSQL system had added a SQL or SQL-like query interface — DynamoDB (PartiQL), Cassandra (CQL), Couchbase (N1QL), MongoDB (an aggregation framework plus later SQL support). Hadoop, the era's flagship, is characterised by Stonebraker and Pavlo as having "died about a decade ago." The relational parts came back because the reasons for them had not gone away.
4.2 The one genuinely new thing: separating storage from compute
Not everything is a restaging. The cloud data warehouse — Snowflake's architecture paper is the canonical description (Dageville et al., SIGMOD 2016) — made a change that has no clean historical precedent in its consequences.
Traditional databases couple storage and compute in one machine: to store more you buy a bigger box, and the box's CPU sits idle most of the time. Snowflake put the data in cloud object storage (S3) and made compute clusters ephemeral things you spin up against it. The effects:
- Storage and compute scale independently. Ten times the data does not require ten times the CPU.
- Multiple isolated compute clusters read the same data — finance's heavy month-end job cannot slow down the product team.
- Cost becomes a variable, per-second operating expense rather than a capital purchase.
inference That last point is the one with organisational consequences, and it is under-discussed. When query cost is metered per second, a badly-written query stops being a technical annoyance and becomes a line item. Several of the "our cloud data bill exploded" stories you will encounter are not procurement failures — they are the direct result of removing the natural ceiling that owning a fixed-size machine used to provide.
Stonebraker and Pavlo note the pattern-recognition point here too: this is the return of the 1970s shared-disk architecture, which failed at the time and works now because networks got fast enough. Their prediction is that shared-disk now dominates and shared-nothing is unlikely to return. That is a real, falsifiable, non-obvious claim from people with standing.
Key points
- The field runs a ~12-year cycle: new workload → abandon relational → rediscover why it existed → re-add it. Knowing where a proposal sits in the cycle prices its risk.
- Google and Amazon's papers were honest; the industry's reading of them was not. They described solutions to problems most companies did not have.
- "Schemaless" relocates the schema into application code. That is a cost, and it is paid later, by someone else.
- Separating storage from compute is the real structural innovation of the cloud era — and it converted database capacity from a capital constraint into a metered variable cost, with all the governance implications that implies.
- Test any "we've moved beyond X" pitch against the cycle. Ask what was removed, who now performs that function, and what the plan is for when it needs to come back.
Section 5
The types, and what each is really for
Category names are marketing. The real taxonomy has two axes: what shape the data is stored in, and what the system gives up.
Vendors present the landscape as a dozen distinct product categories. It is more useful to see it as a small number of engineering decisions, recombined. The two that explain most behaviour are row-oriented versus column-oriented storage, and single-node versus distributed. Almost everything else is a feature, not an architecture — a point Stonebraker and Pavlo make sharply about vector databases in particular.
5.1 Rows versus columns — the split that defines the industry
This is the most useful single distinction in the field and it is entirely graspable.
5.2 The categories, honestly described
| Category | Mechanism | Genuinely right when | Wrong when | Status, mid-2026 |
|---|---|---|---|---|
| Relational OLTP Postgres, MySQL, SQL Server, Oracle |
Row store, B-tree indexes, cost-based optimiser, full ACID transactions. | Almost always, for anything that records what a business did. The default, and the burden of proof is on alternatives. | Analytical scans over hundreds of millions of rows; write volumes beyond one large machine. | dominant Postgres has become the sector's centre of gravity. |
| Analytical / columnar Snowflake, BigQuery, Databricks, ClickHouse, Redshift |
Column store, compression, vectorised execution, storage separated from compute. | Aggregations over large history; many concurrent analysts; BI and reporting. | Single-row lookups; frequent in-place updates; anything needing sub-10 ms latency. | dominant The analytical default. |
| Embedded / in-process SQLite, DuckDB |
A library inside your program — no server, no network. SQLite row-oriented; DuckDB columnar. | Local analysis; single-machine data up to hundreds of GB; anything on a laptop; embedded in an application. | Many concurrent writers across machines. | rising fast DuckDB has quietly eaten a large share of "we need a cluster" work. |
| Key-value Redis, DynamoDB, Aerospike |
A distributed hash map. Get and put by key; nothing else. | Caching, sessions, rate limits, feature flags — where the access pattern is genuinely one key at a time. | Anything you will later want to query by a second attribute. This always arrives. | stable niche Correct and durable within its niche. |
| Document MongoDB, Couchbase, Firestore |
Stores JSON-ish documents; secondary indexes; flexible per-document structure. | Genuinely heterogeneous nested content read as a whole — CMS, product catalogues, event payloads. | Data with real relationships. Cross-document consistency. Anything reported on. | converging Adding SQL and transactions; relational systems added JSON. The categories are merging. |
| Wide-column Cassandra, HBase, Bigtable |
Partitioned, sorted rows across a cluster; tuneable consistency; very high write throughput. | Enormous write volumes with a known, fixed access pattern — telemetry, time-ordered event logs. | Ad-hoc querying. The access pattern must be decided before the schema, and cannot change cheaply. | niche Stonebraker & Pavlo: "Without Google, this paper would not be talking about this category." |
| Search Elasticsearch, OpenSearch, Solr |
Inverted index — term → list of documents containing it. Relevance ranking (BM25). | Full-text search over large corpora; log exploration; faceted navigation. | Used as a system of record. It is not transactional and is not designed to be. | stable Though relational full-text search now covers many cases. |
| Time-series TimescaleDB, InfluxDB, Prometheus |
Columnar storage partitioned by time, with time-aware compression and downsampling. | Sensor, metric and monitoring data at high ingest rates with time-window queries. | The volume is modest — a partitioned relational table handles a great deal more than people expect. | stable niche Increasingly delivered as a Postgres extension rather than a separate product. |
| Graph Neo4j, TigerGraph |
Nodes and edges as first-class citizens; traversal rather than join. | Variable-depth traversal is the core workload — fraud rings, ownership chains, network topology. | The graph is a modest part of the workload. Relational systems simulate graphs well. | contested SQL:2023 added property-graph queries. Stonebraker & Pavlo report SQL/PGQ in DuckDB outperforming a leading graph DBMS by up to 10×, and predict a small market. |
| Vector pgvector, Pinecone, Qdrant, Weaviate |
Approximate nearest-neighbour indexes (HNSW, IVF) over embedding vectors — "find things semantically near this." | Semantic retrieval, recommendation, RAG over documents. | Treated as a separate system when your relational database has the extension and your corpus is under a few tens of millions of vectors. | absorbing Stonebraker & Pavlo: such indexes are "a feature, not the foundation of a new system architecture." |
| Distributed SQL Spanner, CockroachDB, TiDB, YugabyteDB |
Data sharded across nodes with consensus replication (Paxos/Raft) preserving ACID transactions across shards. | You genuinely need both global scale and real transactions, and can pay the latency cost of cross-node consensus. | You do not. One large relational instance with replicas covers the overwhelming majority of businesses. | slower than predicted Stonebraker & Pavlo attribute the muted uptake to existing systems being "good enough for the time." |
| Lakehouse Iceberg, Delta Lake, Hudi + a catalog |
Parquet files in object storage plus a metadata layer that adds tables, schema evolution, and transactions on top. | Large volumes, several engines needing the same data, an explicit goal of avoiding storage lock-in. | Under a few terabytes. The operational complexity is real and buys nothing at that size. | consolidating Iceberg has effectively become the standard; Delta and Iceberg converged in 2026. |
| Hierarchical / network IMS, IDMS, CODASYL |
Navigational pointer structures. | Never, for new work. | — | legacy Still running core banking and insurance. Migrations remain some of the most expensive projects in enterprise IT. |
| Object-oriented, XML native ObjectStore, MarkLogic-era XML DBs |
Persist application objects / XML documents directly. | Never, for new work. | — | obsolete Both lost decisively. Their good ideas were absorbed into relational type systems. |
Key points
- Row versus column is the split that actually predicts behaviour. If you learn one thing from this section, learn to ask which one you are looking at.
- The categories are converging, not proliferating. Document stores added SQL; relational systems added JSON, vectors, full-text, time-series and graph queries. The 2016 diagram of "the modern data stack" has more boxes than the 2026 one needs.
- "It's a feature, not an architecture" is the most useful sentence for evaluating any new database category. Apply it to vectors, and be ready to apply it to whatever is next.
- Postgres is the correct default for most mid-size organisations, and the burden of proof sits with anyone proposing something else. The counter-argument is real and given in §7.
Section 6
Possibilities and hard limits
Some constraints are engineering problems that money solves. Others are theorems. Knowing which is which is most of the value of this section.
6.1 The theorem: you cannot have everything during a network failure
Eric Brewer proposed the CAP conjecture in a 2000 keynote; Seth Gilbert and Nancy Lynch proved a formalised version in 2002 (SIGACT News 33(2)). The claim, stated precisely, is narrower than the way it is usually quoted:
When a network partition occurs — some nodes cannot talk to others — a distributed system must choose between remaining available (answer, possibly with stale data) and remaining consistent (refuse to answer rather than risk being wrong). You cannot have both, and this is a proof, not an engineering limitation. No vendor will ever solve it.
6.2 The physics: latency numbers worth memorising
These are order-of-magnitude figures, stable for a decade, and they explain more architectural decisions than any vendor document.
6.3 The scaling ladder
Each rung costs more in complexity than the one before, and most organisations climb further than they need to. inference The most common architectural error I would expect you to encounter in mid-size companies is not being on too low a rung — it is being on rung 4 or 5 with a workload that rung 2 handles comfortably.
- One machine, bigger. Unfashionable and frequently correct. A current commodity server handles workloads that required a cluster in 2012. Complexity cost: nearly zero.
- Read replicas. Copies serving reads. Cheap and effective, because most workloads are read-heavy. Cost: replicas lag, so reads may be slightly stale — which is fine until someone writes then immediately reads and gets their own old data.
- Caching. Redis or similar in front. Big win, and introduces the second-hardest problem in computing: knowing when the cached copy is wrong.
- Splitting workloads. Operational database plus a separate analytical one, fed by a pipeline. This is where most mid-size companies correctly land. Cost: two systems, a pipeline, and a permanent question about which numbers are authoritative.
- Sharding / distributed SQL. Data split across machines by key. Real horizontal write scale. Cost: cross-shard transactions and cross-shard joins become slow or impossible, and rebalancing is a project.
- Multi-region. Geographic distribution. Cost: the speed of light, permanently, on every consistent write.
6.4 What databases genuinely cannot do
- Tell you whether the data is true. Constraints enforce internal consistency, never correspondence with reality. A database will faithfully store a decade of a mis-calibrated sensor.
- Preserve meaning across a definition change. §3.5. No system detects this.
- Give strong consistency and low latency across continents. Theorem plus physics.
- Make an unrecorded fact recoverable. If the grain was wrong, the information is gone.
- Answer a question nobody has defined. "Active customer" has no technical meaning. The organisation has to decide, and usually has not.
Key points
- CAP is a theorem about partitions only. PACELC is the frame that describes every ordinary day: latency or consistency, on every request.
- Memorise the latency ratios. RAM→SSD is ~1,000×; local→intercontinental is ~200×. They explain most architecture, and they are not negotiable.
- Climb the scaling ladder reluctantly. One large machine plus replicas plus a separate analytical store covers the overwhelming majority of mid-size companies.
- The limits that will actually hurt a client are semantic, not technical. Unrecorded facts, changed definitions, undefined terms. None have a product solution.
Section 7
Choosing and using: the advisor's heuristics
You will rarely be the one choosing. You will often be the one deciding whether to believe the person who did.
7.1 The default, and the honest case against it
plausible For a company of 200–1,000 people, the correct starting architecture is almost always: one well-run PostgreSQL instance with read replicas, plus a separate columnar system when analytics outgrows it. Postgres now covers JSON documents, full-text search, geospatial (PostGIS), time-series (TimescaleDB), and vector search (pgvector) through extensions, which removes the original reason most organisations ran four databases.
This has become close to conventional wisdom, which is exactly when to look for the strongest counter-argument. It exists, and it comes from people with standing on both sides. In discussion of the 2026 "just use Postgres" position, a former Citus Data engineer — Citus being a Postgres scaling company, so the person is if anything predisposed to the pro-Postgres view — makes the concrete objection: organisations underestimate "the CAPEX and OPEX required to make Postgres work well for workloads it wasn't designed for, at even reasonable scale," and describes companies running "solid-sized teams of Postgres experts whose primary job was constant tuning, operating, and essentially babysitting the system."
inference Both positions are correct at different scales, and the resolution is a question rather than a rule. The generalist default is right until you have a workload whose specialist demands exceed your ability to staff generalist operations for it. For a 400-person company that is a genuinely high bar. For a company whose product is data — analytics at scale, high-frequency telemetry, real-time personalisation — it can be crossed in year one. Note also that both sides of this argument have commercial interests, which is normal and does not make either wrong.
7.2 Eight questions that separate signal from pitch
Ordered roughly by how much they reveal per second spent.
- "What does one row represent?" — §3.1. Hesitation here predicts everything downstream.
- "Is this workload transactional or analytical?" If the answer is "both", the architecture will be a compromise and someone should say so out loud.
- "What are we giving up?" Every database is a set of trades. A pitch that names no trade-off is a pitch that has not been thought through, or is not being told to you.
- "How much data, really?" Ask for a number. The gap between perceived and actual volume is routinely two orders of magnitude, and it changes the answer completely. Modern single-machine tools handle hundreds of gigabytes comfortably.
- "What isolation level do we run at?" — §2.3. A precise answer signals a team that thinks about correctness. A blank look is a genuine finding.
- "Who owns the definition of this metric, and when did it last change?" — §3.5. The most valuable question on the list, and the one least likely to have an owner.
- "What happens when this is wrong?" Distinguishes a system needing strong consistency from one where eventual is fine. Most teams have never separated the two.
- "Show me the query plan for the slowest report." — §2.1. You are not auditing it. You are finding out whether anyone has ever looked.
7.3 Six things that should make you slow down
- The pitch is framed as modernisation, not as a trade. §4.1. This is the single most reliable tell in the entire field.
- "Schemaless" or "flexible schema" offered as a benefit. The structure has been moved, not removed — into application code, undocumented.
- Scale requirements stated without numbers. "Web scale", "enterprise grade", "billions of records" with no measurement behind them.
- A new database category with one product name attached. The category may be a feature. Ask whether the incumbent's extension does it, and what the gap actually is.
- Benchmarks supplied by the vendor being benchmarked. Always. Not because vendors lie, but because they choose the workload.
- An AI-analytics claim with an accuracy number but no description of the question set. §11 shows how far apart those numbers can be depending on what was asked.
Key points
- One relational database plus a columnar analytical store is the right shape for the great majority of mid-size companies. Deviations should be argued for, not assumed.
- The counter-argument to the generalist default is operational, not technical — specialist workloads on a generalist system consume expert staff time. That cost is real and is usually invisible in the business case.
- Ask what is being given up. If nothing is, you are being sold to.
- "Modernisation" framing is the tell. Every era's mistake arrived dressed as progress rather than as a choice.
Section 8
Where databases sit in the stack
The database is never alone. Understanding its neighbours is what lets you locate a problem rather than just observe it.
The canonical modern arrangement has two halves that mirror the row/column split of §5.1: an operational side that records what happens, and an analytical side that explains it. A pipeline connects them, and that pipeline is where truth most often goes missing.
8.1 Three neighbours worth understanding properly
The ORM. Object-relational mappers (Hibernate, Django ORM, ActiveRecord, SQLAlchemy) let developers work with objects while the library generates SQL. This is the practical resolution of the "impedance mismatch" that object databases failed to solve in the 1990s. The cost is that query cost becomes invisible: a loop over 500 objects can silently issue 501 queries — the "N+1 problem", and the most common performance bug in application development. Stonebraker and Pavlo's position is unusually direct: "Developers need to query their database directly", because ORMs conceal the optimisation opportunities that raw SQL exposes.
Change data capture. Rather than periodically copying tables, CDC reads the database's own write-ahead log (§2.4) and emits every change as a stream. It is elegant — the log already exists for durability, so this is nearly free — and it turns "sync nightly" into "sync continuously". inference Its second-order effect is more interesting than its first: once changes stream continuously, the distinction between the operational and analytical halves starts to blur, which is much of what the "real-time data" market is actually selling.
Retrieval-augmented generation. The now-standard pattern for pointing a language model at private data: chunk documents, embed each chunk as a vector, store the vectors, retrieve the nearest ones to a question, and put them in the prompt. Worth being precise about what this is and is not. RAG retrieves similar text. It does not compute, aggregate, or reason over structured records. inference A great deal of disappointment in 2024–25 enterprise AI came from pointing RAG at questions that were arithmetic over a database — "what was Q3 revenue in the Nordics" is not a semantic-similarity problem, and a vector index is the wrong instrument for it. The right instrument is a query, which is §11's subject.
Key points
- Two halves, one seam. Operational records; analytical explains; the pipeline between them is where meaning is lost. Investigate the seam first.
- The semantic layer moved from optional to structural the moment machines started writing the queries. This is the most consequential architectural shift currently underway.
- ORMs trade visibility for convenience. Fine, until the N+1 query.
- RAG is similarity retrieval, not analysis. Matching it to the wrong question type is a leading cause of failed AI pilots.
Section 9
The leading edge, mid-2026
Four movements with genuine momentum, and one honest assessment of what is still unresolved.
9.1 Open table formats have effectively won the storage layer
established The proprietary-storage era of the cloud warehouse is closing. Data increasingly lives as Parquet files in object storage, with an open table format — principally Apache Iceberg — supplying tables, schema evolution, and transactions on top. Databricks put Iceberg v3 into public preview in April 2026, adopting natively the three features that had been Delta Lake's differentiators (deletion vectors, row lineage, and a VARIANT type for semi-structured data), which substantially collapses the Delta-versus-Iceberg distinction that occupied the market for five years.
inference The strategic consequence is the one to carry into a board conversation. When storage is an open format that any engine can read, the query engine becomes a swappable component and vendor lock-in shifts from the data itself to the catalog — the metadata service that tracks tables, schemas and permissions. That is where the commercial fight has moved. "Which catalog, and can we leave it?" is now a more consequential procurement question than which warehouse.
9.2 The small-data counter-revolution
DuckDB — an in-process analytical database, columnar, no server, from CWI Amsterdam — has made a serious argument that most organisations calling themselves big-data are not. A large fraction of real analytical workloads fit on one machine, and a single machine with no network is dramatically simpler and faster than a cluster.
The same group has pushed this further with DuckLake (v1.0, April 2026), whose manifesto makes a pointed argument about lakehouse design. Iceberg and Delta encode metadata as files in object storage — "a maze of JSON and Avro files" — which makes small changes expensive and requires many sequential HTTP round-trips to plan a query. But both already require a database for their catalog. Their conclusion:
inference Whether or not DuckLake specifically wins, note the shape of the argument — it is §4's cycle, exactly on schedule. An era abandoned the database for scale reasons, built increasingly elaborate machinery to recover what the database provided, and is now being told to use a database.
9.3 Consolidation, not proliferation
established The direction of travel is toward fewer systems. Vector search arrived in 2023 as a new product category and was absorbed into mainstream relational databases within roughly a year — considerably faster than JSON was a decade earlier. Stonebraker and Pavlo's read is that specialised vector systems are "essentially document-oriented DBMSs with specialized ANN indexes," and that "such indexes are a feature, not the foundation of a new system architecture." Their broader prediction: "NoSQL systems are on a collision course with RDBMSs. The differences … have diminished over time and should become nearly indistinguishable in the future."
9.4 The unresolved one: machines as the primary query author
This is the live frontier and the one where I would counsel the most caution, because the evidence is genuinely mixed and the marketing is not.
Stonebraker and Pavlo — who have no product to sell here — note that natural-language database interfaces are "an old research topic that dates back to the 1970s, but which historically has poor outcomes," and add: "We acknowledge LLMs have impressive results for this task but caution those who think NL will replace SQL." They also observe a specific enterprise hesitancy: "There is a reluctance to depend on current LLM technology for decision-making inside the enterprise, especially with financial data," because the outputs are not explainable to a human.
The countervailing development is architectural rather than model-level: the semantic layer of Figure 7. Giving a model executable definitions of business concepts, rather than raw table structures, measurably improves accuracy. §11 has the numbers, including what they still leave on the table.
Key points
- Open table formats won; the lock-in moved to the catalog. Change the procurement question accordingly.
- "How much data, really?" Single-machine tools have moved the threshold at which distributed systems are justified up by roughly two orders of magnitude since 2015.
- Categories are consolidating. Assume a new database category will become a feature of an existing system within two to three years, and price accordingly.
- Natural-language querying is real, partial, and being oversold. The serious work is in the semantic layer, not the model.
Section 10
Data science: the essentials
Four different jobs wear the same job title. Most confusion in the field — and most disappointment with it — comes from not distinguishing them.
10.1 The four jobs
These require different methods, different data, and different standards of evidence. Conflating them is the field's most expensive habit.
| Job | The question | What it needs | How it fails |
|---|---|---|---|
| Description | What happened? | Correct data, agreed definitions, correct grain. No statistics at all. | Silently, through definition drift and wrong grain. The chart looks fine. §3.5. |
| Prediction | What will happen? | Labelled historical examples; a future that resembles the past. | Loudly at first, then silently as the world drifts away from the training data. |
| Inference | How confident can we be? | A sampling model; an honest account of uncertainty. | By reporting precision that the data cannot support. |
| Causation | What happens if we act? | An experiment, or a defensible identification strategy for observational data. | Catastrophically — it drives a decision, and correlation was never causation. |
inference The one worth pressing on in a client setting is the gap between rows two and four. A model that predicts churn accurately does not tell you what to do about churn. Customers who contact support churn more — that is predictive and real. It does not follow that reducing support contact reduces churn; the contact is a symptom. Organisations act on predictive models as if they were causal ones routinely, and the resulting decisions are occasionally the exact opposite of correct.
10.2 Breiman's two cultures
Leo Breiman — a Berkeley statistician who invented random forests — published Statistical Modeling: The Two Cultures in Statistical Science in 2001. It is the single most useful paper for understanding what data science actually is and why it caused friction.
His argument: statistics had split into two cultures. The data modelling culture assumes the data were generated by a stochastic model (linear regression, logistic regression), fits its parameters, and interprets them — you get an explanation, in exchange for assuming a structure that is probably wrong. The algorithmic modelling culture treats the mechanism as unknown and optimises purely for predictive accuracy — random forests, boosted trees, neural networks. You get accuracy, and you often lose interpretability.
Breiman argued the first culture's near-monopoly in academic statistics had led to irrelevant theory and poor predictions. established He was substantially vindicated: the algorithmic culture became machine learning and then modern AI. But the trade he named is unchanged, and it is the trade that matters in advisory work. Accuracy and explanation are in tension, and which you need depends on what the answer is for. A model you must defend to a regulator, a board, or a court has an interpretability requirement that a recommendation engine does not.
10.3 The methodological core, in five ideas
- Overfitting. A model complex enough will memorise its training data, including its noise, and perform beautifully there and badly everywhere else. This is why performance is only meaningful on data the model has never seen — the held-out test set. A quoted accuracy figure without a described holdout is not a result.
- The bias–variance trade-off. Too simple and the model misses real structure; too complex and it chases noise. Most of practical modelling is navigating this.
- Cross-validation. Rotating which portion is held out, to get a stable estimate of out-of-sample performance from limited data.
- Leakage. Information from the future, or from the answer, contaminating the training data. The classic case: a feature computed after the outcome it predicts. The symptom is suspiciously excellent performance in development and collapse in production. inference In my reading this is the most common single cause of machine-learning projects that "worked in the pilot".
- Distribution shift. Models assume the future resembles the training past. When the world changes — a pandemic, a pricing change, a competitor exit — the model does not report an error. It reports a confident, wrong number.
10.4 The traps that survive technical competence
These are not beginner errors. They defeat well-trained people, which is why they are worth knowing by name.
- Confounding. A third variable drives both things you are comparing. Ice cream sales and drowning both rise with temperature.
- Simpson's paradox. A trend present in every subgroup reverses when groups are pooled. This is not a curiosity; it appears in real business data whenever group sizes differ, and it means the aggregate number and the segment numbers can both be correct and tell opposite stories.
- Survivorship bias. Analysing only the entities that remain. Studying your current customers to understand churn is studying the people who did not churn.
- Multiple comparisons. Test twenty hypotheses at 95% confidence and roughly one will be "significant" by chance. Dashboards with a hundred metrics are running this experiment continuously and reporting the winners.
- Base rate neglect. A 99%-accurate test for a condition affecting 1 in 1,000 produces about ten false positives per true one. This governs fraud detection, screening, and anomaly alerting, and it is why high-accuracy alerting systems get ignored by the people receiving the alerts.
10.5 What the work actually consists of
The definitive statement is D. Sculley and colleagues at Google, Hidden Technical Debt in Machine Learning Systems (NeurIPS 2015). Its central observation, which has held up for a decade: in a real production machine-learning system, the modelling code is a small fraction of the total, surrounded by a vastly larger mass of data collection, verification, feature extraction, serving infrastructure, configuration and monitoring.
The paper also names failure modes specific to ML that have no equivalent in ordinary software — entanglement (changing any one input changes the meaning of all the others: "CACE" — changing anything changes everything), hidden feedback loops (the model's own outputs influence the data it is later trained on), and undeclared consumers (systems quietly depending on your model's output, so you cannot change it).
Monica Rogati — formerly of LinkedIn, a practitioner rather than an academic — framed the consequence memorably in 2017 as the AI hierarchy of needs: you cannot do machine learning on top of an organisation that cannot reliably collect, move, store, and label its data. The layers below are not preparatory work. They are the work.
Key points
- Description, prediction, inference and causation are four different jobs. Establish which one is being asked for before anything else. Most disagreement about analysis is actually disagreement about which job it was.
- Prediction does not license action. A model that forecasts an outcome says nothing about what changes it. Acting on predictive models as if causal is a live and expensive error.
- Accuracy and explainability trade against each other — Breiman's two cultures. Which you need is a business question, not a technical one.
- An accuracy number without a described holdout is not a result. Ask what was held out and how.
- The modelling is the small part. Sculley et al.: the code that learns is a fraction of a real system. Budget and staff accordingly, or the pilot never becomes production.
- Simpson's paradox and base rates defeat competent people. Know them by name so you can ask about them.
Section 11
The problem taxonomy, and the reliability boundary
Which data problems can an AI agent solve reliably today, which need a human check, and which still require a data scientist and a domain expert in the same room.
This is the question you actually asked, so it gets the most careful treatment and the most explicit evidence. The short version: the boundary is not drawn by task difficulty. It is drawn by two things — whether the answer can be cheaply verified, and how much undocumented organisational context the question secretly requires.
11.1 What the evidence actually shows
Three independent measurements, none from a vendor selling the capability, with numbers that are worth holding precisely because the marketing numbers are so different.
Multi-step analysis is largely unsolved. DABstep (Egg et al., Adyen and Hugging Face, 2025) built 450+ analysis tasks from Adyen's real payments-operations workload, requiring agents to combine structured transaction data with unstructured documentation. Frontier models of that vintage scored roughly 67–81% on the easy split — single-dataset, minimal documentation — and the best managed 14.55% on the hard split, which requires cross-referencing sources and multi-step reasoning. The failure modes named are specific and instructive: agents follow explicit instructions well and fail on implicit rules that must be inferred from documentation; they degrade at planning as steps accumulate.
Text-to-SQL is far harder on real schemas than on benchmarks. The original Spider benchmark, on small clean databases, was largely solved — GPT-4o scored 86.6%. Spider 2.0 rebuilt the task from real enterprise environments: databases with over 1,000 columns, multiple SQL dialects, solutions often exceeding 100 lines. The same model scored 10.1%. inference That 86.6 → 10.1 collapse, on the same underlying skill, is the most useful single number in this entire section, because it quantifies the gap between a demo and an enterprise.
And the benchmarks themselves are unreliable. contested Jin, Choi, Zhu and Kang (University of Illinois, CIDR 2026) hand-audited two leading benchmarks and found annotation error rates of 52.8% in BIRD Mini-Dev and 66.1% in the audited portion of Spider 2.0-Snow — incorrect ground-truth queries, queries that do not match the database, ambiguous questions. Re-scoring five leading agents on corrected examples moved absolute accuracy by −2 to +19 points and shifted rankings by up to three places. Their conclusion: the error rate "undermines the reliability of the leaderboard and fails to accurately reflect the true performance of the agents."
The architectural fix, honestly reported. Giving models a semantic layer — written definitions of business measures and disambiguation rules rather than raw table structures — measurably helps. A 2026 paired benchmark from Cube, a semantic-layer vendor, ran 100 natural-language questions against a retail dataset with and without a 4 KB hand-authored semantic document. Accuracy rose from roughly 45–50% to roughly 68% across three frontier models. inference The improvement is substantial and the direction is almost certainly right. But note what the vendor's own best case is: on a clean retail dataset, with a purpose-written semantic layer, roughly one answer in three is still wrong. That is the number to bring to a client considering unsupervised natural-language analytics.
11.2 The consequence for how you advise
inference Three things follow, and they are more actionable than any tool recommendation.
First, the constraint is the data estate, not the model. The same agent is reliable against a documented star schema with a semantic layer and unreliable against an undocumented warehouse. When a client's AI-analytics pilot disappoints, the model is rarely the variable worth changing — and the vendor will nonetheless propose changing it.
Second, the investment that pays is unglamorous. Writing down what the columns mean, what the metrics mean, which joins are legitimate, which periods are unreliable. This work has never had a sponsor because it never had a visible payoff. It now has one, and this is the strongest practical argument in the primer: semantic documentation has become a capability investment rather than a hygiene cost.
Third, "verify" must mean something specific. "A human reviews the output" is not a control if the human is reviewing a fluent paragraph containing a number they cannot independently derive. The verifiable version is: the agent shows its query, the query runs against known-good definitions, and someone who understands the domain can read the query. That is a real control. It is also the reason a non-technical executive is well served by being able to read SQL — which, of everything on this page, is the thing most worth an afternoon of your time.
Key points
- Verifiability and hidden context set the boundary — not difficulty. Ask how long a confident error would survive undetected.
- 86.6% → 10.1%. Same model, same skill, clean benchmark versus real enterprise schema. Carry this number.
- Benchmark numbers are evidence about benchmarks. Independent auditing found over half the examples in two leading text-to-SQL sets contained annotation errors. Insist on evaluation against the client's own questions.
- The best vendor-reported case for natural-language analytics is still ~68%. On a clean dataset, with a hand-written semantic layer. Plan for the third that is wrong.
- Agents are strong at generating hypotheses and weak at concluding from them. That maps precisely onto exploration versus inference in §10.1.
- Documenting semantics moves problems from amber to green. This is the highest- leverage data investment available to a mid-size company in 2026, and it requires no new platform.
Section 12
The map
Everything above, on one page, arranged by what causes what.
The shape of this map is the argument of the primer. Two outer spines — how the machine works, and what people do with it — and a spine down the middle that both depend on and neither owns. That middle spine is meaning, and the crossing lines are where it leaks.
The whole primer in six sentences
- A database separates what you want from how it is fetched; everything else in the field is a consequence of, or a rebellion against, that separation.
- The storage layout is a bet about which questions will be asked — rows for operations, columns for analysis — and it cannot be hedged.
- The decisions that determine what is answerable are made before any tool is chosen: grain, keys, and definitions.
- The field runs a cycle of abandoning and re-adopting the relational model roughly every twelve years; knowing where a proposal sits prices its risk.
- Data science is four different jobs, and the expensive mistake is treating a predictive result as a causal one.
- AI agents are reliable exactly where answers are cheaply checkable and context is written down — which makes writing down your semantics the highest-leverage investment available.
Section 13
Lexicon, 1960–2026
Every term you are likely to hear, tagged by the era that produced it and whether it still means anything. Search it, or filter by era to read the field's development chronologically.
The value of reading this by era rather than alphabetically: you can see the field's arguments recur. Terms marked obsolete are worth knowing precisely because someone will use one, and the usage tells you when their mental model was formed.
| Term | Era | Status | What it means — and what it became |
|---|---|---|---|
| Hierarchical model | 1966 · IBM IMS | obsolete | Data as a strict parent-child tree. A child has exactly one parent, so anything many-to-many required duplication. → superseded by the relational model; IMS installations still run core banking. |
| Network model / CODASYL | 1969 | obsolete | Records linked by explicit pointer "sets", allowing many-to-many. More expressive than hierarchical, equally welded to storage. → the model Codd argued against. |
| Navigational access | 1960s–70s | obsolete | The programmer walks the pointer structure record by record. Bachman's Programmer as Navigator (Turing lecture, 1973). → replaced by declarative querying; conceptually resurrected every time someone "pre-joins for performance". |
| ISAM | 1966 | obsolete | Indexed Sequential Access Method — an early index over a sorted file. → the ancestor of the modern index. |
| Batch / master file | 1960s–70s | fading | Accumulate transactions, process them overnight against a master file. → survives as "nightly batch", which streaming and CDC are steadily eroding. |
| Record · field | 1960s | current | Pre-relational vocabulary for what relational theory calls a tuple and an attribute, and what everyone actually says: row and column. |
| Relational model | 1970 · Codd | current | Data as mathematical relations — unordered sets of tuples, no pointers. The foundation of everything since. |
| Physical data independence | 1970 | current | Users are insulated from how data is stored. The single most consequential idea in the field. → what every "schemaless" system gives up. |
| Relation · tuple · attribute | 1970 | current | The formal terms for table, row, column. Used when precision matters; "table/row/column" otherwise. |
| Relational algebra / calculus | 1970–72 | current | The operator set (select, project, join, union, difference) that SQL compiles down to. Still the internal language of every query engine. |
| Normalisation · 1NF/2NF/3NF/BCNF | 1970–74 | current | Organising tables so each fact is stored once, preventing update/insert/delete anomalies. Not tidiness — a defence against contradiction. |
| Functional dependency | 1971 | current | A determines B: knowing A fixes B. The formal machinery underneath normal forms. |
| Primary / foreign / candidate key | 1970 | current | The identifier of a row; a reference to another table's identifier; any attribute set that could serve as identifier. |
| Referential integrity | 1970s | current | The engine refuses to store a reference to a row that does not exist. A business rule no application can accidentally break. |
| B-tree | 1972 · Bayer & McCreight | current | Balanced, shallow, sorted index structure. Lookup cost grows with the logarithm of table size. Still the default index in 2026. |
| SEQUEL → SQL | 1974 · Chamberlin & Boyce | current | Structured English Query Language, renamed for trademark reasons. Codd himself disliked parts of it — notably duplicate rows and three-valued logic with NULLs. |
| System R · INGRES | 1974–79 | current | The two prototypes that proved the relational model practical. System R → DB2 and SQL; INGRES → Postgres, Sybase, SQL Server lineage. |
| Query optimiser · access path | 1979 · Selinger et al. | current | Chooses the cheapest execution plan using cost estimates. The hardest component to build and the source of most surprising behaviour. |
| Cardinality estimation | 1979– | current | The optimiser's guess at how many rows a step will produce. When this guess is badly wrong, the plan is badly wrong. |
| Nested loop · hash · sort-merge join | 1970s–80s | current | The three join algorithms. Nested loop suits small inputs with an index; hash suits large unsorted inputs; sort-merge suits pre-sorted ones. |
| Entity-Relationship model | 1976 · Chen | current | Diagramming notation for entities, attributes and relationships before committing to tables. Still the standard whiteboard language. |
| Schema · DDL · DML | 1970s | current | The structure definition; the language that defines it (CREATE/ALTER); the language that manipulates data (SELECT/INSERT/UPDATE). |
| Transaction | 1981 · Gray | current | A group of operations that succeeds or fails as one unit. Gray's The Transaction Concept is the founding statement. |
| ACID | 1983 · Härder & Reuter | current | Atomicity, Consistency, Isolation, Durability. Atomicity and durability are near-absolute; isolation is where the honest caveats live. |
| Isolation levels | SQL-92 | current | Read Uncommitted / Read Committed / Repeatable Read / Serializable. Most systems default to a weak level. Critiqued as ambiguous by Berenson et al., 1995. |
| Dirty read · non-repeatable read · phantom | 1980s | current | The three classical anomalies the isolation levels are defined against. Worth knowing by name to ask which your system permits. |
| Two-phase locking (2PL) | 1976– | current | Acquire all locks, then release all locks. The classical mechanism for serializability. → largely displaced in practice by MVCC. |
| Two-phase commit (2PC) | 1978– | current | Protocol for committing a transaction across multiple systems. Correct but blocking, and a classic source of distributed stalls. |
| MVCC | 1981– | current | Multi-version concurrency control: readers see a consistent snapshot rather than blocking on writers. Why Postgres readers never block writers. |
| Deadlock | 1970s | current | Two transactions each holding what the other needs. Detected and resolved by killing one — which the application must be prepared to retry. |
| Stored procedure · trigger | 1980s | current | Logic executed inside the database. Fashionable in the 1990s, then unfashionable as logic moved to application code; still correct for integrity-critical rules. |
| View · materialised view | 1980s | current | A saved query presented as a table; a materialised view stores the result and must be refreshed. → the direct ancestor of the semantic layer. |
| SQL-86 · SQL-92 | 1986 / 1992 | current | The ANSI/ISO standards that made SQL portable. SQL-92 remains the practical baseline; later editions added JSON (2016), property graphs and arrays (2023). |
| Codd's 12 rules | 1985 | historical | Codd's criteria for what counts as genuinely relational, published partly to attack products claiming the label. No commercial system fully satisfies them. |
| 4GL · CASE tools | 1980s | obsolete | "Fourth-generation languages" and computer-aided software engineering — promised applications without programming. → the lineage that runs to low-code and, arguably, to today's code generation. |
| Client-server | 1980s | current | Database on a server, application on a client, talking over a network. Still the default shape; embedded databases (SQLite, DuckDB) are the deliberate exception. |
| ODBC · JDBC | 1992 / 1997 | current | Standard connection interfaces that let any tool talk to any database. Unglamorous and load-bearing. |
| OLTP · OLAP | 1990s | current | Online transaction processing (many small reads/writes) versus online analytical processing (few huge scans). The distinction that justifies running two systems. |
| Data warehouse | 1992 · Inmon | current | A separate, integrated, historical store for analysis. Inmon argued for a normalised enterprise-wide design with derived marts. |
| Dimensional modelling · star schema | 1996 · Kimball | current | A central fact table surrounded by dimension tables. Won the practical argument and remains the default analytical shape thirty years on. |
| Fact · dimension · conformed dimension | 1996 | current | What happened (numeric, many rows); the context you slice by; a dimension shared identically across several fact tables so numbers reconcile. |
| Grain | 1996 · Kimball | current | What one row of a fact table represents. The most consequential and least discussed decision in any data design. |
| Slowly changing dimension (Type 1/2/3) | 1996 | current | How to handle an attribute that changes: overwrite (history rewritten), add a versioned row (history preserved), or keep a previous-value column. |
| Snowflake schema | 1990s | fading | A star schema with normalised dimensions. Saves storage, costs joins and clarity. Mostly abandoned — and unrelated to the company of the same name. |
| ETL | 1990s | current | Extract, Transform, Load — transform before loading, because warehouse compute was scarce. → inverted to ELT once cloud compute became cheap. |
| Data mart | 1990s | fading | A departmental subset of the warehouse. → largely dissolved into modelled layers inside a single warehouse. |
| OLAP cube · MOLAP / ROLAP / HOLAP | 1993 | fading | Pre-aggregated multidimensional structures for fast slicing. → made largely unnecessary by columnar engines fast enough to aggregate on demand. |
| Drill down · roll up · slice and dice | 1990s | current | Navigating a dimensional model by changing level of detail or filtering. The vocabulary of every BI tool since. |
| Data mining · KDD | 1990s | superseded | Finding patterns in large datasets; "knowledge discovery in databases". → the same activity is now called machine learning or data science. |
| OODBMS | late 1980s–90s | obsolete | Object-oriented databases storing application objects directly. Lost decisively; the good ideas were absorbed into relational type systems. |
| Impedance mismatch | 1990s | current | The friction between object-oriented code and relational tables. → resolved pragmatically by ORMs rather than by replacing the database. |
| Write-ahead log · ARIES | 1992 · Mohan et al. | current | Log the change before applying it, so a crash can be replayed. → also the mechanism CDC later hijacked to stream changes out. |
| Business intelligence | 1990s | current | Reporting and dashboards over a warehouse. Persistent, if slightly dated, umbrella term. |
| Operational data store | 1990s | fading | An intermediate store of near-current integrated operational data. → mostly replaced by CDC into a lake. |
| Master data management | 1990s–2000s | current | Maintaining one authoritative record of core entities — customer, product, supplier. Perennially difficult, and it is a data-modelling problem wearing a governance costume. |
| Star schema query pattern | 1990s | current | Aggregate a fact measure, grouped by dimension attributes. Its uniformity is what makes both self-service BI and LLM querying feasible. |
| CAP theorem | 2000 Brewer · 2002 Gilbert & Lynch | current | Under a network partition, choose consistency or availability. Frequently misquoted as a general trade-off; it applies only during partitions. |
| Eventual consistency | 2000s | current | Replicas converge in time, absent new writes. A programming model with real obligations, not a configuration setting. |
| BASE | 2000s | fading | Basically Available, Soft state, Eventually consistent — a deliberate rhetorical foil to ACID. Rarely used seriously now. |
| GFS · MapReduce · Bigtable · Dynamo | 2003–2007 | current | The Google and Amazon papers that launched the era. Honest engineering documents about problems most companies did not have. |
| Hadoop · HDFS · MapReduce jobs | 2006–2015 | obsolete | The open-source implementation of Google's stack. Stonebraker & Pavlo: "Hadoop died about a decade ago." → superseded by Spark, then by cloud warehouses and object storage. |
| Hive · Pig | 2008– | obsolete | SQL-ish and scripting layers over MapReduce — the industry admitting within two years that it wanted SQL back. Their metastore outlived them as the ancestor of the modern catalog. |
| NoSQL | 2009 | fading | Umbrella term for non-relational stores; later softened to "not only SQL" as every system in the category added SQL. |
| Key-value · document · wide-column · graph store | 2000s | current | The four NoSQL families. All remain useful in their genuine niches; all have converged toward relational features. |
| Sharding · partitioning | 2000s | current | Splitting data across machines (sharding) or within one (partitioning) by key. Buys write throughput; costs cross-shard transactions and joins. |
| Consistent hashing | 1997 · popularised 2007 | current | Assigning keys to nodes so that adding or removing a node moves as little data as possible. Central to Dynamo and its descendants. |
| Quorum (R + W > N) | 2007 | current | Tuning how many replicas must acknowledge a read or write. The dial that trades consistency against latency and availability. |
| LSM-tree | 1996 · adopted 2000s | current | Log-structured merge tree: buffer writes in memory, flush to sorted files, merge in the background. Why write-heavy stores (Cassandra, RocksDB) beat B-trees on ingest. |
| Bloom filter | 1970 · ubiquitous 2000s | current | A compact structure that answers "definitely not present" or "possibly present". Saves enormous numbers of pointless disk reads. |
| Column store · vectorised execution | 2005 · C-Store | current | Store each column contiguously; process batches of values at a time. Now universal in analytics — every warehouse vendor converted. |
| Denormalisation · pre-joining | 1970s · revived 2000s | current | Duplicating data to avoid joins. Correct for analytical stores; a return to navigational design when used for operational ones. |
| ORM · N+1 problem | 2000s | current | Object-relational mapping libraries, and their signature failure: a loop over N objects silently issuing N+1 queries. |
| Caching layer · memcached · Redis | 2003–2009 | current | An in-memory store in front of the database. Enormous speed win; introduces the problem of knowing when the cached copy is stale. |
| Data lake | ~2010 | current | Raw files in cheap storage, structure imposed at read time. Powerful and, without governance, the origin of the "data swamp" joke. |
| Web scale | 2000s | marketing | Rarely a measurement. Treat as a prompt to ask for numbers. |
| Spanner · TrueTime | 2012 · Google | current | Globally distributed database with real transactions, using atomic clocks and GPS to bound clock uncertainty. Proved global ACID was possible — at a latency price. |
| Paxos · Raft | 1998 / 2014 | current | Consensus algorithms letting a group of machines agree despite failures. Raft (Ongaro & Ousterhout) was explicitly designed to be understandable, and largely displaced Paxos in practice. |
| PACELC | 2012 · Abadi | current | If Partition: Availability or Consistency; Else: Latency or Consistency. The honest extension of CAP, and the half that applies every day. |
| NewSQL | 2011 | fading | Systems promising NoSQL scale with ACID guarantees. Uptake was muted — Stonebraker & Pavlo attribute this to existing systems being "good enough". → the surviving term is "distributed SQL". |
| Separation of storage and compute | 2016 · Snowflake | current | Data in object storage; ephemeral compute clusters against it. The structural innovation of the cloud era — and it turned database capacity into a metered variable cost. |
| Spark · RDD · DataFrame | 2012 | current | In-memory distributed processing that displaced MapReduce. Still widely used, increasingly displaced in turn by warehouse SQL and single-node engines. |
| Kafka · log-based streaming | 2011 | current | A durable, replayable, ordered log as the backbone between systems. Reframed integration from "copy data" to "subscribe to changes". |
| Change data capture (CDC) | 2010s · Debezium | current | Streaming every change out of a database by reading its write-ahead log. Nearly free, because the log already exists for durability. |
| ELT | 2010s | current | Load raw, transform inside the warehouse. The inversion of ETL, made sensible by cheap elastic compute. |
| dbt · analytics engineering | 2016– | current | Managing warehouse transformations as version-controlled, tested SQL. Created a role between analyst and data engineer, and made data modelling a reviewable artefact. |
| Parquet · ORC · Avro | 2009–2013 | current | Open file formats: Parquet and ORC columnar for analytics, Avro row-based for streaming. Parquet is now the de facto standard for analytical data at rest. |
| Object storage (S3 and equivalents) | 2006 · dominant 2010s | current | Effectively unlimited, cheap, durable file storage with high latency. The substrate the entire modern analytical stack sits on. |
| Lambda architecture | 2011 | obsolete | Parallel batch and streaming paths reconciled at query time. Abandoned because maintaining the same logic twice is intolerable. |
| Kappa architecture | 2014 | fading | Streaming only, with reprocessing by replaying the log. Cleaner than Lambda; largely absorbed into ordinary streaming practice. |
| Modern data stack | ~2019 | fading | A category label for the cloud warehouse plus ingestion, transformation and BI vendors. → the constituent tools are now consolidating back together. |
| Data mesh | 2019 · Dehghani | contested | Decentralised, domain-owned data products with federated governance. A genuine organisational insight that proved hard to implement; adoption has cooled markedly. |
| Data contract | ~2022 | current | An explicit, enforced agreement about the schema and semantics a producer guarantees to consumers. The durable idea rescued from the mesh discussion. |
| Feature store | 2017– | fading | Shared repository of ML features, ensuring training and serving compute them identically. Real problem; increasingly solved inside warehouses rather than by a separate product. |
| Polyglot persistence | 2011 | superseded | Use a different database per workload. Sound in theory; in practice it multiplied operational burden. → reversed by the consolidation of §9.3. |
| HTAP | 2014 | contested | Hybrid transactional/analytical processing — one system for both. Attractive; constrained by the row/column physics of §5.1. |
| Reverse ETL | 2020 | fading | Pushing modelled warehouse data back into operational tools. A useful pattern that struggled to be a product category. |
| Data observability · lineage | 2019– | current | Monitoring freshness, volume and schema changes; tracing where a column came from. Lineage is the practical defence against semantic drift. |
| Snapshot isolation · time travel | 1995 · table-level 2019 | current | Reading a consistent point-in-time view; at table-format level, querying a table as it stood last Tuesday. Genuinely valuable for audit and debugging. |
| Open table format | Iceberg 2017 · Delta 2019 | current | A metadata layer over Parquet files giving tables, schema evolution, transactions and time travel. Iceberg has effectively become the standard. |
| Lakehouse | 2021 · Databricks | current | Warehouse-style management over lake-style open storage. Now the mainstream large-scale architecture. |
| Catalog | 2023– | current | The service tracking which tables exist, their schemas and permissions — Unity, Polaris, Nessie, the Iceberg REST spec. Where vendor lock-in moved once storage became open. |
| Deletion vector · row lineage · VARIANT | Iceberg v3, 2026 | current | Mark rows deleted without rewriting files; track per-row change history; store semi-structured data natively. The features that collapsed the Delta/Iceberg distinction. |
| Embedded / in-process analytics | DuckDB 2019– | current | A columnar analytical engine running inside your process, no server. Has moved the threshold at which a cluster is justified up by orders of magnitude. |
| DuckLake | 2025 · v1.0 2026 | emerging | Lakehouse design putting all metadata in a SQL database rather than in files, on the argument that a database was already required for the catalog. |
| Embedding · vector | 2013 · mainstream 2023 | current | A numeric representation of meaning, such that similar things sit near each other. The substrate of semantic search. |
| ANN index · HNSW · IVF | 2016– | current | Approximate nearest-neighbour indexes — trade exactness for speed at scale. Note "approximate": results are probabilistic, unlike a B-tree lookup. |
| Vector database | 2022– | absorbing | Products built solely around ANN search. Being absorbed as extensions to existing databases — "a feature, not the foundation of a new system architecture." |
| RAG | 2020 · mainstream 2023 | current | Retrieval-augmented generation: fetch similar text, put it in the prompt. Retrieval by similarity — not aggregation, computation or reasoning over records. |
| Semantic layer · metrics layer | 2020s | rising | Business definitions expressed once, executably — measures, permitted joins, disambiguation rules. Optional for humans; structural for agents. |
| Text-to-SQL · NL2SQL | 1970s · revived 2023 | current | Natural language to executable query. Genuinely improved and still far weaker on real enterprise schemas than benchmark figures suggest. |
| Agentic analytics | 2024– | emerging | An LLM agent planning and executing multi-step analysis. Strong on well-specified single-source tasks; measured at roughly 15% on multi-step enterprise tasks (DABstep). |
| Model Context Protocol (MCP) | 2024– | emerging | An open protocol for connecting models to tools and data sources, including databases. Standardises the plumbing, not the semantics. |
| Zero-ETL | 2022– | marketing | Vendor framing for managed replication between their own products. The transformation work does not disappear; it moves. |
| Local-first · CRDT | 2011 · rising 2020s | niche | Conflict-free replicated data types — structures that merge concurrent edits deterministically. The foundation of collaborative editing, and a genuine advance in offline-capable applications. |
| Serverless · usage-based pricing | 2020s | current | Compute that scales to zero and bills per second. Removes capacity planning; removes the natural ceiling on the cost of a bad query. |
Dates are of first significant publication or general adoption, whichever is more informative. Status reflects mid-2026 practice, and is a judgement — inference.
Section 14
Sources
Primary sources only. Where a source has a commercial interest in its own finding, that is stated.
Foundational papers
- Codd, E. F. "A Relational Model of Data for Large Shared Data Banks." CACM 13(6), 1970.
- Bachman, C. "The Programmer as Navigator." ACM Turing Award Lecture, CACM 16(11), 1973.
- Bayer, R. & McCreight, E. "Organization and Maintenance of Large Ordered Indices." Acta Informatica 1(3), 1972.
- Chamberlin, D. & Boyce, R. "SEQUEL: A Structured English Query Language." SIGFIDET, 1974.
- Chen, P. "The Entity-Relationship Model." ACM TODS 1(1), 1976.
- Selinger, P. et al. "Access Path Selection in a Relational Database Management System." SIGMOD, 1979.
- Gray, J. "The Transaction Concept: Virtues and Limitations." VLDB, 1981.
- Härder, T. & Reuter, A. "Principles of Transaction-Oriented Database Recovery." ACM Computing Surveys 15(4), 1983.
- Mohan, C. et al. "ARIES: A Transaction Recovery Method…" ACM TODS 17(1), 1992.
- Berenson, H., Bernstein, P., Gray, J., Melton, J., O'Neil, E. & O'Neil, P. "A Critique of ANSI SQL Isolation Levels." SIGMOD, 1995.
Warehousing and dimensional modelling
- Inmon, W. H. Building the Data Warehouse. Wiley, 1992.
- Kimball, R. The Data Warehouse Toolkit. Wiley, 1996 (and later editions).
Distributed systems and the web-scale era
- Ghemawat, S., Gobioff, H. & Leung, S.-T. "The Google File System." SOSP, 2003.
- Dean, J. & Ghemawat, S. "MapReduce: Simplified Data Processing on Large Clusters." OSDI, 2004.
- Chang, F. et al. "Bigtable: A Distributed Storage System for Structured Data." OSDI, 2006.
- DeCandia, G. et al. "Dynamo: Amazon's Highly Available Key-value Store." SOSP, 2007.
- Gilbert, S. & Lynch, N. "Brewer's Conjecture and the Feasibility of Consistent, Available, Partition-Tolerant Web Services." SIGACT News 33(2), 2002.
- Abadi, D. "Consistency Tradeoffs in Modern Distributed Database System Design" (PACELC). IEEE Computer, 2012.
- Stonebraker, M. et al. "C-Store: A Column-oriented DBMS." VLDB, 2005.
- Corbett, J. et al. "Spanner: Google's Globally-Distributed Database." OSDI, 2012.
- Ongaro, D. & Ousterhout, J. "In Search of an Understandable Consensus Algorithm" (Raft). USENIX ATC, 2014.
- Dageville, B. et al. "The Snowflake Elastic Data Warehouse." SIGMOD, 2016.
The historical reviews — the most useful single reading
- Stonebraker, M. & Hellerstein, J. "What Goes Around Comes Around." 2005.
- Stonebraker, M. & Pavlo, A. "What Goes Around Comes Around… And Around…" ACM SIGMOD Record 53(2), 2024. db.cs.cmu.edu — if you read one thing beyond this primer, read this.
Data science
- Breiman, L. "Statistical Modeling: The Two Cultures." Statistical Science 16(3), 2001.
- Sculley, D. et al. "Hidden Technical Debt in Machine Learning Systems." NeurIPS, 2015.
- Rogati, M. "The AI Hierarchy of Needs." 2017 — practitioner framing, not peer-reviewed.
Agent and text-to-SQL evidence (§11)
- Egg, A., Iglesias Goyanes, M., Kingma, F., Mora, A. (Adyen); von Werra, L. & Wolf, T. (Hugging Face). "DABstep: Data Agent Benchmark for Multi-step Reasoning." 2025. arXiv:2506.23719
- Spider 2.0 — enterprise text-to-SQL benchmark and leaderboard. spider2-sql.github.io. Note: leaderboard entries are self-submitted, several by vendors.
- Jin, T., Choi, Y., Zhu, Y. & Kang, D. (UIUC). "Text-to-SQL Benchmarks are Broken: An In-Depth Analysis of Annotation Errors." CIDR, 2026. vldb.org
- Cube. "Why semantic layers make LLM analytics reliable: a paired benchmark across three frontier models." 2026. cube.dev — vendor source; Cube sells semantic-layer software. Reported here because its own best case (~68%) is the useful figure.
Current landscape
- Raasveldt, M. & Mühleisen, H. "The DuckLake Manifesto: SQL as a Lakehouse Format." DuckDB Labs, 2025; DuckLake v1.0, April 2026. ducklake.select — vendor source (DuckDB Labs).
- Databricks. "The next era of the open lakehouse: Apache Iceberg v3 in Public Preview." April 2026. databricks.com — vendor source.
- Hacker News discussion of "It's 2026, Just Use Postgres," including the Citus Data counter-argument quoted in §7.1. news.ycombinator.com — practitioner commentary, not peer-reviewed.
Prepared for Jakob Beck · MøllerBeck · July 2026. Advisor-evaluator lens, ~70/30 database-to-data-science weighting, primary sources only.