The schema-as-interface blind spot
When people say “schema as interface,” they usually mean naming and semantics. That’s part of it. But in a production system, the real interface is the set of access paths the query planner can execute cheaply. Every `SELECT`, join, background job, and dashboard query depends not just on tables and columns, but on index shape, cardinality, constraints, and data distribution. The schema is not only a contract of meaning; it is a contract of performance. I’ve seen more systems struggle from schema drift than from application bugs. Not because the code was wrong, but because the data model made correct code slow. A table starts simple and well-indexed. Features accumulate. Nullable columns get added “just in case.” Enums become free text. Indexes are added reactively. At 50k rows, everything works. At 50 million, joins that used to be cheap become dominant costs. Nothing is technically broken—but the interface has changed. We would consider an API broken if latency jumped from 40ms to 4 s...