Ich bin auf der Suche nach einer effizienten Möglichkeit, Gruppen von Objekten, die während Ereignissen zusammen aufgetreten sind, so zu speichern, dass ich aggregierte Statistiken auf ihnen Tag für Tag generieren kann.Wie werden Gruppen von Objekten gespeichert, die während Ereignissen zusammen aufgetreten sind?
Um ein Beispiel zu geben, stellen wir uns ein System vor, das Besprechungen in einem Büro verfolgt. Für jedes Meeting notieren wir, wie viele Minuten es dauerte und in welchem Raum es stattfand.
Ich möchte Statistiken sowohl von Person als auch von Zimmer aufgeteilt bekommen. Ich muss die einzelnen Meetings nicht im Auge behalten (also keine meeting_id
oder etwas ähnliches), alles was ich wissen möchte, sind täglich zusammengefasste Informationen. In meiner realen Anwendung gibt es Hunderttausende von Ereignissen pro Tag, so dass es nicht möglich ist, jeden einzeln zu speichern.
Ich möchte in der Lage sein, Fragen zu beantworten wie: (zusammen nicht notwendigerweise)
Im Jahr 2012, wie viele Minuten haben Bob, Sam und Julie verbringen in jedem Konferenzraum?
Wahrscheinlich fein dies mit 3-Abfragen zu tun:
>>> 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}
Im Jahr 2012, wie viele Minuten haben Sam und Julie zusammen verbringen in jedem Konferenzraum Konferenz? Was ist mit Bob, Sam und Julie?
>>> query(dates=2012, people=[Sam, Julie])
{Board-Room: 128, Broom-Closet: 55}
>>> query(dates=2012, people=[Bob, Sam, Julie])
{Board-Room: 22}
Im Jahr 2012, wie viele Minuten pro Person im Vorstand Zimmer verbracht hat?
>>> query(dates=2012, rooms=[Board-Room])
{Bob: 35, Sam: 790, Julie: 190}
Im Jahr 2012, wie viele Minuten war der Board-Raum im Einsatz?
Das ist eigentlich ziemlich schwierig, da die naive Strategie, die Anzahl der Minuten zu addieren, die jede Person ausgegeben hat, zu einem ernsthaften Überzählen führt. Aber wir können wahrscheinlich dieses Problem lösen, indem die Anzahl separat als Meta-Person Jeder Speicherung:
>>> query(dates=2012, rooms=[Board-Room], people=[Anyone])
865
Was einige gute Datenstrukturen oder Datenbanken, die ich verwenden kann, um diese Art von Abfragen zu ermöglichen? Da der Rest meiner Anwendung verwendet MySQL, bin ich versucht, eine String-Spalte zu definieren, die die (sortiert) ids jeder Person in der Sitzung, aber die Größe dieser Tabelle wird wachsen ziemlich schnell hält:
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
Was kann ich sonst noch tun?
Also, um zu klären, haben Sie eine Bajillion "Meetings" passiert, so dass Sie sie am Tag aggregieren. Das bedeutet, Sie haben Minuten für den Schnittpunkt der Kreuzungsstelle am Ort (nennen wir das R U P U D). Sie wollen R U (P1 Kreuzung P2 Kreuzung P3) U D in einer Weise, in der Sie nicht jede Sitzung speichern müssen ... – Temuz
Ja genau! Wenn wir meeting_ids speichern würden, könnten wir einfach UNIQUE meeting_ids holen und dann nach Informationen für jeden einzelnen suchen, aber das wäre eine Menge Datensätze, die MySQL zusammenfassen könnte. –
Sind diese Sätze der Abfrage behoben oder kann es sich ändern? Ich meine, kann es so sein wie all die Zeiten zu finden, als Julia und Bob nicht in diesem Borad-Raum waren. Ich denke, Meeting ID ist hier nicht so wichtig, da wir ein einzigartiges Meeting mit der Kombination von Zeit und BoardRoom erhalten können. – AKS