sql >> Databáze >  >> RDS >> Database

Co mají společného olympijské hry, fotbalové zápasy UEFA Euro 2016 a databáze?

Když lidé slyší, co dělám, mají tendenci se mě ptát na stejnou otázku:Dokážete vyvinout systém, který předpovídá výsledky fotbalových zápasů? Nebo výsledky olympijských medailí? Osobně předpovědím moc nevěřím. Přesto, pokud bychom měli velké množství historických dat a relevantních ukazatelů, určitě bychom mohli navrhnout systém, který by nám pomohl přijít s přesnějšími předpoklady. V tomto článku se budeme zabývat modelem, který může ukládat výsledky zápasů a turnajů.

Tento model je primárně zaměřen na evropské fotbalové (fotbalové) zápasy, statistiky a výsledky, ale lze jej snadno upravit tak, aby vyhovoval mnoha dalším sportům. Mojí hlavní motivací pro tento článek byly dvě letošní velké fotbalové události:mistrovství UEFA Euro 2016, které se právě stalo, a letní olympijské hry 2016, které se právě konají.

Co víme před začátkem turnaje?

Než turnaj začne, víme o něm téměř vše — kromě toho nejdůležitějšího:kdo vyhraje. Pojďme si stručně říci, co přesně už víme:

  • Data zahájení a ukončení turnaje
  • Místa, kde se budou zápasy konat
  • Přesné časy zahájení zápasů
  • Které týmy se do turnaje kvalifikovaly
  • Hráči každého z těchto týmů
  • Minulý výkon každého hráče a jeho současná forma

Jaké podrobnosti o shodě chceme uložit?

Turnaje se skládají z více zápasů. Než uložíme jakékoli podrobnosti o shodě, musíme:

  • Spojit každý zápas s turnajem
  • Zaznamenejte fázi turnaje, kdy se zápas odehrál (např. skupinová fáze, semifinále)

Potřebujeme také uložit podrobnosti o jednotlivých shodách, včetně:

  • Týmy zapojené do zápasu
  • Úvodní sestavy a střídání
  • Události zápasů (ve fotbale to jsou:gól, penalta, faul, žlutá karta atd.)
  • Konečné skóre
  • Akce hráčů během zápasu

Tato data použijeme k zachycení všech důležitých zápasů. Porovnání výkonu hráče před zápasem a během něj by mohlo vést k určitým závěrům. Možná bychom nebyli schopni předpovědět konečné výsledky jejich výkonu (tj. výhru nebo prohru), ale statistiky by nám určitě mohly pomoci vytvořit předpoklady s určitou mírou spolehlivosti.

Představení modelu




Model je rozdělen do čtyř hlavních oblastí:

  • Tournament details
  • Match details
  • Events
  • Indicators and Performance

Tabulky mimo tyto oblasti jsou slovníky (sport , phase , position ), katalogy (sport_event , team , player ) a jeden vztah many-to-many (plays ).

Nejprve popíšeme nekategorizované tabulky a poté se podrobně podíváme na každou oblast.

Nekategorizované tabulky

Tyto tabulky jsou důležité, protože tabulky ze všech čtyř oblastí je používají jako slovníky nebo katalogy.

sport tabulka uvádí všechny sporty, které uložíme do naší databáze. Pravděpodobně zde budeme mít pouze jeden sport, mužský fotbal, ale tato tabulka nám umožňuje v případě potřeby přidat podobné sporty (např. ženský fotbal).

V sport_event tabulky, uložíme události spojené s naším sportem(y). Jedním z příkladů mohou být „Olympijské hry 2016“.

phase table je slovník, který obsahuje všechny možné fáze turnaje. Obsahuje hodnoty jako „skupinová fáze“ , „kolo 16“ , „čtvrtfinále“ , „semifinále“ , „konečný“ .

team tabulka je, jak byste uhodli, jednoduchý seznam všech týmů. Možné hodnoty jsou „Chorvatsko“ , „Polsko“ , „USA“ atd. Pokud bychom databázi používali k ukládání informací o klubové nebo ligové soutěži, měli bychom také hodnoty jako „Barcelona“ , „Real Madrid“ , „Bayern“ , „Manchester United“ atd.

V player tabulky, uložíme záznamy pro všechny hráče patřící do příslušných týmů.

plays tabulka je náš jediný vztah mnoho k mnoha a týká se hráčů a týmů. Hráč může patřit do více než jednoho týmu současně (např. národní tým a klub), ale během turnaje bude samozřejmě hrát pouze za jeden tým.

