← Back to list

Medallion Architecture for Data Analytics: A Practical Guide to Building Trusted Data Products

A practical guide to designing Bronze, Silver, and Gold data layers for reliable analytics, trusted dashboards, and real-world data…

Geek Nomad in Level Up Coding · 2026-05-18 03:19 · 36 claps · 14.1 min read paywalled
#data-science #big-data #software-architecture #data-lake #programming
Open on Medium ↗
Wiki topics: ML · Machine Learning GRW · Growth & Analytics 💻 · Programming 🔬 · Science · General 🎬 · Film & Television 🏛️ · Architecture

Medallion Architecture for Data Analytics: A Practical Guide to Building Trusted Data Products

A practical guide to designing Bronze, Silver, and Gold data layers for reliable analytics, trusted dashboards, and real-world data products.

Photo by Alexandr Popadin on Unsplash

Photo by Alexandr Popadin on Unsplash

Modern analytics rarely fails because companies do not have enough data.

It fails because the same business question produces five different answers.

  • Finance says yesterday’s revenue was $1.2M.
  • Marketing says it was $1.4M.
  • The executive dashboard says $1.1M.
  • Meanwhile, the data science team quietly exports a CSV from another system because the warehouse table “looks suspicious.”

Somewhere in the middle of this chaos, a data engineer is trying to explain:

  • Why a late-arriving order changed yesterday’s number
  • Why a refund was counted twice
  • Why one customer exists under three different IDs
  • Why a dashboard still uses old revenue logic
  • Why nobody knows which table is the official one

This is exactly the kind of problem Medallion Architecture is designed to solve.

Medallion Architecture organizes data into progressive quality layers:

  • Bronze — raw data
  • Silver — cleaned and validated data
  • Gold — business-ready analytical data

The goal is simple:

Move data from raw evidence to trusted business insight in a controlled, traceable, and reusable way.

What Is Medallion Architecture?

Medallion Architecture is a layered data design pattern commonly used in modern lakehouse and analytics platforms.

The core idea is that data becomes more reliable and more useful as it moves through each layer.

Sources
  ↓
Bronze Layer
  Raw, source-faithful data
  ↓
Silver Layer
  Cleaned, validated, standardized data
  ↓
Gold Layer
  Business-ready data for analytics, dashboards, and ML

Each layer has a clear responsibility.

LayerPurposeMain UsersBronzePreserve raw source dataData engineers, platform teamsSilverClean and standardize dataData engineers, analytics engineers, analystsGoldServe business use casesBusiness users, BI tools, data science teams

The naming is not the important part.

The discipline is.

Bronze, Silver, and Gold help teams separate:

  • Raw ingestion
  • Data cleaning
  • Business logic
  • Reporting logic
  • Machine learning features
  • Governance and access control

That separation is what creates trust.

The Mental Model: Evidence, Records, and Decisions

A simple way to understand Medallion Architecture is this:

Bronze: Raw Evidence

Bronze answers:

What exactly arrived from the source system?

It preserves the original data as faithfully as possible.

Silver: Clean Business Records

Silver answers:

What actually happened after cleaning, deduplication, validation, and standardization?

It turns messy source data into reliable entities and events.

Gold: Business Decisions

Gold answers:

What should dashboards, analysts, executives, and models consume?

It turns clean data into business-ready products.

Real-World Example: E-Commerce Analytics

Imagine an e-commerce company.

It receives data from:

  • Orders database
  • Payment provider
  • Customer relationship management system
  • Website clickstream events
  • Marketing platforms
  • Inventory system
  • Product catalog
  • Refund system

Without a clear architecture, every team may build its own version of the truth.

For example:

  • Marketing calculates revenue from campaign conversions.
  • Finance calculates revenue from payment settlement.
  • Product calculates revenue from completed orders.
  • Operations calculates revenue after cancellations and refunds.

All of them may be partially right.

But the business needs one trusted answer.

