This site only uses technical cookies required for it to work: no tracking, no profiling. Cookie Policy

Skip to content
All terms

What is schema evolution?

The discipline that manages schema changes over time without breaking the systems that depend on that data.

Schema evolution is the discipline that governs how a data schema, its fields, types and constraints, changes over time without breaking the systems that read or write it. It is not a feature of a single product: it is a problem that cuts across an entire data platform, from messages flowing through Apache Kafka to tables in a traditional data warehouse. The core issue is that a schema rarely stays still: a producer adds a field, a consumer depends on it, a downstream team builds a dashboard on a column someone else decides to rename. If the change is not governed, the effect is not an immediate, visible error, but a silent failure: a job that keeps running, a consumer that drops messages without alerting anyone, a pipeline producing wrong numbers for weeks before anyone notices. Managing schema evolution means deciding in advance which changes are safe, which require coordination, and how the difference gets communicated to everyone downstream who depends on that data.

The three compatibility levels and the schema registry

In event streams, standard practice is to rely on a schema registry (the most common ones work with typed binary formats such as Avro or Protobuf) that validates every new schema against the previous one before allowing it to be published. Validation rests on three compatibility levels. Backward compatibility guarantees that updated consumers can still read messages written with the old schema: the most common case, letting you add an optional field without coordinating a simultaneous release. Forward compatibility guarantees the opposite, that old consumers can safely ignore fields added by an updated producer: it matters when you cannot control when every consumer gets updated. Full compatibility requires both at once, the safer choice when producers and consumers evolve independently. In traditional relational data warehouses the mechanism is different and far more manual: an ALTER TABLE that adds a column is almost always safe, but renaming or retyping an existing column can lock running queries, invalidate dependent views, or silently corrupt ETL jobs that assume a fixed structure, a higher operational risk precisely because there is no automatic validation layer like a schema registry. It is worth a separate mention that open table formats such as Iceberg, Delta Lake and Hudi offer schema evolution natively at the table level: for that specific angle, see open table formats.

An enterprise example

A typical case: a Kafka producer publishing order events adds a required field, say currency, without a default value. With backward compatibility enforced on the registry, the publish is rejected until the field becomes optional or gets a default, precisely because a required field with no default would break every consumer deserializing old messages with the new schema. Without that guardrail, the error only surfaces in production, often on a critical consumer such as the billing service, and debugging it takes hours to trace back to a change that looked harmless to the producer.

Why it matters for decision makers

An uncommunicated schema change is one of the most common causes of pipelines silently breaking in production, and one of the costliest to diagnose precisely because it does not throw an immediate error. For decision makers, the operational question is who has the authority to approve a schema change, what process communicates it downstream, and which compatibility level is enforced by default on critical systems. It is the same governance problem a data contract addresses explicitly, and closely tied to data quality: an uncontrolled schema change is often the root cause of a quality drop discovered only downstream.

Frequently asked questions

No, it depends on the compatibility level and how the field is used. Under backward compatibility, removing a required field can break consumers still expecting it, while an optional field that is no longer populated is almost always safe to drop.

Not necessarily. Full compatibility limits how freely a schema can evolve, since every change must stay safe in both directions: many teams reserve it for critical flows and rely on backward compatibility alone elsewhere, where the coordination cost is not justified.
  • Open table formats (Iceberg, Delta, Hudi) · Open formats that add transactions, versioning and schema evolution to data lake files, without tying your data to a single vendor.
  • Apache Kafka · The open source distributed log for event streaming: topics split into partitions, read by independent consumer groups.
  • Data contract · A formal agreement between data producers and consumers: schema, semantics and SLAs, versioned and automatically enforced in CI.
  • Data quality · How fit your data is for its intended use: complete, correct, fresh and consistent across systems. Measured, not declared.
  • Butterfly effect · A nonlinear system's sensitivity to initial conditions: a small upstream change alters the downstream outcome.

A term that hits close to home? Let's talk.

CONTACT ME