Nakonec tu máme position stůl. Tento jednoduchý slovník uloží seznam všech požadovaných pozic. Ve fotbale mezi ně patří brankář, střední poločas, útočník atd.

Podrobnosti o turnaji

Poznámka: Pokud chcete pouze ukládat výsledky jednotlivých zápasů, nemusíte tuto sekci používat.

Turnaj se skládá z více než jednoho zápasu; UEFA Euro 2016 i fotbalové události na Letních olympijských hrách 2016 jsou turnaje. Jak jsme řekli dříve, můžeme uložit jeden zápas do naší databáze, ale také můžeme zápasy přiřadit k jejich relevantním turnajům. Tabulky v sekci Turnaj jsou:

  • tournament – Obsahuje všechny základní údaje o turnaji:sport, datum zahájení, datum ukončení atd. Musíme také uložit název turnaje a popis místa, kde se koná. sport_event_id atribut je volitelný, protože turnaj nemusí být spojen s větší událostí (jako je olympiáda).
  • group – Zde jsou uvedeny všechny skupiny v tomto turnaji. UEFA Euro 2016 mělo šest skupin, A až F.
  • participant – Toto jsou týmy hrající v turnaji; každý účastník může být zařazen do skupiny. Většina turnajů začíná skupinovou fází a poté pokračuje do vyřazovací fáze (např. UEFA Euro, UEFA World Cup, olympijský fotbal). Některé turnaje budou mít pouze skupinovou fázi (např. národní ligy), zatímco jiné budou mít pouze vyřazovací fázi (např. národní poháry).
  • in_team – Tato tabulka poskytuje vztah many-to-many, který ukládá informace o hráčích registrovaných pro daný turnaj a jejich očekávaných pozicích.
  • tournament_schedule – Podle mého názoru je to nejzajímavější tabulka v této sekci. Zde je uložen seznam všech her odehraných během tohoto turnaje. tournament_id atribut označuje, do kterého turnaje každý zápas patří, a phase_id atribut definuje fázi, během které bude zápas probíhat. Uložíme také místo zápasu a čas, kdy začíná. Oba účastníci budou popsáni textovými poli. Až skupinová fáze skončí, budeme znát všechny zápasy vyřazovací části. Například na začátku UEFA Euro 2016 jsme věděli, že vítěz skupiny E (1E) se utká s vicemistrem skupiny D (2D). Po odehrání všech tří kol ve skupinové fázi byla tato dvojice Itálie vs. Španělsko.

Podrobnosti o shodě

Match details oblast se používá k ukládání dat pro jednotlivé zápasy. Použijeme dvě tabulky:

  • match – Obsahuje všechny podrobnosti o jednom zápase; tento zápas může souviset s turnajem, ale může to být také jedna hra. Takže tournament_schedule_id atribut je volitelný a uložíme sport_id , start_time a location atributy opět zde. Pokud je zápas součástí turnaje, pak tournament_schedule_id bude přiřazena hodnota. team_1_id a team_1_id atributy jsou odkazy na týmy zapojené do zápasu. goals_team_1 a goals_team_2 atributy obsahují výsledek zápasu. Jsou povinné a pro oba by měly mít výchozí hodnotu „0“.
  • in_match – Tato tabulka obsahuje seznam všech hráčů, kteří jsou registrováni pro daný zápas; hráči, kteří se nezúčastní, budou mít v started_at NULL atribut, zatímco hráči, kteří přišli jako střídání, budou mít started_at> 0 . Pokud byl hráč nahrazen, bude mít ended_at atribut, který se shoduje s atributem started_at atribut hráče, který je nahradil. Pokud hráč zůstal po celý zápas, jeho ended_at atribut bude mít stejnou hodnotu jako end_time atribut.

Události zápasů

