offdataai
Media, Gaming & Sports · data model template

Media & Streaming Analytics data model

Kimball warehouse for media streaming: transaction-grain playback events (quality and lifecycle telemetry), a monthly subscription periodic snapshot for MRR and churn, and a daily engagement snapshot over conformed viewer/content/device/plan/geo dimensions. Viewer PII is classified and masked.

Streaming media analytics covering playback telemetry, monthly subscription snapshots, and daily content engagement over conformed viewer, content, device, plan, and geo dimensions — a Kimball star schema with SCD2 viewer history and viewer PII masked under GDPR. It is a Kimball dimensional model: fact tables at a declared grain surrounded by conformed dimensions, ready for BI tools and a semantic layer.

KimballMedia, Gaming & SportsGDPRCCPA
10
tables
105
columns
15
relationships
4
PII columns

Opening the template creates a project with the ERD, platform-native DDL, a dbt project and documentation already generated (recommended platform: BigQuery). Edit it in plain English or on the canvas, then ship it to any supported warehouse.

Subject areas

playbacksubscriptionsengagementconformed_dimensions

Design decisions

  • Playback events as a transaction-grain fact

    Playback telemetry (start, buffer, error, complete) is high-volume event data; a transaction grain preserves quality-of-experience signals like rebuffering and startup time.

  • Monthly subscription snapshot

    MRR, churn, and tenure are semi-additive subscription metrics reported monthly, decoupled from playback volume.

  • Daily engagement snapshot separate from raw events

    Watch minutes and completion rate are pre-aggregated to viewer/content/day to keep recommendation and retention analysis performant without scanning raw event volume.

  • SCD2 on dim_viewer and masking on PII

    Acquisition channel and profile attributes change over time, so viewer history is preserved with SCD2; GDPR/CCPA require email hashing and masking of personal identifiers.

Tables in the Media & Streaming Analytics model

Every table with its grain, columns, types and keys. PK marks a primary key, BK a business key and PII a column classified as personal data, which gets a masking strategy by default.

Fact tables (3)

fct_playback_event

Grain: one row per playback event (transaction)

Transaction-grain playback telemetry — one row per event.

ColumnTypeKeys
playback_event_keybigintPK
date_keybigint
viewer_keybigint
content_keybigint
device_keybigint
geo_keybigint
event_type_keybigint
session_idvarchar
event_idvarchar
event_timestamptimestamp
playback_position_secondsinteger
bitrate_kbpsinteger
startup_time_msinteger
rebuffer_countsmallint
rebuffer_msinteger
is_errorboolean
error_codevarchar

fct_subscription_snapshot

Grain: one row per account per plan per month (periodic snapshot)

Monthly subscription snapshot — MRR is semi-additive.

ColumnTypeKeys
date_keybigint
viewer_keybigint
plan_keybigint
geo_keybigint
account_idvarchar
subscription_statusvarchar
mrrdecimal
discount_amountdecimal
tenure_monthsinteger
is_newboolean
is_churnedboolean
is_reactivatedboolean
is_trialboolean

fct_engagement

Grain: one row per viewer per content per day (periodic snapshot)

Daily engagement snapshot for watch-time and completion analysis.

ColumnTypeKeys
date_keybigint
viewer_keybigint
content_keybigint
device_keybigint
geo_keybigint
view_countinteger
watch_minutesdecimal
completion_ratedecimal
unique_titles_watchedinteger
is_completedboolean
rating_givensmallint

Dimension tables (6)

dim_date

Grain: one row per calendar day

ColumnTypeKeys
date_keybigintPK
full_datedateBK
day_of_weekvarchar
month_numbersmallint
quartersmallint
yearsmallint
is_weekendboolean
is_holidayboolean

dim_viewer

Grain: one row per viewer per SCD2 version

SCD type 2

ColumnTypeKeys
viewer_keybigintPK
viewer_idvarcharBK
account_idvarchar
emailvarcharPII
display_namevarcharPII
date_of_birthdatePII
age_bandvarchar
gendervarcharPII
profile_typevarchar
acquisition_channelvarchar
signup_datedate
is_primary_profileboolean

dim_content

Grain: one row per content title

ColumnTypeKeys
content_keybigintPK
content_idvarcharBK
titlevarchar
content_typevarchar
series_titlevarchar
season_numbersmallint
episode_numbersmallint
genrevarchar
subgenrevarchar
maturity_ratingvarchar
languagevarchar
release_yearsmallint
runtime_minutesinteger
is_originalboolean
studiovarchar

dim_device

Grain: one row per device type

ColumnTypeKeys
device_keybigintPK
device_idvarcharBK
device_typevarchar
device_osvarchar
device_brandvarchar
app_versionvarchar
max_resolutionvarchar

dim_plan

Grain: one row per subscription plan

ColumnTypeKeys
plan_keybigintPK
plan_idvarcharBK
plan_namevarchar
plan_tiervarchar
billing_cyclevarchar
monthly_pricedecimal
max_streamssmallint
max_resolutionvarchar
has_adsboolean
includes_downloadsboolean

dim_geo

Grain: one row per geographic territory

ColumnTypeKeys
geo_keybigintPK
geo_idvarcharBK
countryvarchar
country_codevarchar
regionvarchar
marketvarchar
timezonevarchar
is_licensed_marketboolean

Lookup tables (1)

dim_event_type

Grain: one row per playback event type

ColumnTypeKeys
event_type_keybigintPK
event_type_codevarcharBK
event_type_namevarchar
event_categoryvarchar

Relationships

Each relationship is a foreign key on the first table referencing the second.

  • fct_playback_event.date_key → dim_date (many-to-one)
  • fct_playback_event.viewer_key → dim_viewer (many-to-one)
  • fct_playback_event.content_key → dim_content (many-to-one)
  • fct_playback_event.device_key → dim_device (many-to-one)
  • fct_playback_event.geo_key → dim_geo (many-to-one)
  • fct_playback_event.event_type_key → dim_event_type (many-to-one)
  • fct_subscription_snapshot.date_key → dim_date (many-to-one)
  • fct_subscription_snapshot.viewer_key → dim_viewer (many-to-one)
  • fct_subscription_snapshot.plan_key → dim_plan (many-to-one)
  • fct_subscription_snapshot.geo_key → dim_geo (many-to-one)
  • fct_engagement.date_key → dim_date (many-to-one)
  • fct_engagement.viewer_key → dim_viewer (many-to-one)
  • fct_engagement.content_key → dim_content (many-to-one)
  • fct_engagement.device_key → dim_device (many-to-one)
  • fct_engagement.geo_key → dim_geo (many-to-one)

Related templates

All templates →
Start for $1

From requirements to AI-ready context, in one platform.

Describe your business in a conversation, start from a template or connect your own database. Your first model is ready in minutes.

Get startedBook a demo

Plans from $1/month · cancel any time