Szukam wydajnego sposobu przechowywania zestawów obiektów, które wystąpiły razem podczas wydarzeń, w taki sposób, że mogę generować na nich zbiorcze statystyki codziennie.Jak przechowywać zestawy obiektów, które wystąpiły razem podczas zdarzeń?
Aby wymyślić przykład, wyobraźmy sobie system, który śledzi spotkania w biurze. Na każde spotkanie rejestrujemy ile minut trwało i w którym pokoju miało miejsce.
Chcę otrzymywać statystyki w podziale zarówno na osobę, jak i pokój. Nie muszę śledzić pojedynczych spotkań (więc nie ma żadnych informacji), wszystko, co chcę wiedzieć, to codzienne informacje zbiorcze. W mojej prawdziwej aplikacji są setki tysięcy zdarzeń dziennie, więc przechowywanie każdego z nich indywidualnie nie jest wykonalne.
Chciałbym być w stanie odpowiedzieć na takie pytania jak:
W 2012 roku, ile minut czy Bob, Sam i Julie wydać w każdej sali konferencyjnej (niekoniecznie razem)?
Prawdopodobnie w porządku to zrobić z 3 zapytania:
>>> query(dates=2012, people=[Bob])
{Board-Room: 35, Auditorium: 279}
>>> query(dates=2012, people=[Sam])
{Board-Room: 790, Auditorium: 277, Broom-Closet: 71}
>>> query(dates=2012, people=[Julie])
{Board-Room: 190, Broom-Closet: 55}
w 2012 roku, ile minut udało Sam i Julie spędzają zgromadzenia, wraz z każdej sali konferencyjnej? A co z Bobem, Samem i Julie razem?
>>> query(dates=2012, people=[Sam, Julie])
{Board-Room: 128, Broom-Closet: 55}
>>> query(dates=2012, people=[Bob, Sam, Julie])
{Board-Room: 22}
W 2012 roku, ile minut nie każda osoba spędzić w Zarządzie-pokojowe?
>>> query(dates=2012, rooms=[Board-Room])
{Bob: 35, Sam: 790, Julie: 190}
W 2012 roku, ile minut był Board-Room w użyciu?
Jest to dość trudne, ponieważ naiwna strategia podsumowania liczby minut, które wydała każda osoba, spowoduje poważne zliczanie. Ale prawdopodobnie możemy rozwiązać ten problem przez przechowywania liczbę osobno jako meta-osobowej Anyone:
>>> query(dates=2012, rooms=[Board-Room], people=[Anyone])
865
Jakie są dobre struktury danych lub bazy danych, które można użyć w celu umożliwienia tego rodzaju zapytań? Ponieważ reszta mojej aplikacji wykorzystuje MySQL, jestem kuszony, aby zdefiniować kolumnę, która posiada ciąg (-i) identyfikatory każdej osoby w spotkaniu, ale rozmiar tej tablicy będzie rosnąć bardzo szybko:
2012-01-01 | "Bob" | "Board-Room" | 2
2012-01-01 | "Julie" | "Board-Room" | 4
2012-01-01 | "Sam" | "Board-Room" | 6
2012-01-01 | "Bob,Julie" | "Board-Room" | 2
2012-01-01 | "Bob,Sam" | "Board-Room" | 2
2012-01-01 | "Julie,Sam" | "Board-Room" | 3
2012-01-01 | "Bob,Julie,Sam" | "Board-Room" | 2
2012-01-01 | "Anyone" | "Board-Room" | 7
Co jeszcze mogę zrobić?
Aby wyjaśnić, odbywają się "spotkania" w bajillionach, więc sumujesz je w ciągu dnia. Oznacza to, że masz minuty spędzone na skrzyżowaniu osób w punkcie przecięcia pokoju (nazwijmy to R U P U D). Chcesz R U (P1 przecięcie P2 przecięcia P3) U D w sposób, w którym nie musisz przechowywać każdego spotkania ... – Temuz
Tak, dokładnie! Gdybyśmy zapisali wartości meeting_ids moglibyśmy po prostu pobrać UNIQUE meeting_ids, a następnie wyszukać informacje dla każdego z nich, ale byłoby to mnóstwo rekordów dla agregacji MySQL. –
Czy te zestawy zapytań są poprawione, czy może się zmienić? Chodzi mi o to, że można tak znaleźć wszystkie czasy, kiedy Julia i Bob nie byli w tym spotkaniu w pokoju Borada. Sądzę, że Identyfikacja Spotkań nie ma aż tak dużego znaczenia, ponieważ możemy uzyskać unikalne spotkanie z wykorzystaniem kombinacji czasu i Pokoju. – AKS