Medallion Architecture creates a controlled journey from raw data to trusted reporting.

Raw order events
  ↓
Bronze raw_orders
  ↓
Silver cleaned_orders
  ↓
Gold daily_revenue_dashboard

Bronze Layer: Preserve the Raw Truth

The Bronze layer is where data lands first.

It should be:

  • Raw
  • Complete
  • Append-friendly
  • Auditable
  • Replayable
  • Close to the original source

Bronze is not where you apply heavy business logic.

It is where you preserve evidence.

What Belongs in Bronze?

For an e-commerce project, Bronze tables may include:

bronze.raw_orders_cdc
bronze.raw_order_items_cdc
bronze.raw_payments_api
bronze.raw_customers_crm
bronze.raw_clickstream_events
bronze.raw_inventory_snapshots
bronze.raw_google_ads_spend
bronze.raw_meta_ads_spend

These tables should capture:

  • Raw payload
  • Source system
  • Source file name
  • Ingestion timestamp
  • Batch ID
  • Schema version
  • Record hash
  • Load status
  • Error metadata, if any

Example Bronze table:

CREATE TABLE bronze.raw_payments_api (
    raw_payload STRING,
    source_system STRING,
    source_endpoint STRING,
    ingestion_timestamp TIMESTAMP,
    ingestion_date DATE,
    ingestion_batch_id STRING,
    source_file_name STRING,
    record_hash STRING
);

Bronze Layer Responsibilities

Bronze should handle:

  • Data ingestion
  • Raw storage
  • Source metadata capture
  • Schema drift tolerance
  • Replay and backfill support
  • Auditability
  • Source-level troubleshooting

Bronze should usually avoid:

  • Complex joins
  • Business rules
  • Heavy filtering
  • Metric calculations
  • Dashboard-specific transformations
  • Dropping invalid records without traceability

Example: Raw Payment Event

A payment provider may send this JSON:

{
  "payment_id": "pay_9821",
  "order_id": "ORD-771",
  "amount": "129.99",
  "currency": "SGD",
  "status": "succeeded",
  "created_at": "2026-05-16T13:22:10+08:00"
}

In Bronze, the goal is not to decide whether this counts as revenue.

The goal is to store what arrived.

You may later discover that:

  • The status mapping was wrong.
  • The currency conversion logic changed.
  • The order was refunded.
  • The payment provider resent the event.
  • The timestamp needed normalization.

If the raw event is preserved, you can reprocess the data.

If it was overwritten or cleaned too early, you may lose that ability.

Key Bronze Design Decisions

Before building Bronze, decide:

1. Should Bronze be append-only?

Usually, yes.

Even if a source sends updates or deletes, Bronze should preserve the incoming events.

2. Should Bronze enforce strict schemas?

Not too strictly.

Bronze should tolerate source changes. Strong typing and strict validation usually belong in Silver.

3. Should bad records be dropped?

Usually, no.

Bad records should be stored, tagged, or quarantined.

4. Should analysts query Bronze?

Usually, no.

Bronze is mainly for:

  • Data engineers
  • Platform teams
  • Audit
  • Debugging
  • Reprocessing

Silver Layer: Build the Trusted Analytical Foundation

Silver is where raw data becomes useful.

This layer applies:

  • Cleaning
  • Deduplication
  • Type casting
  • Validation
  • Standardization
  • Joins
  • Identity resolution
  • Late-arriving data handling
  • Business entity creation

Silver should create reusable, trusted datasets.

It should not be overly dashboard-specific.

What Belongs in Silver?

For the same e-commerce company, Silver tables may include:

silver.orders
silver.order_items
silver.customers
silver.products
silver.payment_transactions
silver.web_sessions
silver.inventory_snapshots
silver.marketing_spend
silver.customer_identity_map

These tables are cleaner than Bronze but still detailed.

They represent business entities or business events.

Example Silver Table: Orders

