Próbuję znaleźć najlepszy sposób modelowania schematu dla tego opartego na zdarzeniach systemu analitycznego, który piszę. Moim głównym zmartwieniem jest pisanie tego w sposób, który sprawia, że zapytania są proste i szybkie. Będę również używać MySQL. Przeanalizuję niektóre wymagania i przedstawię zarys możliwego (ale moim zdaniem kiepskiego) schematu.Projektowanie schematu bazy danych do analiz opartych na zdarzeniach
Wymagania
Konkurencje biegowe (np zdarzeń ścieżki "APP_LAUNCH" Event)
Definiowanie niestandardowych zdarzeń
zdolność do wydarzeń segment na> 1 właściwości niestandardowych (np get wystąpienia "APP_LAUNCH" podzielone na segmenty "APP_VERSION")
Sesje śledzące
Wykonywanie zapytań na podstawie zakresu datownika
Możliwe Modeling
Głównym problemem, który mam jest jak model segmentacji i zapytań wykonać, aby uzyskać ogólne liczniki zdarzenia .
Mój oryginalny pomysł polegał na zdefiniowaniu tabeli WYDARZENIA z identyfikatorem, liczbą int, datownikiem, właściwością (?) I kluczem obcym na EVENTTYPE. EVENTTYPE ma identyfikator, nazwę i dodatkowe informacje należące do typowego zdarzenia.
Na przykład zdarzenie "APP_LAUNCH" będzie miało wpis w tabeli WYDARZENIA z unikalnym identyfikatorem, liczba określająca, ile razy zdarzenie miało miejsce, znacznik czasu (nie ma pewności, co to jest podstemplowane) oraz właściwość lub lista właściwości (np. "APP_VERSION", "COUNTRY" itd.) i klucz obcy na EVENTTYPE o nazwie "APP_LAUNCH".
Uwagi i pytania
Jestem całkiem pewien, że to nie jest dobry sposób, aby modelować to z następujących powodów. Utrudnia to wykonywanie zapytań z datownikiem ("Liczba APP_LAUNCHES między czasem xiy"). Tabela EVENTTYPE tak naprawdę nie służy żadnemu celowi. Na koniec nie jestem pewien, w jaki sposób mogę wykonywać kwerendy dla różnych segmentacji. Ten ostatni najbardziej mnie martwi.
Byłbym wdzięczny za pomoc w poprawnym modelowaniu tego lub wskazaniu mi zasobów, które mogłyby pomóc.
Ostatnie pytanie (które prawdopodobnie jest głupie): Czy wstawianie wiersza do każdego wydarzenia jest złe? Na przykład, powiedzmy, moja biblioteka stronie klienta sprawia następujące wezwanie do mojego API:
track("APP_LAUNCH", {count: 4, segmentation: {"APP_VERSION": 1.0}})
Jak bym to właściwie przechowywać w tabeli (to jest ściśle związane z projektowaniem schematu oczywiście)? Czy źle jest po prostu wstawić wiersz dla każdego z tych połączeń, z których może być znaczna kwota? Moją reakcją jest to, że jestem naprawdę zainteresowany głównie ogólnymi zbiorowymi danymi. Nie mam wystarczającego doświadczenia z SQL, aby wiedzieć, jak te zapytania wykonują ponad setki tysięcy takich wpisów. Czy zagregowana tabela lub pamięć podręczna w pamięci pomogłyby w złagodzeniu problemów, gdy chcę, aby klient rzeczywiście pobierał dane analityczne?
Zdaję sobie sprawę, że jest tu wiele pytań, ale byłbym wdzięczny za wszelką pomoc. Dzięki!
To jest fantastyczna odpowiedź, ale mam pytanie. Jestem trochę niejasny co do twojego punktu w # 3. Jeśli EVENTTYPE_ID (nazwa zdarzenia) już istnieje w tabeli EVENTS, w jaki sposób powstaje konsekwencja posiadania obcego klucza do tabeli EVENTTYPE? – CCSab
@CCSab, ponieważ za pomocą klucza obcego można wymusić sprawdzanie spójności wewnętrznej bazy danych - można wprowadzić tylko te EVENTTYPE_ID, które znajdują się w tabeli EVENTTYPE! Zobacz [ograniczenia klucza obcego w podręczniku] (http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html) – TMS
To sprawia, że masz dużo sensu! Dzięki za fantastyczną odpowiedź! Zaakceptowałem to i nagrodzono nagrodą :) – CCSab