10.2 Designing Plans for Data Collection, Storage, Analysis, and AMS Workflows
Key Takeaways
Relational SQL databases overcome flat spreadsheet failures by linking normalized fact tables and dimension tables via immutable Primary Keys (PK) and Foreign Keys (FK).
Tidy Data (Third Normal Form) requires one variable per column, one observation per row, and one observational unit per table, favoring Long Format over Wide Format for longitudinal storage.
Automated ETL (Extract, Transform, Load) pipelines ingest RESTful API payloads into a staging layer for SI unit standardization and ISO 8601 timestamp normalization before warehouse loading.
A centralized Data Dictionary must govern variable definitions, sampling rates, calculation formulas, and explicit NULL representations—never coding missing tests as 0 or -999.
The 3-2-1 backup rule safeguards institutional data by keeping 3 total copies across 2 distinct storage media with at least 1 immutable or air-gapped copy stored off-site.
10.2 Designing Plans for Data Collection, Storage, Analysis, and AMS Workflows
As high-performance departments scale across multiple squads, seasons, and high-frequency measurement technologies, ad-hoc data management rapidly collapses. Designing a resilient architecture for data collection, storage, and analysis requires transitioning from fragmented desktop spreadsheets to relational database schemas, automated application programming interface () pipelines, rigorous metadata governance, and enterprise backup infrastructure.
Why Flat Spreadsheets Fail at Scale
In early-stage sport science programs, practitioners frequently store testing and workload data in disconnected spreadsheet workbooks. While spreadsheets are useful for rapid ad-hoc scratchpad calculations, relying on flat files as a primary database introduces severe structural failure modes:
- Entity Resolution and Naming Inconsistencies: Manual typing across tabs produces mismatched string identifiers (
"John Smith"in the tab,"Smith, John"in the force-plate tab, and"J. Smith"in the wellness sheet), breaking automated table joins (VLOOKUP/XLOOKUP) and orphaning athlete records. - Silent Formula Corruption and Lack of Audit Trails: A single accidental drag-and-drop or sorting error can shift rows relative to athlete names or overwrite a rolling average formula with a static number without generating any warning or historical log.
- Concurrency Bottlenecks and Row Limits: High-frequency time-series streams (such as or dual force-plate traces) generate millions of rows per week, rapidly exceeding spreadsheet memory limits and causing file corruption when multiple practitioners attempt simultaneous edits.
Relational Database Design () and Tidy Data Architecture
Primary Keys (), Foreign Keys (), and Star Schemas
A production Athlete Management System () is built upon a Relational Database Management System () queried via Structured Query Language (). Rather than duplicating athlete demographic details inside every single testing sheet, a relational database organizes information into interconnected tables structured around a Star Schema:
- Dimension Tables (Context & Entities): Store relatively static descriptive attributes about entities. For example, the
athletestable storesathlete_id,first_name,last_name,date_of_birth, anddominant_limb; thecalendar_microcycletable storessession_date,season_phase, anddays_to_match(, ); and theprotocolstable definesprotocol_id,hardware_vendor, andsampling_rate_hz. - Fact Tables (Longitudinal Event Streams): Store time-stamped quantitative measurements and testing events, such as
gps_session_summary,cmj_trials,daily_wellness_log, andisokinetic_tests. - Primary Keys (): Every table possesses a Primary Key—a unique, non-null, immutable identifier for each individual row (e.g.,
athlete_id = "ATH_0089"in theathletesdimension table, ortrial_uuidin thecmj_trialsfact table). Becauseathlete_idnever changes even if an athlete changes their jersey number, marries and changes their surname, or transfers between developmental and first-team rosters, longitudinal continuity is guaranteed. - Foreign Keys (): A column in a fact table that references the Primary Key of a dimension table (e.g.,
athlete_idinsidegps_session_summaryreferencingathletes.athlete_id). The database engine enforces referential integrity, preventing a practitioner or script from inserting a workload record for anathlete_idthat does not exist in the masterathletestable. Furthermore, creating composite B-tree indexes on(athlete_id, session_date)enables the database engine to execute multi-season longitudinal joins in milliseconds rather than scanning millions of unindexed rows.
Tidy Data Principles (Third Normal Form / )
To ensure seamless querying, statistical modeling in or Python, and business intelligence () visualization, database tables must adhere to Hadley Wickham's Tidy Data Principles (which mirror Codd's Third Normal Form [] in relational algebra):
- Every variable forms a single column (e.g.,
jump_height_cm,peak_propulsive_force_n,braking_impulse_ns). - Every observation forms a single row (e.g., one specific athlete's single jump trial on a specific timestamp).
- Every type of observational unit forms a separate table (keeping daily session summaries in a separate table from multi-trial force-plate jumps rather than mashing disparate granularities into one wide sheet).
| Structural Feature | Wide Format (Anti-Pattern for Storage) | Long / Tidy Format (Relational Best Practice) |
|---|---|---|
| Table Layout | Dates or trial numbers placed across column headers (athlete_id | 2026_09_01 | 2026_09_02 | 2026_09_03) | Dedicated columns for identifiers, time, and variables (athlete_id | session_date | metric_name | metric_value) |
| Schema Scalability | Requires adding a new column to the table structure every single day | Appends new rows infinitely without ever altering the table schema |
| Time-Series Filtering | Extremely difficult to filter date ranges or group by microcycle phase | Native filtering (WHERE session_date BETWEEN '2026-09-01' AND '2026-09-30') |
| Missing Data Handling | Creates sparse matrices filled with blank cells across hundreds of columns | Stores only actual recorded events or explicit NULL audit rows |
Automated Data Pipelines ( / ) and API Integration
Manual CSV downloading and uploading wastes practitioner hours and introduces human error. High-functioning sport science departments construct automated Extract, Transform, Load () (or cloud-native Extract, Load, Transform []) pipelines orchestrated via scheduled cloud scripts:
- Extract (Ingestion Layer — Webhooks vs. Scheduled Polling): Automated scripts communicate with third-party hardware clouds (e.g., tracking servers, force-plate cloud databases, nocturnal platforms) via RESTful using bearer token or authentication to retrieve structured JSON (JavaScript Object Notation) payloads. Ingestion can be triggered either via event-driven webhooks (where the force-plate cloud pushes a JSON payload to the team server the instant a jump trial is completed) or scheduled cron polling (e.g., querying the API every while respecting API rate limits and pagination cursors).
- Transform (Staging & Validation Layer): Before any external data touches the production warehouse, it passes through an automated staging gate that executes:
- Schema & Type Validation: Verifying that required fields exist and numeric metrics are floats/integers rather than corrupted text strings.
- Unit Standardization to Units: Converting all incoming measurements into standardized International System of Units ()—meters (), seconds (), kilograms (), Newtons (), and meters per second (). If a secondary weight room exports body mass in pounds () while the primary lab exports in kilograms (), failing to convert in the staging layer will deflate relative peak power () by a factor of , because the body-mass denominator is times too large.
- Timestamp Normalization (): Standardizing all dates and times to the international standard (
YYYY-MM-DDTHH:MM:SSZwith explicit offset). This eliminates ambiguity between American (MM/DD/YYYY) and European (DD/MM/YYYY) date formats and accurately synchronizes biological sleep/recovery data when teams travel across multiple time zones. - Idempotency & Deduplication: Ensuring that re-running an API sync script for the same date updates existing records (
UPSERTon unique trial IDs) rather than inserting duplicate rows.
- Load (Warehouse & Presentation Layer): Validated, cleaned records are committed via atomic transactions into the production relational database, automatically refreshing downstream analytical models and coach dashboards.
Data Dictionary Governance and the 3-2-1 Backup Strategy
The Canonical Data Dictionary
Every sport science database must be accompanied by a living, version-controlled Data Dictionary (metadata registry). For every variable in the , the Data Dictionary explicitly specifies:
- Canonical Column Name & Display Label: e.g.,
hsr_distance_m("High-Speed Running Distance "). - Physical Unit & Precision: e.g., meters (), rounded to decimal place.
- Exact Mathematical Formula & Threshold Definition: Documenting whether High-Speed Running is defined as an absolute threshold ( for a minimum dwell time of ) or an individualized threshold ( of each athlete's peak velocity). If a vendor firmware update changes the dwell-time filter from to , the Data Dictionary logs that metadata version change so longitudinal comparisons are adjusted.
- Missing-Data Representation (
NULLvs.0): A foundational rule of database governance is never encoding a missing observation as0or an arbitrary numeric placeholder such as-999. In a relational database, a missed test must be stored as a true databaseNULL(orNAin /NaNin Python). If a missed countermovement jump or missed session is recorded as0, SQLAVG()andSTDDEV()functions will treat0as a valid physiological performance of zero meters, catastrophically depressing the athlete's rolling 28-day chronic workload and distorting team -scores.
The 3-2-1 Institutional Backup Strategy
To ensure long-term Availability and disaster recovery against hardware failure, accidental table drops, or ransomware attacks, sport science infrastructure must implement the 3-2-1 Backup Rule:
- 3 Copies of Data: Maintain at least three complete copies of all institutional data (1 primary live production database plus 2 independent backup copies).
- 2 Different Storage Media: Store the copies across at least two distinct storage technologies or media types (e.g., cloud relational database storage plus local encrypted Network-Attached Storage [] or independent cloud object storage buckets).
- 1 Off-Site & Immutable Copy: Keep at least one backup copy geographically off-site in an immutable (Write-Once-Read-Many / ) or air-gapped vault that cannot be encrypted or deleted even if primary administrator credentials are compromised.
A sport scientist is migrating five seasons of athlete monitoring records from flat spreadsheets into a relational SQL database following Tidy Data (Third Normal Form) principles. How should the daily GNSS workload table be structured?
Create a separate spreadsheet tab for every individual athlete and manually copy-paste their weekly averages into a master summary tab every Sunday
Create one wide table where each athlete is a row and every calendar date of the season is added as a new column header (e.g., '2026_09_01_Dist', '2026_09_02_Dist')
Long format: one row per athlete-session with a primary key, foreign keys to the athlete and calendar tables, and one variable per column
Store athlete full names, home addresses, medical diagnoses, and 10 Hz raw GNSS coordinates together inside a single unindexed text column
An athlete participates in an outdoor team training session, but their GNSS tracking vest malfunctions and records no data. Until an imputed estimate can be calculated, how must the raw GNSS distance column for that athlete-session be stored in the relational database?
Enter '-999' as a numerical flag so the column retains a floating-point number in every database cell
Delete the athlete's entire profile from the master athletes dimension table for that training week
Store as a database NULL (or NA) with a sensor-failure status flag so SQL averages ignore the missing cell
Enter '0' so that SQL arithmetic functions do not return an error when summing weekly loads across sessions
A sport science team builds an automated ETL pipeline that pulls JSON payloads from three international training facilities via RESTful APIs. During the 'Transform' stage in the staging layer, which standardization protocol is essential before loading records into the production warehouse?
Averaging all individual jump trials into a single monthly team score and then deleting the raw trial records
Validate the schema, convert to SI units (m, s, kg, N), and normalize timestamps to ISO 8601 with UTC offsets
Replacing the unique athlete_id primary keys with athlete jersey numbers to make the tables easier to read
Converting all numeric variables into text strings and stripping the time-zone offsets from every timestamp
To protect thirty years of longitudinal testing data against ransomware and hardware failure, an organization implements the 3-2-1 backup strategy. What does this architecture require?
At least 3 copies of the data on 2 different storage media, with at least 1 off-site copy that is immutable or air-gapped
Compressing 3 database tables into 2 CSV files and emailing them to 1 coaching staff distribution list
Backing up the database 3 times per day onto 2 USB flash drives kept inside 1 locked desk drawer at the training facility
Retaining 3 years of data across 2 spreadsheet tabs managed by 1 database administrator
Sections you finish are checked off in the contents.