Architecture

The Governed Lakehouse: An Enterprise Reference Architecture on Databricks

Most enterprises do not have a lakehouse. They have a collection of Databricks workspaces that grew one project at a time. This is the reference architecture our Databricks POD deploys instead — the planes, the catalog layout, the layer contracts, and the identity, network and cost decisions that keep it governable as it grows.

TL;DR

A lakehouse becomes enterprise-grade when it is designed as four planes — identity, governance, compute and data — rather than as a set of workspaces. In practice that means one Unity Catalog metastore per region, catalogs organized by domain and environment and bound to the right workspaces, medallion layers with explicit contracts between them, identity flowing from your IdP into account-level groups, and cost governed from system tables rather than spreadsheets. Below is the reference architecture we deploy, the six decisions that matter most, and a checklist you can run against your own estate.

Why a reference architecture, and not just more workspaces

Databricks makes it easy to start. A team spins up a workspace, connects a bucket, writes some notebooks, and ships a dashboard. Then another team does the same, and another. Two years later the enterprise has eleven workspaces, four ways of naming tables, three copies of the customer table, and nobody who can say with confidence who has access to what.

None of those decisions were wrong at the time. The problem is that each was made locally. A reference architecture is simply the set of decisions you make once, centrally, so that every new team inherits them instead of reinventing them: where data lives, how it is named, who can see it, how it moves between environments, and who pays for the compute.

The pattern we see constantly: an organization asks us to help with an AI use case, and the first three weeks go to answering a question that should take three minutes — which table is the real one, and are we allowed to use it? That is not an AI problem. It is an architecture problem that AI exposes.

Four planes, not one

When people draw a lakehouse they draw the data plane: sources on the left, bronze, silver and gold in the middle, dashboards on the right. That picture is correct and incomplete. An enterprise platform has four planes, and the three that are usually missing from the diagram are the ones that decide whether it survives contact with audit, security review and the finance team.

Reference architecture: four planes around the lakehouse
Sources Lakehouse Consume DatabasesOLTP · CDC SaaS appsCRM · ERP · HR Event streamsKafka · Kinesis Files & partnersSFTP · APIs Ingest LakeflowConnect Auto Loader StructuredStreaming Kafka / CDC LakeflowPipelines Delta Lake tables in medallion layers Bronzeraw · replay Silvertyped · clean Goldconformed Platinumserving Unity Catalog Grants · Lineage · Tags/ABAC · Row filters & masks · Audit Cloud storage · S3 / ADLS / GCS managed tables · external locations · volumes BI & SQLSQL warehouses Genieask in English ML & servingModel Serving AI agentsAgent Framework Delta Sharingexternal partners Identity & network plane IdP + SCIM → account groups · service principals for jobs · private connectivity · no long-lived tokens in production Operations & FinOps plane system tables for usage and audit · budget and compute policies · tags for chargeback · serverless by default
The data plane in the middle is what everyone draws. The identity, governance and operations planes around it are what make it an enterprise platform.
PlaneWhat it ownsWho owns it
DataIngestion, the medallion layers, serving tables, sharingDomain data teams
GovernanceUnity Catalog: grants, lineage, tags, row filters and masks, auditPlatform team with data governance
Identity & networkIdP federation, groups, service principals, private connectivityPlatform team with security
Operations & FinOpsCompute policies, budgets, usage and cost attribution, monitoringPlatform team with finance

The ownership column is the point. The data plane is federated: domains own their pipelines and their gold models. The other three planes are centralized, run by a small platform team, and expressed as policy rather than as tickets. That split — federated data, centralized guardrails — is what lets the platform scale to many teams without either chaos or a bottleneck.

Workspaces and environments: one metastore, many bindings

The foundation decision is the Unity Catalog metastore. There is one per cloud region, at the account level, and every workspace in that region attaches to it. That single fact eliminates most of the historical sprawl: grants, lineage and audit no longer live inside individual workspaces, so a new workspace does not create a new island of permissions.

Workspaces then become what they should have been all along — compute and collaboration boundaries, not data boundaries. We typically deploy a dev, a staging and a production workspace per business unit or per platform, and we separate data by environment at the catalog level:

