flowchart LR
subgraph src["Sources"]
direction TB
oltp[("Operational DBs<br/><i>CDC</i>")]
saas["SaaS APIs<br/><i>batch pull</i>"]
events[["Event Stream<br/><i>Kafka</i>"]]
files["Partner Files<br/><i>SFTP drop</i>"]
end
subgraph raw["Raw Zone"]
direction TB
r1[("append-only<br/>source schema<br/>no transforms")]
r2["<i>guarantee:</i><br/>replayable history"]
end
subgraph clean["Cleansed Zone"]
direction TB
c1[("deduplicated<br/>typed, conformed<br/>quality-tested")]
c2["<i>guarantee:</i><br/>schema + quality SLA"]
end
subgraph curated["Curated Zone"]
direction TB
g1[("business entities<br/>modelled, aggregated")]
g2["<i>guarantee:</i><br/>agreed definitions"]
end
subgraph serve["Consumers"]
direction TB
bi["BI & Reporting"]
ml["Feature Store<br/>& Model Training"]
api["Data API<br/>& Reverse ETL"]
end
oltp --> raw
saas --> raw
events --> raw
files --> raw
raw --> clean
clean --> curated
curated --> serve
clean -.->|"exploration only"| mlWhat it is
The analytical estate drawn as a left-to-right refinement chain. Every zone gets a stated guarantee: raw promises only that it is a faithful replayable copy; cleansed promises a schema and a quality standard; curated promises agreed business definitions. Consumers attach at the zone whose guarantee they need.
The guarantees are what make it an architecture rather than a folder structure.
When you produce it
At the start of any data platform build, and again whenever an analyst has started querying raw because cleansed was too slow to change — which is the usual reason numbers stop reconciling.
Who reads it
Data engineers, who own the transitions. Analysts and data scientists, who need to know which zone they are allowed to build on. Governance, who attach classification and retention rules per zone. Executives, who mostly want to see that there is one path rather than nine.
What good looks like
- Each zone states its guarantee, not just its name.
- Ingestion mechanism is on each source — CDC, batch pull, stream, file drop — because it determines latency and failure mode.
- Any dotted line that bypasses a zone is drawn and justified, because those are where the inconsistencies come from.
- Retention and format are noted per zone.
Common mistakes
- Naming the zones and stopping. Bronze, silver and gold with no stated contract is decoration.
- Hiding the bypass paths. They exist. Undrawn, they become the reason two dashboards disagree.
- One diagram for both batch and streaming with no distinction. They have different failure modes and different freshness, and the reader needs to know which path a given table came down.