offdataai
Media, Gaming & Sports · data model template

Sports League EDW data model

Data Vault 2.0 raw vault for a sports league: hubs (player/team/game/venue/season), links (player-roster over player+team+season, game-team, game-venue, team-season), and satellites for player (PII), team, game, and venue history plus a roster effectivity satellite and a per-game player-stats transactional satellite. Hash keys and load metadata are generated by the DDL layer.

Sports-league enterprise data warehouse as a Data Vault 2.0 raw vault: player, team, game, venue, and season hubs; roster and scheduling links including a three-hub player-roster link; and descriptive, effectivity, and game-stats satellites — designed to consolidate player, roster, and game data from many league, scouting, ticketing, and tracking systems with full historization for as-of roster and statistical reporting. It is a Data Vault 2.0 raw vault: hubs for business keys, links for relationships and satellites for descriptive history, with hash keys and hash diffs generated in the DDL.

Data Vault 2.0Media, Gaming & SportsGDPRCCPA
16
tables
99
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: Databricks). Edit it in plain English or on the canvas, then ship it to any supported warehouse.

Subject areas

hubslinkssatellitesreference

Design decisions

  • Three-hub player-roster link

    Roster membership is the intersection of a player, a team, and a season; a single link over all three hubs models it once so roster effectivity and game stats hang off that exact grain.

  • Roster membership as an effectivity satellite

    Players are traded, injured, and released mid-season; an effectivity satellite on the player-roster link records the valid period of each assignment for as-of roster reconstruction.

  • Per-game stats as a transactional satellite

    Box-score stat lines are immutable per-game events; a transactional satellite on the roster link captures each game's line with its load metadata, keeping descriptive satellites compact and stats append-only.

  • Game and venue as separate hubs

    A game is played at a venue but both are referenced independently by schedules, broadcasts, and ticketing; modeling each as a hub keeps those relationships as independent, reusable links.

Tables in the Sports League EDW 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.

Hubs (5)

hub_player

Grain: one row per unique hub_player business key

Player by league-assigned player identifier.

ColumnTypeKeys
player_idvarcharBK
load_datetimestamp
record_sourcevarchar

hub_team

Grain: one row per unique hub_team business key

Team / franchise by team code.

ColumnTypeKeys
team_codevarcharBK
load_datetimestamp
record_sourcevarchar

hub_game

Grain: one row per unique hub_game business key

Game / match by its game identifier.

ColumnTypeKeys
game_idvarcharBK
load_datetimestamp
record_sourcevarchar

hub_venue

Grain: one row per unique hub_venue business key

Stadium / arena by venue identifier.

ColumnTypeKeys
venue_idvarcharBK
load_datetimestamp
record_sourcevarchar

hub_season

Grain: one row per unique hub_season business key

Season by its season code.

ColumnTypeKeys
season_codevarcharBK
load_datetimestamp
record_sourcevarchar

Links (4)

lnk_player_roster

Grain: one row per lnk_player_roster relationship

Player on a team's roster for a season.

ColumnTypeKeys
player_hkbinary
team_hkbinary
season_hkbinary
load_datetimestamp
record_sourcevarchar

lnk_game_team

Grain: one row per lnk_game_team relationship

Teams participating in a game (home / away).

ColumnTypeKeys
game_hkbinary
team_hkbinary
load_datetimestamp
record_sourcevarchar

lnk_game_venue

Grain: one row per lnk_game_venue relationship

Where a game was played.

ColumnTypeKeys
game_hkbinary
venue_hkbinary
load_datetimestamp
record_sourcevarchar

lnk_team_season

Grain: one row per lnk_team_season relationship

A team's participation in a season.

ColumnTypeKeys
team_hkbinary
season_hkbinary
load_datetimestamp
record_sourcevarchar

Satellites (6)

sat_player_details

Grain: one row per player_hk per change

Player descriptive history (PII).

ColumnTypeKeys
player_hkbinaryPK
load_datetimestampPK
first_namevarcharPII
last_namevarcharPII
date_of_birthdatePII
nationalityvarchar
positionvarchar
height_cminteger
weight_kginteger
dominant_handvarchar
load_end_datetimestamp
record_sourcevarchar

sat_team_details

Grain: one row per team_hk per change

Team descriptive history.

ColumnTypeKeys
team_hkbinaryPK
load_datetimestampPK
team_namevarchar
cityvarchar
conferencevarchar
divisionvarchar
founded_yearinteger
head_coachvarcharPII
load_end_datetimestamp
record_sourcevarchar

sat_game_details

Grain: one row per game_hk per change

Game descriptive history.

ColumnTypeKeys
game_hkbinaryPK
load_datetimestampPK
game_datedate
game_typevarchar
home_scoreinteger
away_scoreinteger
attendanceinteger
game_statusvarchar
load_end_datetimestamp
record_sourcevarchar

sat_venue_details

Grain: one row per venue_hk per change

Venue descriptive history.

ColumnTypeKeys
venue_hkbinaryPK
load_datetimestampPK
venue_namevarchar
cityvarchar
statevarchar
countryvarchar
capacityinteger
surface_typevarchar
load_end_datetimestamp
record_sourcevarchar

sat_roster_effectivity

Grain: one row per player-roster assignment per effectivity change

Effectivity satellite on the player-roster link.

ColumnTypeKeys
player_roster_hkbinaryPK
load_datetimestampPK
roster_statusvarchar
jersey_numbervarchar
contract_typevarchar
effective_fromdate
effective_todate
is_currentboolean
load_end_datetimestamp
record_sourcevarchar

sat_player_game_stats

Grain: one row per player-roster per game stat line (transactional satellite)

Transactional satellite — per-game box-score stats on the roster link.

ColumnTypeKeys
player_roster_hkbinaryPK
load_datetimestampPK
game_idvarchar
stat_tstimestamp
minutes_playedinteger
pointsinteger
assistsinteger
reboundsinteger
turnoversinteger
plus_minusinteger
load_end_datetimestamp
record_sourcevarchar

Lookup tables (1)

ref_position

Grain: one row per playing position

ColumnTypeKeys
position_codevarcharBK
position_namevarchar
position_groupvarchar

Relationships

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

  • lnk_player_roster.player_hk → hub_player (many-to-one)
  • lnk_player_roster.team_hk → hub_team (many-to-one)
  • lnk_player_roster.season_hk → hub_season (many-to-one)
  • lnk_game_team.game_hk → hub_game (many-to-one)
  • lnk_game_team.team_hk → hub_team (many-to-one)
  • lnk_game_venue.game_hk → hub_game (many-to-one)
  • lnk_game_venue.venue_hk → hub_venue (many-to-one)
  • lnk_team_season.team_hk → hub_team (many-to-one)
  • lnk_team_season.season_hk → hub_season (many-to-one)
  • sat_player_details.player_hk → hub_player (many-to-one)
  • sat_team_details.team_hk → hub_team (many-to-one)
  • sat_game_details.game_hk → hub_game (many-to-one)
  • sat_venue_details.venue_hk → hub_venue (many-to-one)
  • sat_roster_effectivity.player_roster_hk → lnk_player_roster (many-to-one)
  • sat_player_game_stats.player_roster_hk → lnk_player_roster (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