silver.orders
  order_id
  customer_id
  order_status
  order_created_at_utc
  order_updated_at_utc
  order_channel
  billing_country
  shipping_country
  source_system
  is_deleted
  valid_from
  valid_to

This table has a clear grain:

One row represents one cleaned order record.

Example Silver Table: Payment Transactions

silver.payment_transactions
  payment_id
  order_id
  payment_status
  payment_method
  amount_original
  currency_original
  amount_usd
  fx_rate_used
  payment_created_at_utc
  payment_provider

This table has a different grain:

One row represents one payment transaction or payment attempt.

That distinction matters.

An order may have:

  • One successful payment
  • Multiple failed payment attempts
  • A partial refund
  • A chargeback

If the grain is unclear, revenue calculations become unreliable.

Silver Layer Data Quality Rules

Silver is where quality checks become serious.

For silver.orders, you may define rules like:

table: silver.orders
expectations:
  - column: order_id
    rule: not_null
  - column: order_id
    rule: unique_for_current_records
  - column: order_created_at_utc
    rule: not_null
  - column: order_status
    rule: accepted_values
    values:
      - pending
      - paid
      - fulfilled
      - cancelled
      - refunded
  - column: total_amount_usd
    rule: greater_than_or_equal_to
    value: 0

Records that fail validation should not simply disappear.

A better pattern is:

silver.orders_valid
silver.orders_quarantine

The quarantine table should contain:

  • Failed record
  • Failed rule
  • Failure reason
  • Source system
  • Raw payload
  • Pipeline run ID
  • Ingestion timestamp

Silver Deduplication Example

Suppose the source sends multiple versions of the same order.

You want only the latest version in Silver.

WITH parsed AS (
    SELECT
        JSON_VALUE(raw_payload, '$.order_id') AS order_id,
        JSON_VALUE(raw_payload, '$.customer_id') AS customer_id,
        JSON_VALUE(raw_payload, '$.status') AS order_status,
        CAST(JSON_VALUE(raw_payload, '$.updated_at') AS TIMESTAMP) AS source_updated_at,
        ingestion_timestamp,
        raw_payload
    FROM bronze.raw_orders_cdc
),
ranked AS (
    SELECT
        *,
        ROW_NUMBER() OVER (
            PARTITION BY order_id
            ORDER BY source_updated_at DESC, ingestion_timestamp DESC
        ) AS rn
    FROM parsed
)
SELECT
    order_id,
    customer_id,
    order_status,
    source_updated_at,
    ingestion_timestamp
FROM ranked
WHERE rn = 1;

In production, this would usually become an incremental merge instead of a full rebuild.

Silver Layer Decision Framework

A table belongs in Silver when:

  • It has been parsed and typed.
  • It has been cleaned.
  • Duplicates have been handled.
  • Required fields have been validated.
  • It represents a reusable business entity or event.
  • It can support multiple downstream use cases.
  • It is not designed for only one dashboard.

Examples:

silver.orders
silver.customers
silver.products
silver.payment_transactions
silver.inventory_snapshots

Silver is the reusable foundation of the analytics platform.

If Silver is weak, Gold becomes messy.

If Silver is strong, Gold becomes much easier to build.

Gold Layer: Serve the Business

Gold is where data becomes a product.

Gold tables are built for consumption by:

  • Dashboards
  • BI tools
  • Executives
  • Analysts
  • Data apps
  • Machine learning models
  • Reverse ETL workflows
  • Operational reporting

Gold is where business logic becomes visible and usable.

What Belongs in Gold?

Gold tables may include:

gold.dim_date
gold.dim_customer
gold.dim_product
gold.dim_region
gold.dim_campaign
gold.fct_order_line
gold.fct_payment
gold.fct_web_session
gold.agg_daily_sales_by_category_region
gold.agg_daily_inventory_position
gold.mart_customer_lifetime_value
gold.mart_marketing_roas
gold.feature_customer_churn_monthly

