2016-12-21 53 views
9

Próbuję przechowywać i przetwarzać wydarzenia sportowe w czasie rzeczywistym i chcę stworzyć optymalny system, ponieważ będzie to przetwarzało 100 s zdarzeń na sekundę. System będzie przechowywać zdarzenia przed meczem sportowym, a następnie przetwarzać je w czasie rzeczywistym lub na koniec pół/sesji/meczu.Modelowanie baz danych do definiowania i przetwarzania wydarzeń sportowych w czasie rzeczywistym

W moim systemie, każdy Event jest w podziale na następujące komponenty

  • WHO kogo jest zdarzenie związane. Zespół, odtwarzacz, refree, widzów itp
  • WHAT co jest zdarzeniem (bramka, pass, zapisać, etc)
  • WHEN szczegóły czasie zdarzenia
  • HOWMUCH jak jest wartość zdarzeń określonych
  • TYPE określa, kiedy należy sprawdzić - INDIVIDUAL: w czasie rzeczywistym, AGGREGATE: koniec WHEN

Oto niektóre exampl es piłkarskie

1. No goals scored in 2nd Half 
TEAM: *, WHAT: __GOAL, WHEN: __HALF_2, HOWMUCH: 0, TYPE: AGGREGATE 
{ 
    "who" : {"team":*},  
    "what" : "__GOAL", 
    "when" : "__HALF_2" 
    "howMuch" : {"value":0, "type" :"exact"}, 
    "type" : "AGGREGATE" 
} 


2. Either keeper to complete 3 or more punches 
PLAYER: (p1 v p2), WHAT: __PUNCH, WHEN: __MATCH, HOWMUCH: 3+, TYPE: INDIVIDUAL 
{ 
    "who" : {"player":{"or":["p1","p2"]}}, 
    "what" : "__PUNCH", 
    "when" : "__MATCH" 
    "howMuch" : {"value":2, "type":"more"}, 
    "type" : "AGGREGATE" 
} 

3. Coutinho to score a goal before 65th min 
PLAYER: p3, WHAT: __GOAL, WHEN: <65, TYPE: INDIVIDUAL 
{ 
    "who" : {"player":"p3"},  
    "what" : "__GOAL", 
    "when" : {"value" : 65, "type" : "before"} 
    "type" : "INDIVIDUAL" 
} 


4. Henderson to play highest number of passes 
PLAYER : p4, WHAT: __PASS, WHEN: __MATCH, HOWMUCH: __MAX, TYPE: AGGREGATE 
{ 
    "who" : {"player":"p4"},  
    "what" : "__PASS", 
    "when" : "__MATCH", 
    "howMuch": "__MAX" // this is a key word which will be handled accordingly on the application 
    "type" : "AGGREGATE" 
} 

5. Liverpool to have more possession than everton 
TEAM: (t1 > t2), WHAT: __POSSESSION, WHEN: __MATCH, TYPE: AGGREGATE  
{ 
    "who" : {"team":{"compare":["t1","t2"],"winner":"t2"}},  
    "what" : "__POSSESSION", 
    "when" : "__MATCH" 
    "type" : "AGGREGATE" 
} 

Wszystkie zdarzenia AGGREGATE będą sprawdzane, gdy stan zmienia wynik. na przykład II połowa ---> MATCH_END

Wszystkie zdarzenia będą sprawdzane w czasie rzeczywistym (od razu po otrzymaniu nowego wydarzenia). Działa to na hak internetowy.

E.g. Cel zostaje zdobyty w 58 minucie. zdarzenia odbierane przez układ - {"type":"goal","player":"_henderson_", "minute":58}

System będzie teraz uruchomić „znaleźć” gdzie ("type" == "INDIVIDUAL" && "what" == "__GOAL") i porównać wszystkie zdarzenia znalezione.

Później chciałbym udostępnić funkcje administracyjne do pisania zdań, które można analizować w tej strukturze. Chciałbym wiedzieć, czy pracuję we właściwym kierunku, czy też muszę zacząć myśleć inaczej.

+0

Czy istnieje powód, dla którego wysyłasz zbiorcze wydarzenia w czasie rzeczywistym? Czy nie byłoby bardziej wydajne wysyłanie pojedynczych zdarzeń i wykonywanie agregacji na serwerze? – RohanC

+0

@RohanC - zdarzenia są dostarczane przez zewnętrzny interfejs API. To strumień wydarzeń rozgrywających się w meczu. –

+2

1. Nie używaj tego samego słowa dla różnych pojęć "zdarzenia" w sensie zarejestrowanej rzeczy interesującej w porównaniu z "zdarzeniem" w znaczeniu surowego wprowadzania w czasie rzeczywistym. 2. Najpierw dokonaj bezpośredniego dopasowania projektu, następnie rozszerz/zmodyfikuj ponownie surowe zdarzenia, następnie zarejestrowane zdarzenia, a następnie ponownie zoptymalizuj ocenę tylko niektórych zarejestrowanych zdarzeń na podstawie surowych zdarzeń. 3. "Typ" jest określany na podstawie części (części) aktualnego stanu zarejestrowanego zdarzenia (i kwerendy dla niego) jest funkcją. Oczekuj automatyzacji tego określania na podstawie zapytania, które faktycznie piszesz/generujesz. – philipxy

Odpowiedz

1

Twoje opcje są prawdopodobnie pomiędzy Spark i przepływem danych. Oto ładny white paper comparing the two, który faktycznie wykorzystuje podobny przypadek użycia do twojego (ocenianie użytkowników gier mobilnych na dużą skalę w czasie rzeczywistym). Powodzenia, wydaje się fajnym projektem (wygląda jak internetowa implementacja bukmacherska?).