Tato sekce je určena k uložení všech podrobností nebo událostí, které se staly během hry. A tabulky jsou:

  • event – Toto je slovník, který obsahuje seznam všech událostí, které chceme uložit. Ve fotbale jsou to hodnoty jako „faul commited“ , „trpí faulem“ , „žlutá karta“ , „červená karta“ , „volný kop“ , „pokuta“ , „cíl“ , „offside“ , „náhrada“ , „hráč vyloučen ze zápasu“ .
  • match_event – To souvisí s událostmi se zápasem. Uložíme event_time a také informace o hráči související s touto událostí (in_match_id ).
  • related_event – To je to, co spojuje informace o událostech. Pro vysvětlení se podívejme na příklad, kdy hráč A fauluje hráče B. Vložíme záznam do match_event tabulka, která ukazuje, že hráč A se dopustil faulu, a další, která ukazuje, že hráč B utrpěl faul. Přidáme také záznam do related_event stůl, kde ‚spáchal faul‘ bude rodič a ‚utrpěný faul‘ bude dítě. Zaznamenáme také výsledky faulu:žlutá karta, volný kop nebo pokutový kop a možná i gól.

Ukazatele a výkon

Tato sekce by nám měla pomoci analyzovat hráče a týmy před a po zápase.

indicator tabulka je slovník s předdefinovanou sadou ukazatelů pro každého hráče před každým zápasem. Tyto ukazatele by měly popisovat aktuální formu hráče. Tento seznam může obsahovat hodnoty jako:„počet gólů v posledních 10 zápasech“ , „průměrná vzdálenost ujetá za posledních 10 zápasů“ , „počet uložení pro GK za posledních 10 zápasů“ .

performance slovník je velmi podobný indicator , ale použijeme jej k uložení pouze hodnot, které souvisejí s jednou shodou:„pokrytá vzdálenost“ , „přesné přihrávky“ , atd.

player_indicator a performance_indicator tabulky sdílejí téměř identickou strukturu:

  • in_match_id – označuje hráče účastnícího se určitého zápasu
  • indicator_id / performance_id – odkazuje na indicator nebo „slovníky výkonu
  • value – uloží hodnotu pro tento indikátor (např. hráč urazil vzdálenost 10,72 km)
  • description – v případě potřeby obsahuje další popis
  • Co se stalo během zápasu?

    Se všemi těmito vloženými daty jsme mohli snadno získat podrobnosti o zápase, události a statistiky pro každý zápas v naší databázi.

    Tento jednoduchý dotaz vrátí základní podrobnosti pro nadcházející zápas:

    SELECT team_1.`team_name`, team_2.`team_name`, `match`.`start_time`, `match`.`location`
    FROM `match`, `team` AS team_1, `team` AS team_2
    WHERE `match`.`team_1_id` = team_1.`id`
    AND `match`.`team_2_id` = team_2.`id`
    

    K získání seznamu všech událostí ve hře během určitého zápasu bychom použili dotaz níže:

    SELECT `event`.`event_name`, `match_event`.`event_time`, `player`.`first_name`, `player`.`last_name`
    FROM `match`, `match_event`, `event`, `in_match`, `player`
    WHERE `match_event`.`match_id` = `match`.`id`
    AND `event`.`id` = `match_event`.`event_id`
    AND `in_match`.`id` = `match_event`.`in_match_id`
    AND `player`.`id` = `in_match`.`player_id`
    AND `match`.`id` = @match
    ORDER BY `match_event`.`event_time` ASC
    

    Napadá mě mnoho dalších dotazů; je snadné provést analýzu, když máte data. Pokud jste změřili a uložili velké množství ukazatelů a dat o výkonu hráče, možná budete schopni spojit tyto parametry s konečným výsledkem. Osobně takovým předpovědím nevěřím; je tu faktor štěstí během zápasů a mnoho dalších faktorů, které nemůžete vědět, dokud hra nezačne. Přesto, pokud máte velký soubor dat a mnoho parametrů, vaše šance na přesnější předpovědi se zvyšuje.

    Model uvedený v tomto článku nám umožňuje ukládat zápasy, podrobnosti o zápasech a historii výkonu každého hráče. Můžeme také nastavit indikátory formy pro každého hráče před zápasem. Uložení dostatečného množství podrobností by nám mělo poskytnout více parametrů, na kterých můžeme založit naše předpoklady. Neříkám, že bychom mohli předvídat výsledek hry, ale mohli bychom se s tím trochu pobavit.

    Tento model bychom také mohli snadno vyladit pro ukládání dat pro jiné sporty. Tyto změny by neměly být příliš složité. Přidání sport_id atribut do slovníků by měl stačit. Přesto si myslím, že by bylo moudré mít novou instanci pro každý jiný sport.


  1. Vyberte odemčený řádek v Postgresql

  2. 10 tipů a triků pro správu efektivní databáze

  3. Visual Basic for Applications v aplikaci Microsoft Access

  4. Povolení TLS v R12.1