Gold data is often:

  • Aggregated
  • Modeled
  • Business-defined
  • Optimized for performance
  • Secured for broader consumption
  • Connected to dashboards or semantic layers

Gold Layer and Dimensional Modeling

For reporting and BI, Gold often uses dimensional modeling.

This usually means:

  • Fact tables contain measurable business events.
  • Dimension tables contain descriptive context.

Example:

gold.fct_order_line
  date_key
  customer_key
  product_key
  campaign_key
  region_key
  order_id
  order_line_id
  quantity
  gross_revenue_usd
  discount_usd
  net_revenue_usd
  tax_usd
  shipping_usd
gold.dim_customer
  customer_key
  global_customer_id
  customer_segment
  acquisition_channel
  country
  first_order_date
gold.dim_product
  product_key
  sku
  product_name
  category
  brand
  launch_date

This structure makes common business questions easier to answer:

  • Revenue by product category
  • Revenue by country
  • Average order value by customer segment
  • Repeat purchase rate by acquisition channel
  • Refund rate by brand
  • Gross margin by region

Gold Aggregate Example

A Gold table for daily sales might look like this:

CREATE TABLE gold.agg_daily_sales_by_category_region AS
SELECT
    d.date,
    p.category,
    r.region_name,
    COUNT(DISTINCT f.order_id) AS orders,
    SUM(f.quantity) AS units_sold,
    SUM(f.gross_revenue_usd) AS gross_revenue_usd,
    SUM(f.discount_usd) AS discount_usd,
    SUM(f.net_revenue_usd) AS net_revenue_usd
FROM gold.fct_order_line f
JOIN gold.dim_date d
    ON f.date_key = d.date_key
JOIN gold.dim_product p
    ON f.product_key = p.product_key
JOIN gold.dim_region r
    ON f.region_key = r.region_key
GROUP BY
    d.date,
    p.category,
    r.region_name;

This table is designed for fast dashboard consumption.

Business users should not need to join raw orders, payments, refunds, products, campaigns, exchange rates, and customer data every time they open a report.

That work should already be done.

Gold Layer Decision Framework

A table belongs in Gold when:

  • It supports a specific business use case.
  • It has a clear business owner.
  • It has a documented grain.
  • It contains approved metrics.
  • It is safe for the intended audience.
  • It is optimized for querying.
  • It feeds dashboards, reports, applications, or ML models.

Examples:

gold.finance.daily_revenue
gold.marketing.campaign_roas
gold.customer.customer_lifetime_value
gold.inventory.stockout_risk

A useful rule:

If the table exists because of a source system, it is probably Bronze or Silver. If the table exists because of a business question, it is probably Gold.

The Most Important Design Principle: Define the Grain

Before writing transformations, define the grain.

Grain means:

What does one row represent?

Examples:

silver.orders
One row per current order.
silver.order_items
One row per order line item.
silver.payment_transactions
One row per payment attempt.
silver.inventory_snapshots
One row per SKU, warehouse, and snapshot timestamp.
gold.fct_order_line
One row per completed order line item.
gold.agg_daily_sales_by_category_region
One row per date, category, and region.

Every important table should have this sentence:

One row in this table represents __.

If you cannot write that sentence clearly, the table design is not ready.

Full Implementation Plan for a Real Data Analytics Project

Now let’s walk through how to implement Medallion Architecture in a real project.

Assume the company wants to build analytics for:

  • Daily revenue reporting
  • Customer lifetime value
  • Marketing return on ad spend
  • Inventory reporting
  • Churn prediction
  • Executive KPIs

Step 1: Start With Business Questions

Do not start with tools.

Start with decisions.

Example business questions:

  • What was net revenue yesterday?
  • Which product categories are growing fastest?
  • Which campaigns produce profitable customers?
  • Which customers are likely to churn?
  • Which warehouses are at risk of stockout?
  • What is the refund rate by product?
  • What is the difference between gross revenue, net revenue, recognized revenue, and cash collected?