One metastore per region, catalogs by domain and environment
Unity Catalog metastore — one per cloud region account-level · shared by every workspace in the region · the single place grants live dev workspacebuild & test staging workspacerelease validation prod workspacejobs run as service principals claims domain claims_dev claims_stg claims_prod finance domain finance_dev finance_stg finance_prod customer domain customer_dev customer_stg customer_prod shared reference_prodread-only, bound to every workspace: calendars, codes, master reference data
Workspace–catalog bindings make the rule physical: the prod catalogs are only reachable from the prod workspace, so a notebook in dev cannot write to production even if someone grants the wrong permission.

Two details make this work in practice. First, workspace–catalog binding: production catalogs are bound only to the production workspace, so the separation is enforced by the platform, not by people remembering not to do something. Second, production writes come from service principals, via jobs deployed from version control. Humans read production; pipelines write it.

A failure mode we find often: one catalog per workspace, with environment encoded in schema names (claims.dev_policy, claims.prod_policy). It looks tidy, but grants now have to be maintained schema by schema, and a single over-broad grant on the catalog gives a developer write access to production.

Catalog design: domain, environment, layer

Inside the metastore we use a three-part convention: catalog = domain + environment, schema = layer or data product, table = entity at a stated grain. The result is a three-level name that tells you, at a glance, who owns the data, how trustworthy it is, and what one row means.

-- catalog       . schema  . table
claims_prod   . bronze  . raw_fnol_events      -- one row per landed event
claims_prod   . silver  . claim                -- one row per claim version (SCD2)
claims_prod   . gold    . fact_claim_payment   -- one row per payment transaction
claims_prod   . serving . claim_kpis_daily     -- one row per claim per day
reference_prod. codes   . loss_cause           -- shared, read-only
DecisionOur defaultWhy
Managed vs external tablesManaged by defaultUnity Catalog handles layout, optimization and lifecycle; external only for data another system must also write
Landing filesVolumes on governed external locationsNo mounts, no storage keys on clusters; file access is a grant like any other
Cross-domain accessGrants on gold or on views, never on silverDomains publish products, not internals
Sharing outside the orgDelta Sharing from goldRecipients get live, governed tables instead of exports
DocumentationComments and tags required at deployUntagged, uncommented tables fail the release pipeline

The data plane: contracts between layers

Medallion architecture is widely adopted and widely misunderstood. The layers are not folders. Each one is a promise the layer makes to the one above it, and the value of the pattern comes entirely from keeping those promises.

What each layer guarantees to the next
Bronzelanded as-is Silverentities Goldbusiness model Platinumserving ConsumersBI · ML · agents append-onlyraw payload keptthe replay point typed & validateddeduplicatedhistory applied conformed factsone grain per factsource of truth computed from goldis_latest flagssub-second reads read gold & platinumnever bronzegoverned by UC quality gate: expectations, row-count and reconciliation checks that block promotion
The diamonds matter more than the boxes. A layer is only as trustworthy as the gate in front of it.

We implement the gates with Lakeflow Declarative Pipelines expectations where pipelines are declarative, and with explicit reconciliation jobs where they are not — row counts and control totals checked between silver and gold, and promotion blocked when they disagree. The detail that matters most is that consumers read from gold and platinum only. The moment a dashboard or an agent reads silver directly, the layer contracts stop meaning anything, because nobody can change silver without breaking a consumer they did not know they had.

For a worked example of these contracts in a regulated domain — nine schemas, a conformed star schema and the modeling rules that keep premium and loss numbers honest — see our P&C insurance lakehouse blueprint.

Identity and network: the plane nobody draws

Security reviews do not fail lakehouses on encryption. They fail them on identity sprawl and uncontrolled egress. Our baseline:

  • Identity flows one way: your IdP is the source of truth, SCIM provisions users and groups into the Databricks account, and grants are made to account-level groups — never to individuals, never to workspace-local groups.
  • Jobs run as service principals, one per pipeline or per domain, with OAuth machine-to-machine credentials. Personal access tokens are disabled in production workspaces.
  • Private connectivity for the control plane and for storage, and serverless egress restricted to an allow-list, so a notebook cannot quietly send data somewhere it should not go.
  • Sensitive data is classified with tags, and row filters and column masks are attached in Unity Catalog, so the same rules apply whether the reader is a dashboard, a notebook, a JDBC client or an AI agent.

