Riferimento completo delle tabelle
Lo schema public completo — ogni colonna di tutte le 45 tabelle, le 11 viste e
l'unico enum. Le pagine di dominio spiegano il perché ; questa pagina è il cosa .
Usala come strumento di consultazione.
PK = chiave primaria · FK → = chiave esterna verso table.column · N nella
colonna Null = la colonna è nullable. I tipi sono i tipi Postgres reali. Questa
pagina è generata dal database e riflette lo schema così come distribuito; quando una
migrazione modifica una tabella, rigenera la sezione interessata.
La row-level security è abilitata su
tutte le 45 tabelle Il fatto che una colonna sia elencata qui non significa che un client browser possa leggerla. Molte
tabelle sono service-role-only / deny-all (raggiungibili solo tramite edge function o la
service key) — ad esempio crm_user_roles, player_roles, steam_id_allowlist,
device_auth_requests, upload_credentials, tutte e quattro le tabelle growth,
lobby_join_events, permissions/role_permissions. Le pagine di dominio annotano la
postura RLS per ciascuna area; tratta le relazioni qui come logiche, non come una concessione di lettura.
Enum
Enum Valori game_storesteam · epic · gog · microsoft · other · riot · rockstar
Identità e accesso
→ pagina di dominio: Identità e accesso
playroll_users
L'hub. Indicizzata su user_id (UUID auth di Supabase).
Colonna Tipo Null Note user_iduuid PK , FK → auth.users.id (ON DELETE CASCADE)display_nametext N avatar_urltext N steam_idtext N UNIQUEdiscord_idtext N UNIQUEdiscord_usernametext N contributor_tiertext Tier corrente del programma (valore, non FK); default player. credits_earnednumeric credits_claimednumeric created_attimestamptz updated_attimestamptz steam_usernametext N steam_avatar_urltext N steam_hoursinteger N Arricchimento Steam ↓ steam_games_ownedinteger N steam_levelinteger N steam_profile_publicboolean N steam_account_createdbigint N Timestamp Unix steam_account_age_daysinteger N Calcolato da trigger (playroll_users_fill_steam_age). steam_vac_bannedboolean N steam_vac_bans_countinteger N steam_game_bans_countinteger N steam_days_since_last_baninteger N steam_enriched_attimestamptz N steam_friend_countinteger steam_friends_publicboolean N friends_fetched_attimestamptz N network_valueinteger Aggregato da shadow_graph. network_whale_countinteger countrytext N Attribuzione ↓ languagetext N utm_sourcetext N utm_mediumtext N utm_campaigntext N referrertext N device_typetext N referral_codetext N referred_bytext N referral_countinteger priority_scoreinteger
steam_id_allowlist
Colonna Tipo Null Note steam_idtext PK roletext FK → player_role_catalog.role; default pioneer.notetext N added_attimestamptz added_bytext N enabledboolean
auth_user_steam_lookup
Colonna Tipo Null Note steam_idtext PK user_iduuid FK → auth.users.id; UNIQUE. Mantenuta da auth_user_steam_lookup_sync_trg.created_attimestamptz updated_attimestamptz
steam_openid_nonces
Colonna Tipo Null Note noncetext PK seen_attimestamptz
player_role_catalog
Colonna Tipo Null Note roletext PK rankinteger Più alto = più accesso. descriptiontext N created_attimestamptz
player_roles
Colonna Tipo Null Note iduuid PK user_iduuid FK → playroll_users.user_idroletext FK → player_role_catalog.rolegranted_attimestamptz granted_bytext N
crm_user_roles
RBAC dello staff, indicizzata per email.
Colonna Tipo Null Note emailtext PK roletext CHECK admin / cm / vc / sales. Collegata per valore a role_permissions.role. granted_attimestamptz granted_bytext N notestext N
permissions
Colonna Tipo Null Note idinteger PK resourcetext actiontext CHECK read / write. descriptiontext N created_attimestamptz
role_permissions
Colonna Tipo Null Note roletext permission_idinteger FK → permissions.idgranted_bytext N granted_attimestamptz
device_auth_requests
Legacy / superata — 0 righe, RLS deny-all, sostituita dal flusso di redirect steam-login.
Colonna Tipo Null Note device_codetext PK statustext Default pending. access_tokentext N refresh_tokentext N user_iduuid N Nessuna FK. user_profilejsonb N created_attimestamptz completed_attimestamptz N expires_attimestamptz Default now() + 10 min.
upload_credentials
Legacy / inutilizzata — 0 righe, nessun writer, RLS deny-all (solo service-key).
Colonna Tipo Null Note mac_hashtext PK user_idtext UNIQUE (text, non una FK uuid verso playroll_users).created_attimestamptz last_used_attimestamptz N is_activeboolean
playroll_user_consents
Log dei consensi append-only (nessuna colonna revoked; le revoche sono nuove righe).
Colonna Tipo Null Note iduuid PK user_iduuid FK → auth.users.id (non playroll_users).consent_typetext CHECK age_confirmation / tos / privacy / eula / edc_gameplay. versiontext accepted_attimestamptz countrytext N metadatajsonb {action:'withdrawal'} segna una revoca.ip_addressinet N user_agenttext N
contributor_status_projection
Proiezione lato app scritta da redeem-activation-code. Nessun PII. (Il portale possiede la tabella sorgente contributor_app_links.)
Colonna Tipo Null Note app_user_iduuid PK , FK → auth.users.id (ON DELETE CASCADE).contributor_iduuid link_statustext CHECK verified (unico valore). source_link_iduuid steam_idtext N linked_attimestamptz source_updated_attimestamptz last_synced_attimestamptz
Spina dorsale delle registrazioni
→ pagina di dominio: Spina dorsale delle registrazioni
recording_sessions
Indicizzata su un session_id di tipo text (rec-<epoch-ms>).
Colonna Tipo Null Note session_idtext PK user_idtext game_nametext N chunk_countinteger N statustext Default uploading. client_ended_attimestamptz N server_verified_attimestamptz N created_attimestamptz N updated_attimestamptz N Mantenuta da trigger. detected_resolutionjsonb N game_slugtext N recording_started_attimestamptz N recording_ended_attimestamptz N duration_secondsbigint N Orologio canonico della registrazione. CHECK ≥ 0.required_artifact_modetext CHECK mp4_csv_json (default) / mp4_csv. uploadability_statustext N CHECK uploadable / blocked / NULL. block_reasontext N lobby_iduuid N Per valore — nessuna FK (il binding alla lobby è imposto da trigger). hw_snapshot_iduuid N FK → device_hw_snapshots.idcore_versiontext N ui_versiontext N installer_versiontext N transcript_expectedboolean Impostata a true a fine sessione se e solo se esiste _mic.aac (EC-407). transcript_skippedboolean Scrivibile dal client tramite GRANT con scope + RLS (EC-409). dismissedboolean "Nascondi dall'Activity" scrivibile dal client (EC-411).
s3_uploads
Una riga per file caricato. Si collega a una sessione per valore su session_id.
Colonna Tipo Null Note iduuid PK s3_keytext s3_buckettext Default playroll-captures. user_idtext upload_yearinteger Chiave di partizione upload_monthinteger CHECK 1–12. upload_dayinteger CHECK 1–31. session_idtext Si unisce a recording_sessions.session_id (valore). chunk_dirtext N filenametext file_typetext mp4 / csv / json / ogg (legacy).size_bytesbigint N etagtext N uploaded_attimestamptz statustext CHECK uploaded (default) / processing / completed / failed. lobby_iduuid N FK → lobbies.id (NOT VALID).recording_started_attimestamptz N recording_ended_attimestamptz N game_slugtext N Verificata dal trigger s3_uploads_enforce_lobby_game_match (solo per i tag di lobby). artifact_kindtext N Nessun CHECK; derivata dal suffisso: video/input/meta/transcript; NULL = non classificato (EC-289).
device_hw_snapshots
Chiave di deduplicazione (user_id, hw_fingerprint).
Colonna Tipo Null Note iduuid PK created_attimestamptz updated_attimestamptz user_idtext hw_fingerprinttext cpu_modeltext N cpu_architecturetext N logical_processorsinteger N physical_memory_mibbigint N os_releasetext N primary_gpu_vendortext N primary_gpu_nametext N primary_gpu_drivertext N primary_gpu_driver_nvidiatext N snapshotjsonb Blob HW completo. sourcetext ui_login (edge fn di login, predominante) / core_meta_json (Lambda di upload); default core_meta_json.
pipeline_sessions
PK composita (session_id, environment) — una riga per sessione per ambiente.
Colonna Tipo Null Note session_idtext PK (con environment)environmenttext PK (con session_id); CHECK dev / prod (default prod).user_idtext game_slugtext N s3_prefixtext stagesmallint Default 0. statustext CHECK pending (default) / processing / verified / failed. mp4_keytext N csv_keytext N ogg_keytext N size_bytes_totalbigint N errortext N created_attimestamptz verified_attimestamptz N
pipeline_runs
Colonna Tipo Null Note run_iduuid PK pipeline_nametext session_idtext N user_idtext N trigger_typetext Default manual. created_bytext Default prefect-ui. statustext CHECK running (default) / pass / fail / skipped. steps_executedtext[] N step_durations_sjsonb N params_usedjsonb N output_prefixtext N error_detailtext N prefect_flow_run_idtext N started_attimestamptz completed_attimestamptz N
nvenc_known_contenders
Colonna Tipo Null Note process_nametext PK first_seentimestamptz last_seentimestamptz total_eventsbigint total_usersinteger sample_codecstext[] sample_resolutionstext[]
nvenc_contender_user_links
Colonna Tipo Null Note process_nametext FK → nvenc_known_contenders.process_nameuser_idtext first_seentimestamptz last_seentimestamptz
bug_reports
Colonna Tipo Null Note iduuid PK created_attimestamptz user_iduuid steam_idtext N hw_configjsonb installer_versiontext N ui_versiontext N core_versiontext N titletext CHECK lunghezza 1–200. descriptiontext CHECK lunghezza 1–10000. statustext CHECK logged (default) / in_progress / fixed / verified / wont_fix. categorytext CHECK ui / recording / performance / onboarding / other. imagestext[] linear_tickettext N Compilata automaticamente dal trigger bug_reports_to_linear (AFTER INSERT). updated_attimestamptz steam_usernametext N connectionjsonb N electron_runtimejsonb N
Lobby e catalogo
→ pagina di dominio: Lobby e catalogo
lobbies
Colonna Tipo Null Note iduuid PK lobby_codetext creator_idtext game_slugtext FK → eligible_games.slug (ON UPDATE CASCADE / ON DELETE RESTRICT).statustext CHECK active (default) / closed / expired. max_playersinteger CHECK 2–16 (default 16). created_attimestamptz expires_attimestamptz
lobby_participants
PK composita (lobby_id, user_id) — membership corrente.
Colonna Tipo Null Note lobby_iduuid PK (con user_id); FK → lobbies.iduser_idtext PK (con lobby_id)joined_attimestamptz session_idtext N Si unisce a recording_sessions. server_recording_started_attimestamptz N
lobby_join_events
Storia prevalentemente append. INSERT al join; il leave aggiorna (UPDATE) left_at (nessuna nuova riga). Pilotata da trigger su lobby_participants.
Colonna Tipo Null Note idbigint PK lobby_iduuid FK → lobbies.iduser_idtext joined_attimestamptz left_attimestamptz N Marcata al leave. sourcetext Default participant_insert.
eligible_games
Colonna Tipo Null Note igdb_idinteger PK slugtext display_nametext enabledboolean N cover_urltext N created_attimestamptz N updated_attimestamptz N tokensjsonb Token di match per il rilevamento della libreria; NOT NULL, default {}.
game_store_ids
Colonna Tipo Null Note iduuid PK igdb_idinteger FK → eligible_games.igdb_id (ON DELETE CASCADE).storegame_store Enum (steam/epic/gog/microsoft/riot/rockstar/other). store_idtext
game_runtime_profiles
Colonna Tipo Null Note iduuid PK game_store_iduuid FK → game_store_ids.idexe_nametext platformtext N notestext N enginetext N FK → engine_defaults.enginesettings_overridejsonb N settings_enforcementjsonb
engine_defaults
Colonna Tipo Null Note enginetext PK settings_specjsonb created_attimestamptz updated_attimestamptz
user_game_library
Colonna Tipo Null Note iduuid PK user_iduuid playnite_iduuid plugin_iduuid N providertext provider_game_idtext N nametext is_installedboolean N is_hiddenboolean N is_favoriteboolean N playtime_secondsbigint N play_countbigint N last_played_attimestamptz N executablesjsonb N genresjsonb N developersjsonb N publishersjsonb N release_datetext N cover_image_urltext N platformtext N install_size_bytesbigint N game_registry_igdb_idinteger N FK → eligible_games.igdb_idsynced_attimestamptz N created_attimestamptz N updated_attimestamptz N
Growth e network
→ pagina di dominio: Growth e network
shadow_graph
Colonna Tipo Null Note iduuid PK source_user_iduuid FK → playroll_users.user_idsource_steam_idtext target_steam_idtext target_nametext N target_avatar_urltext N target_profile_urltext N target_hoursinteger N target_games_ownedinteger N target_levelinteger N target_profile_publicboolean N target_tiertext CHECK whale / regular / casual (default casual). target_yearly_valueinteger Punteggio di valore di reclutamento. recruitment_statustext CHECK none (default) / invited / converted. invited_attimestamptz N converted_attimestamptz N converted_user_iduuid N FK → playroll_users.user_id (nessun cascade).friend_sincebigint N created_attimestamptz updated_attimestamptz Edge UNIQUE: (source_user_id, target_steam_id).
invite_codes
Colonna Tipo Null Note codetext PK pooltext Default phase_0. max_usesinteger CHECK > 0 (default 1). usesinteger CHECK 0 ≤ uses ≤ max_uses. activeboolean notestext N created_byuuid N FK → playroll_users.user_idcreated_attimestamptz expires_attimestamptz N
invite_code_consumptions
PK composita (code, user_id) — un utente consuma un dato codice al massimo una volta.
Colonna Tipo Null Note codetext PK (con user_id); FK → invite_codes.codeuser_iduuid PK (con code); FK → playroll_users.user_idconsumed_attimestamptz ip_hashtext N user_agenttext N
redeem_attempt_log
Log del rate-limiter per il flusso di activation-code del contributor (redeem-activation-code, EC-227) — non i codici invito. app_user_id è un uuid senza vincoli (riferimento soft, nessuna FK).
Colonna Tipo Null Note idbigint PK app_user_iduuid Nessuna FK. iptext N code_hashtext N successboolean Default false. attimestamptz
Release
→ pagina di dominio: Release e notifiche
app_releases_v2
Colonna Tipo Null Note idbigint PK release_keytext installer_versiontext core_versiontext ui_versiontext download_urltext installer_sha256text N release_notestext N metadatajsonb Default {}. created_attimestamptz release_tracktext CHECK stable / dev / test (nessun beta). release_notes_technicaltext N release_notes_user_facingtext N
app_rollouts_v2
Colonna Tipo Null Note iduuid PK nametext release_idbigint FK → app_releases_v2.idenabledboolean priorityinteger tracktext force_updateboolean percentageinteger experiment_keytext N ab_buckettext N include_user_idsuuid[] exclude_user_idsuuid[] include_install_idstext[] starts_attimestamptz ends_attimestamptz N created_attimestamptz updated_attimestamptz
app_rollout_overrides_v2
Colonna Tipo Null Note iduuid PK target_typetext target_idtext release_idbigint FK → app_releases_v2.idenabledboolean force_updateboolean reasontext N expires_attimestamptz N created_attimestamptz
app_update_resolve_audit_v1
Una riga per chiamata di resolve (25 colonne).
Colonna Tipo Null Note idbigint PK created_attimestamptz install_idtext N user_iduuid N request_tracktext N installed_installer_versiontext N installed_core_versiontext N installed_ui_versiontext N installed_tracktext N Sorgente per user_current_track. track_ordertext[] assignment_sourcetext rollout / override / default assignment_tracktext N rollout_iduuid N override_iduuid N buckettext N experiment_keytext N target_release_idbigint N target_installer_versiontext N target_core_versiontext N target_ui_versiontext N update_availableboolean update_requiredboolean force_updateboolean reasontext N resolver_versiontext
app_update_resolve_rate_limit
Colonna Tipo Null Note ip_sha256bytea PK (con window_start)window_starttimestamptz Finestra allineata a 60s. request_countinteger last_seen_attimestamptz
Notifiche
→ pagina di dominio: Release e notifiche
notification_event
Colonna Tipo Null Note iduuid PK categorytext typetext urgency_tiertext payloadjsonb ctajsonb N sourcetext localetext allowed_channelstext[] audience_filterjsonb Risolto da resolve_audience(). recipient_countinteger created_attimestamptz expires_attimestamptz N
notification_deliveries
Colonna Tipo Null Note iduuid PK event_iduuid FK → notification_event.iduser_iduuid channeltext statustext error_codetext N queued_attimestamptz sent_attimestamptz N
notification_state
Colonna Tipo Null Note event_iduuid FK → notification_event.iduser_iduuid read_attimestamptz N dismissed_attimestamptz N acted_attimestamptz N created_attimestamptz
notification_groups
Colonna Tipo Null Note iduuid PK slugtext nametext descriptiontext N created_byuuid N created_attimestamptz
notification_group_members
Colonna Tipo Null Note group_iduuid FK → notification_groups.iduser_iduuid added_attimestamptz added_byuuid N
notification_user_prefs
Colonna Tipo Null Note user_iduuid PK enable_payment_and_validationboolean enable_app_update_and_termsboolean enable_catalog_and_announcementsboolean enable_soundboolean enable_emailboolean updated_attimestamptz
Viste
Undici viste proiettano le tabelle qui sopra per consumatori specifici. Sono
security_invoker dove espongono dati con scope per riga, quindi la RLS sulle
tabelle sottostanti governa comunque la visibilità.
Vista Basata su Scopo playroll_users_viewplayroll_users + auth.usersProiezione di lettura canonica dell'utente (profilo + email auth). investor_daily_recording_kpis_vc_viewrecording_sessionsKPI giornalieri VC/investor-safe dalla durata canonica. Nessun PII. daily_upload_statss3_uploadsVolumi di upload giornalieri. upload_summary_by_users3_uploads + playroll_usersRiepilogo upload per utente, identity-first. player_recording_sessionsrecording_sessionsElenco delle sessioni per giocatore. session_completion_statusrecording_sessionsRollup di completamento/stato terminale per sessione. complete_tripletss3_uploadsLegacy — richiede mp4 + ogg + csv (nessun termine JSON). OGG rimosso in EC-173 → corrisponde solo a righe storiche, non all'insieme moderno validato.support_recording_sessionsrecording_sessions + s3_uploadsVista delle sessioni per support/tester (durata canonica + evidenze dei file). support_recording_filess3_uploadsVista a livello di file per il support (chi ha caricato ogni file, chiavi, URL, status). support_player_upload_summaryrecording_sessions + s3_uploadsRiepilogo di lookup del giocatore per il support. user_current_trackapp_update_resolve_audit_v1Track di release corrente per utente; alimenta il filtro app_track di resolve_audience().
Le dashboard che consumano queste viste sono documentate in
Dashboard → Viste Supabase e nella pagina
Database → Viste di monitoraggio .
Come viene rigenerata questa pagina
Questo riferimento rispecchia lo schema reale. Per aggiornarlo dopo una migrazione, la
struttura proviene da tre query contro il progetto Playroll Supabase
(information_schema / pg_catalog): l'elenco tabelle+colonne, l'elenco delle chiavi
esterne e l'elenco degli enum. Riesegui quelle query, confronta con le tabelle qui sopra e aggiorna
la sezione interessata nello stesso change che rilascia la migrazione — secondo la
regola del workspace per cui playroll-docs è mantenuto in sync con le modifiche allo schema.