These questions help define:

  • Gold tables
  • Metrics
  • Data quality rules
  • Refresh frequency
  • Ownership
  • Access requirements

Example metric definition:

Metric: Net Revenue
Definition:
Gross order line revenue minus discounts, cancellations, and refunds.
Grain:
Order line.
Currency:
USD.
Time basis:
Order completed date.
Owner:
Finance.
Refresh SLA:
Hourly.
Consumers:
Executive dashboard, finance reporting.

Step 2: Inventory Data Sources

Create a source inventory before building pipelines.

Example:

Source: PostgreSQL orders database
Method: CDC
Latency: 15 minutes
Owner: Commerce engineering
Primary keys: order_id, order_item_id
PII: customer email, shipping address
Expected volume: 3M order lines per month
Source: Payment provider API
Method: REST API extraction
Latency: 30 minutes
Owner: Finance operations
Primary key: payment_id
PII: partial payment metadata
Expected volume: 2M events per month
Source: Website clickstream
Method: Kafka
Latency: near real time
Owner: Growth engineering
Primary key: event_id
PII: anonymous_id, IP-derived location
Expected volume: 200M events per month

This inventory helps decide:

  • Ingestion method
  • Freshness expectations
  • Security controls
  • Storage format
  • Data retention
  • Cost expectations
  • Pipeline priority

Step 3: Choose the Platform and Table Format

Medallion Architecture is a logical design pattern.

It can be implemented using different tools.

Common platform choices include:

  • Databricks
  • Microsoft Fabric
  • Snowflake
  • BigQuery
  • AWS lakehouse services
  • Spark-based platforms
  • Open-source lakehouse stacks

Common table formats include:

  • Delta Lake
  • Apache Iceberg
  • Apache Hudi

Common transformation tools include:

  • Spark
  • SQL
  • dbt
  • Flink
  • Databricks Delta Live Tables
  • Fabric Data Engineering
  • Cloud-native ETL services

Common orchestration tools include:

  • Airflow
  • Dagster
  • Databricks Workflows
  • Azure Data Factory
  • Fabric Data Factory
  • Cloud-native schedulers

The decision should depend on:

  • Data volume
  • Latency needs
  • Team skills
  • Existing cloud provider
  • Governance requirements
  • BI tools
  • Machine learning needs
  • Streaming requirements
  • Cost constraints
  • Interoperability needs

Step 4: Design Naming and Storage Standards

A clean naming structure prevents confusion.

Example structure:

bronze.raw_orders_cdc
bronze.raw_payments_api
bronze.raw_clickstream_events
silver.orders
silver.order_items
silver.customers
silver.payment_transactions
gold.finance.daily_revenue
gold.marketing.campaign_roas
gold.customer.customer_lifetime_value

For each table, document:

  • Layer
  • Domain
  • Owner
  • Grain
  • Refresh frequency
  • SLA
  • PII classification
  • Upstream dependencies
  • Downstream consumers

Example metadata:

table: gold.finance.daily_revenue
owner: finance_analytics
layer: gold
domain: finance
grain: one row per date, region, and sales_channel
refresh: hourly
sla: available within 30 minutes
pii: false
upstream:
  - silver.orders
  - silver.order_items
  - silver.refunds

Step 5: Build Bronze Ingestion

Bronze pipelines should optimize for reliability and replayability.

For batch files:

/bronze/orders/ingestion_date=2026-05-17/batch_id=abc123/file.json

For streaming events:

bronze.raw_clickstream_events

For CDC data:

bronze.raw_orders_cdc

A good Bronze pipeline captures:

  • Raw record
  • Source name
  • Source table or endpoint
  • File name
  • Batch ID
  • Ingestion timestamp
  • Schema version
  • Load status
  • Error details

The goal is not to make the data beautiful.

The goal is to make it recoverable.

Step 6: Build Silver Transformations