On AI readiness: every one of these controls is about to matter more. An AI agent is just another identity that reads data and calls tools. If your grants are made to the right groups and your sensitive columns are masked at the catalog, the agent inherits those controls for free. If they live in a BI tool, the agent walks straight past them.

Cost and operations: govern from the system tables

The finance conversation goes badly when the only answer to "what did this cost and who spent it?" is a bill. Unity Catalog's system tables change that: usage, billing, audit, lineage and query history are queryable tables, which means cost governance can be code.

-- Last 30 days of spend by team tag and product
SELECT  custom_tags['team']    AS team,
        billing_origin_product,
        SUM(usage_quantity)      AS dbus
FROM    system.billing.usage
WHERE   usage_date >= current_date() - INTERVAL 30 DAYS
GROUP BY 1, 2
ORDER BY dbus DESC;

Around that we put four controls: compute policies that cap instance types and enforce auto-termination; mandatory tags for team and cost center on every job and warehouse; budget policies and alerts per domain; and serverless as the default for SQL and jobs where the workload allows, which removes idle-cluster waste rather than monitoring it.

Six decisions that make or break the platform

These are the choices we make on every Databricks POD engagement. Each exists because we have seen the alternative cost a client months.

1. One metastore per region, decided on day one

Multiple metastores in one region re-create the islands Unity Catalog exists to remove. If a subsidiary genuinely needs isolation, use separate catalogs with separate bindings and grants, or Delta Sharing between metastores — not a second metastore by default.

2. Environment lives in the catalog, not the schema

Catalog-level separation lets you bind production to the production workspace and keep grants coarse and auditable. Schema-level separation forces fine-grained grants that drift.

3. Humans read production; pipelines write it

Every production write comes from a job running as a service principal, deployed from Git through Databricks Asset Bundles or your CI/CD tool. This single rule removes most production incidents and most audit findings.

4. No mounts, no keys on clusters

Storage credentials and external locations make file access governable. Mount points and keys in cluster configs make it invisible. There is no good reason to keep the latter in a new build.

5. Consumers never read silver

Publish gold and serving tables, and views on top of them, as the only supported interfaces. Silver is internal to the domain, and keeping it that way is what lets the domain fix it.

6. Metadata is a release gate

Table comments, column descriptions, owner and classification tags are checked in CI. It is the cheapest control in the platform, and the one that decides whether analysts — and language models — can find and trust your data later.

A checklist you can run against your own estate

QuestionWhat a bad answer looks like
How many metastores per region?More than one, or workspaces still on the legacy Hive metastore
Can dev write to production data?Yes, because production catalogs are bound to every workspace
Who writes production tables?Named users from notebooks
Where are grants made?To individuals, or to workspace-local groups
Are there mount points?/mnt/ paths in production jobs
Do consumers read silver?Dashboards or extracts pointed at silver tables
Can you attribute last month's spend?Only at the workspace level, from the invoice
Are sensitive columns masked in the catalog?Masking implemented in the BI tool
What share of tables have comments and owners?Nobody knows, which usually means under a third

The bottom line

A Databricks lakehouse becomes an enterprise platform when it stops being designed workspace by workspace. One metastore per region; catalogs by domain and environment, bound to the right workspaces; layers with real contracts and gates; identity flowing from your IdP into groups and service principals; and cost governed from tables rather than invoices.

None of it is exotic, and all of it is far cheaper to decide at the start than to retrofit. The organizations that get it right find that every new domain, every new dashboard and every new AI agent lands faster than the last. The ones that skip it find the opposite.

Want your Databricks estate measured against this architecture?

Our Databricks POD starts with a two-to-three week assessment — workspace and catalog layout, governance, identity, cost — and a prioritized findings report you can act on whether or not you work with us.

Databricks POD
Back to blog