Verified by Garnet Grid

Enterprise Data Analytics Architecture

Design analytics solutions for enterprise environments. Covers BI architecture, self-service analytics, data governance, semantic layers, and analytics engineering with dbt.

Enterprise analytics failed for decades because of the same pattern: build a data warehouse, throw Tableau on top, hope people use it. Self-service analytics doesn’t mean giving everyone access to raw SQL. It means building a governed semantic layer that lets business users answer their own questions without corrupting the data or misinterpreting metrics.


Modern Analytics Architecture

Data Sources          Ingestion        Warehouse        Semantic        Consumption
┌──────────┐        ┌──────────┐     ┌──────────┐     ┌──────────┐   ┌──────────┐
│ ERP      ├──CDC──▶│          │     │          │     │          │   │ BI Tool  │
│ CRM      ├──API──▶│ Fivetran │────▶│ Snowflake│────▶│ dbt      │──▶│ Dashboards│
│ SaaS     ├──File─▶│ Airbyte  │     │ BigQuery │     │ Metrics  │   │ Self-svc │
│ Events   ├──Event▶│ Custom   │     │ Redshift │     │ Layer    │   │ Embedded │
└──────────┘        └──────────┘     └──────────┘     └──────────┘   └──────────┘

dbt Semantic Layer

-- models/marts/finance/fct_revenue.sql

WITH orders AS (
    SELECT * FROM {{ ref('stg_orders') }}
),

payments AS (
    SELECT * FROM {{ ref('stg_payments') }}
)

SELECT
    orders.order_id,
    orders.customer_id,
    orders.order_date,
    orders.product_id,
    payments.payment_method,
    payments.amount AS revenue,
    
    -- Derived metrics (single source of truth)
    CASE
        WHEN payments.amount > 1000 THEN 'enterprise'
        WHEN payments.amount > 100 THEN 'mid-market'
        ELSE 'smb'
    END AS customer_segment,
    
    -- Date dimensions
    DATE_TRUNC('month', orders.order_date) AS order_month,
    DATE_TRUNC('quarter', orders.order_date) AS order_quarter

FROM orders
LEFT JOIN payments ON orders.order_id = payments.order_id
WHERE payments.status = 'completed'

Metric Definitions

PrincipleImplementation
Single definitionEach metric defined once in the semantic layer
Version controlledMetric logic in Git, reviewed in PRs
DocumentedDescription, formula, owner for every metric
Testeddbt tests validate data quality
GovernedAccess controlled by role and data classification
# dbt metric definition
metrics:
  - name: monthly_recurring_revenue
    label: "Monthly Recurring Revenue (MRR)"
    description: "Sum of all active subscription amounts, normalized to monthly"
    type: simple
    type_params:
      measure: revenue
    filter:
      - "subscription_status = 'active'"
    time_grains: [day, week, month, quarter]
    dimensions: [customer_segment, product_tier, region]
    owner: "finance-analytics@company.com"

Self-Service Tiers

TierUsersToolsGovernance
Curated dashboardsAll employeesPre-built Tableau/Looker dashboardsHigh — metric definitions locked
Explore/drill-downBusiness analystsExplore mode in BI toolMedium — explore curated models only
SQL accessData analystsSQL interface on warehouseMedium — read-only, governed schemas
Raw data accessData engineersDirect warehouse accessLow — for pipeline development only

Anti-Patterns

Anti-PatternProblemFix
Multiple metric definitions”Revenue” means different things in different toolsSingle semantic layer (dbt metrics)
Raw table access for everyoneWrong joins, data misinterpretationGoverned views and curated models
No data dictionaryNobody knows what columns meandbt docs + data catalog
Dashboard sprawl500 dashboards, 50 are usedDashboard lifecycle management, retire unused
Extract to ExcelData leaves governance, becomes staleEmbedded analytics, live connections

Checklist

  • Data warehouse selected and configured
  • Ingestion pipeline for all critical data sources
  • dbt project: staging → intermediate → marts layers
  • Semantic layer: all metrics defined once, documented
  • BI tool connected to semantic layer (not raw tables)
  • Access controls: tiered by role (curated → explore → SQL)
  • Data quality: dbt tests on all critical models
  • Documentation: data dictionary, metric ownership
  • Dashboard governance: review cycle, retire unused

:::note[Source] This guide is derived from operational intelligence at Garnet Grid Consulting. For analytics consulting, visit garnetgrid.com. :::

Jakub Dimitri Rezayev
Jakub Dimitri Rezayev
Founder & Chief Architect • Garnet Grid Consulting

Jakub holds an M.S. in Customer Intelligence & Analytics and a B.S. in Finance & Computer Science from Pace University. With deep expertise spanning D365 F&O, Azure, Power BI, and AI/ML systems, he architects enterprise solutions that bridge legacy systems and modern technology — and has led multi-million dollar ERP implementations for Fortune 500 supply chains.

View Full Profile →