Silver pipelines should turn raw data into reusable entities.

For orders, Silver processing may include:

  • Parse raw payload
  • Cast fields
  • Standardize timestamps to UTC
  • Deduplicate records
  • Apply CDC operation logic
  • Validate required fields
  • Remove or flag test orders
  • Quarantine invalid records
  • Merge valid records into silver.orders

For payments, Silver processing may include:

  • Parse payment events
  • Normalize provider statuses
  • Convert currencies
  • Link payments to orders
  • Detect duplicate payment events
  • Validate amount and status
  • Create silver.payment_transactions

For customers, Silver processing may include:

  • Parse CRM and commerce records
  • Standardize email and phone fields
  • Hash sensitive identifiers
  • Resolve customer identities
  • Track slowly changing attributes
  • Create silver.customers
  • Create silver.customer_identity_map

Step 7: Handle Late-Arriving and Changed Data

Real data is messy.

Your architecture must handle:

  • Late orders
  • Delayed refunds
  • Payment retries
  • Customer merges
  • Campaign attribution changes
  • Inventory snapshot failures
  • Source schema changes
  • Deleted records
  • Backfilled historical data

Useful techniques include:

  • Source update timestamps
  • Ingestion timestamps
  • Watermarks
  • Incremental merges
  • Change data capture
  • Slowly changing dimensions
  • Quarantine tables
  • Reprocessing from Bronze
  • Audit columns

Example audit columns:

created_at
updated_at
source_updated_at
ingestion_timestamp
pipeline_run_id
record_hash
is_deleted
valid_from
valid_to

Step 8: Build Gold Data Products

Gold should be shaped around business needs.

Finance Gold tables:

gold.finance.fct_order_line
gold.finance.fct_refund
gold.finance.daily_revenue
gold.finance.monthly_recognized_revenue

Marketing Gold tables:

gold.marketing.fct_campaign_spend
gold.marketing.fct_attributed_order
gold.marketing.daily_roas
gold.marketing.customer_acquisition_cost

Customer Gold tables:

gold.customer.dim_customer
gold.customer.customer_360
gold.customer.lifetime_value
gold.customer.churn_features

Inventory Gold tables:

gold.inventory.daily_stock_position
gold.inventory.stockout_risk
gold.inventory.inventory_turnover

Each Gold table should have:

  • Clear owner
  • Clear consumer
  • Clear metric definitions
  • Clear grain
  • Clear refresh SLA
  • Clear access policy

Step 9: Add Orchestration

A real platform needs orchestration.

Example dependency chain:

bronze.raw_orders_cdc
  ↓
silver.orders
  ↓
gold.fct_order_line
  ↓
gold.daily_revenue
  ↓
Executive dashboard

The orchestrator should manage:

  • Scheduling
  • Dependencies
  • Retries
  • Alerts
  • Run history
  • Failure handling
  • Backfills
  • SLA monitoring

A failed Bronze ingestion should alert engineering.

A failed Gold revenue table should alert both engineering and analytics owners.

Step 10: Add Lineage and Cataloging

Lineage helps answer:

  • Where did this number come from?
  • Which source tables feed this dashboard?
  • What changed upstream?
  • Which downstream reports are affected?
  • Which pipeline failed?
  • Which data quality check broke?

At minimum, the catalog should include:

  • Table name
  • Description
  • Owner
  • Layer
  • Grain
  • Domain
  • Source systems
  • Upstream dependencies
  • Downstream consumers
  • Freshness
  • Quality status
  • PII classification
  • Access policy
  • Metric definitions

Without lineage, debugging becomes detective work.

With lineage, debugging becomes engineering.

Step 11: Secure Each Layer Differently

Not every layer should have the same access.

Bronze often contains raw sensitive data.

Silver may contain cleaned but still sensitive business data.

Gold should expose only what users need.

Example access model:

