Ich versuche herauszufinden, wie das Schema für dieses ereignisbasierte Analysesystem, das ich schreibe, am besten modelliert werden kann. Mein Hauptanliegen ist es, dies auf eine Weise zu schreiben, die Abfragen einfach und schnell macht. Ich werde auch MySQL verwenden. Ich werde einige der Anforderungen besprechen und einen Überblick über ein mögliches (aber ich finde armes) Schema geben.Entwerfen des Datenbankschemas für ereignisbasierte Analysen
Anforderungen
Track-Ereignisse (zB Spur Vorkommen des "APP_LAUNCH" event)
benutzerdefinierte Ereignisse definieren
Fähigkeit zu segmentieren Ereignisse auf> 1 benutzerdefinierte Eigenschaften (zB get Vorkommen von "APP_LAUNCH", segmentiert in der Eigenschaft "APP_VERSION")
Track-Sitzungen
Abfragen durchführt, basierend auf Zeitstempel Bereich
Mögliche Modellierung
Das Hauptproblem, das ich habe, ist, wie die Segmentierung zu modellieren und die Abfragen, die Gesamtzahl eines Ereignisses zu erhalten auszuführen .
Meine ursprüngliche Idee war es, eine EVENTS-Tabelle mit einer ID, einem int count, einem timestamp, einer Eigenschaft (?) Und einem Fremdschlüssel für einen EVENTTYPE zu definieren. Ein EVENTTYPE hat eine ID, einen Namen und zusätzliche Informationen, die zu einem generischen Ereignistyp gehören. Das Ereignis "APP_LAUNCH" würde beispielsweise einen Eintrag in der Tabelle EVENTS mit einer eindeutigen ID haben, wobei count die Anzahl der aufgetretenen Ereignisse, den Zeitstempel (nicht sicher darüber, woran dies eingeprägt ist) und eine Eigenschaft oder angibt Liste von Eigenschaften (zB "APP_VERSION", "COUNTRY", etc.) und ein Fremdschlüssel zu einem EVENTTYPE mit dem Namen "APP_LAUNCH".
Kommentare und Fragen
Ich bin mir ziemlich sicher, dass dies dies aus den folgenden Gründen zu modellieren kein guter Weg ist. Es macht es schwierig, Zeitstempel-Fernabfragen durchzuführen ("Anzahl von APP_LAUNCHES zwischen Zeit x und y"). Die Tabelle EVENTTYPE erfüllt keinen Zweck. Schließlich bin ich unsicher, wie ich selbst Abfragen für verschiedene Segmentierungen durchführen würde. Der letzte ist derjenige, um den ich mich am meisten Sorgen mache.
Ich würde jede Hilfe bei helfen, dieses Modell korrekt zu modellieren oder mich auf Ressourcen verweisen, die helfen würden.
Eine letzte Frage (die wahrscheinlich dumm ist): Ist es schlecht, eine Zeile für jedes Ereignis einzufügen? Zum Beispiel, sagen meine Client-seitige Bibliothek den folgenden Aufruf an meine API macht:
track("APP_LAUNCH", {count: 4, segmentation: {"APP_VERSION": 1.0}})
Wie kann ich das tatsächlich speichere in der Tabelle (dies ist eng mit dem Schema-Design im Zusammenhang natürlich)? Ist es schlecht, einfach eine Zeile für jeden dieser Anrufe einzufügen, von denen es möglicherweise eine erhebliche Menge gibt? Meine Bauchreaktion ist, dass ich mich hauptsächlich für die aggregierten Gesamtzahlen interessiere. Ich habe nicht genug Erfahrung mit SQL, um zu wissen, wie diese Abfragen möglicherweise Hunderttausende dieser Einträge ausführen. Würde eine aggregierte Tabelle oder ein In-Memory-Cache dazu beitragen, Probleme zu beheben, wenn der Client die Analysen tatsächlich erhalten soll?
Ich weiß, es gibt viele Fragen hier, aber ich würde wirklich jede Hilfe zu schätzen wissen. Vielen Dank!
Dies ist eine fantastische Antwort, aber ich habe eine Frage. Ich bin ein wenig unklar in Bezug auf Ihren Punkt in # 3. Wenn die EVENTTYPE_ID (Name des Ereignisses) bereits in der EVENTS-Tabelle vorhanden ist, wie entsteht Konsistenz durch einen Fremdschlüssel zu einer EVENTTYPE-Tabelle? – CCSab
@CCSab, da Sie mithilfe des Fremdschlüssels die Konsistenzprüfung der internen Datenbank erzwingen können - dass nur diejenigen EVENTTYPE_IDs eingegeben werden können, die sich in der Tabelle EVENTTYPE befinden! Siehe [Fremdschlüsseleinschränkungen im Handbuch] (http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html) – TMS
Oh, das macht eine Menge Sinn! Danke für die fantastische Antwort! Ich habe es akzeptiert und die Prämie ausgezeichnet :) – CCSab