LayerAccessPII RiskMain UseBronzeData engineering, platform, auditHighReplay, debugging, auditSilverEngineering, analytics engineering, selected analystsMediumClean reusable dataGoldBusiness users, BI tools, approved appsLow to mediumReporting and decisions

Security design should include:

  • Row-level security
  • Column masking
  • PII classification
  • Role-based access control
  • Audit logging
  • Retention policies
  • Data minimization

Do not wait until after dashboards are built to think about governance.

Complete Example: Daily Revenue Dashboard

Let’s follow one business question end to end.

The business asks:

What was net revenue yesterday by country and product category?

Bronze Sources

Raw data lands in:

bronze.raw_orders_cdc
bronze.raw_order_items_cdc
bronze.raw_refunds_api
bronze.raw_products_erp
bronze.raw_fx_rates

At this stage:

  • No revenue calculation
  • No business aggregation
  • No dashboard logic
  • Raw records preserved

Silver Entities

Cleaned data is produced:

silver.orders
silver.order_items
silver.refunds
silver.products
silver.fx_rates

Silver handles:

  • Deduplication
  • Timestamp normalization
  • Currency conversion
  • Refund matching
  • Product validation
  • Test order removal
  • Status standardization

Gold Data Product

Business-ready tables are produced:

gold.dim_date
gold.dim_product
gold.dim_country
gold.fct_order_line
gold.fct_refund
gold.daily_net_revenue

Gold calculation example:

CREATE TABLE gold.daily_net_revenue AS
SELECT
    d.date,
    c.country_name,
    p.category,
    SUM(f.net_revenue_usd) - COALESCE(SUM(r.refund_amount_usd), 0) AS net_revenue_usd
FROM gold.fct_order_line f
JOIN gold.dim_date d
    ON f.date_key = d.date_key
JOIN gold.dim_product p
    ON f.product_key = p.product_key
JOIN gold.dim_country c
    ON f.country_key = c.country_key
LEFT JOIN gold.fct_refund r
    ON f.order_line_id = r.order_line_id
GROUP BY
    d.date,
    c.country_name,
    p.category;

The dashboard reads from:

gold.daily_net_revenue

This gives business users one trusted place to answer the question.

Data Quality Gates by Layer

Quality should become stricter as data moves upward.

Bronze Quality Checks

Bronze checks focus on ingestion.

Examples:

  • Did the file arrive?
  • Can the payload be read?
  • Was the record stored?
  • Was metadata captured?
  • Is the source schema recorded?
  • Is the record count within expected range?

Bronze should preserve data, even if it is messy.

Silver Quality Checks

Silver checks focus on correctness.

Examples:

  • Primary keys are not null.
  • Current records are unique.
  • Required fields are populated.
  • Timestamps are valid.
  • Currency codes are valid.
  • Amounts are non-negative where required.
  • Foreign keys resolve.
  • Duplicate events are handled.
  • Late-arriving data is processed.

Silver should make data trustworthy.

Gold Quality Checks

Gold checks focus on business trust.

Examples:

  • Revenue reconciles with finance-approved logic.
  • Dashboard totals match expected controls.
  • Aggregates are not double-counted.
  • Metrics are documented.
  • Refresh SLA is met.
  • Row-level security works.
  • Sensitive fields are not exposed.

Gold should make data usable.

Common Anti-Patterns

1. Treating Bronze as a Random Dumping Ground

Bronze should be raw, but not careless.

Bad Bronze tables often miss:

  • Ingestion timestamp
  • Source name
  • Batch ID
  • File name
  • Schema version
  • Load status

Without metadata, raw data becomes hard to debug.

2. Letting Analysts Query Bronze Directly

This creates duplicated cleaning logic and inconsistent reporting.

Bronze is for preservation and replay.

Gold is for consumption.

3. Making Silver Too Dashboard-Specific

This is a warning sign:

silver.orders_for_finance_dashboard_final_v3

Silver should be reusable.

Dashboard-specific logic belongs in Gold.

4. Turning Gold Into a Copy of Silver

Gold should not simply rename Silver tables.

Gold should represent:

  • Metrics
  • Dimensions
  • Aggregates
  • Business logic
  • Analytical products

5. Dropping Bad Records Without Traceability

Bad records are inevitable.

Do not silently delete them.

Use quarantine tables.

6. Hiding Business Logic in BI Tools

If revenue logic exists only inside a dashboard formula, it will eventually fork.

Core business logic should live in governed transformations or a governed semantic layer.

7. Building Everything as Full Refresh

Full rebuilds are simple at small scale.

At larger scale, they become expensive and slow.

Use incremental processing where appropriate.

8. No Metric Ownership

Every important Gold metric should have:

  • Business owner
  • Technical owner
  • Definition
  • Grain
  • Refresh SLA
  • Known limitations

Without ownership, trust decays.

Production Readiness Checklist

Before calling a Medallion Architecture project production-ready, check the following.

Architecture

  • Bronze, Silver, and Gold responsibilities are documented.
  • Each table has a layer.
  • Each table has an owner.
  • Each table has a defined grain.
  • Naming conventions are consistent.
  • Source-to-dashboard lineage exists.

Data Engineering

  • Bronze ingestion is replayable.
  • Silver transformations are tested.
  • CDC logic is handled.
  • Deletes are handled.
  • Late-arriving data is handled.
  • Backfill strategy exists.
  • Quarantine tables exist.

Data Quality

  • Quality checks exist per layer.
  • Critical checks can block promotion.
  • Non-critical checks create alerts.
  • Failed records are observable.
  • Freshness is monitored.

Governance

  • PII is classified.
  • Access differs by layer.
  • Gold tables expose only necessary fields.
  • Metric definitions are documented.
  • Table ownership is assigned.

Operations

  • Pipelines are orchestrated.
  • Failures trigger alerts.
  • SLAs are defined.
  • Costs are monitored.
  • Schema drift is detected.
  • Run history is retained.

Consumption

  • Dashboards use Gold tables.
  • Analysts know which tables are certified.
  • Business users understand metric definitions.
  • ML users know which features are production-ready.

When Not to Use Full Medallion Architecture

Medallion Architecture is powerful, but not every project needs the full pattern.

You may not need it when:

  • The project is temporary.
  • Data volume is very small.
  • There is only one source.
  • There is only one report.
  • Historical reprocessing is not needed.
  • The work is early-stage exploration.

A simple table, view, or dbt model may be enough.

But once you have:

  • Multiple sources
  • Multiple teams
  • Changing business logic
  • Data quality issues
  • Compliance needs
  • Reprocessing requirements
  • Executive reporting

Medallion Architecture becomes extremely valuable.

Final Takeaway

Medallion Architecture is not really about Bronze, Silver, and Gold. It is about responsibility.

  • Bronze protects the raw evidence.
  • Silver creates trusted analytical records.
  • Gold delivers business-ready data products.

That separation gives analytics teams something every growing company eventually needs:

The ability to move fast without losing trust.

  • When a dashboard number changes, you can trace it.
  • When a source system breaks, you can isolate it.
  • When a business rule changes, you can reprocess it.
  • When someone asks where a metric came from, you can explain it.

A good Medallion Architecture does not just produce tables. It produces confidence.


메타데이터
post_id
f96147b1fb56
slug
medallion-architecture-for-data-analytics-a-practical-guide-to-building-trusted-data-products-f96147b1fb56
url
https://medium.com/@geeknomad/medallion-architecture-for-data-analytics-a-practical-guide-to-building-trusted-data-products-f96147b1fb56
canonical_url
https://medium.com/@geeknomad/medallion-architecture-for-data-analytics-a-practical-guide-to-building-trusted-data-products-f96147b1fb56
author_url
https://medium.com/@geeknomad
status
ok
fetched_at
2026-06-09 15:37:30