Sto cercando un modo efficiente di memorizzare insiemi di oggetti che si sono verificati insieme durante gli eventi, in modo tale da poter generare statistiche aggregate su di essi giorno per giorno.Come memorizzare set di oggetti che si sono verificati insieme durante gli eventi?
Per fare un esempio, immaginiamo un sistema che tenga traccia delle riunioni in un ufficio. Per ogni riunione registriamo per quanti minuti è stato e in quale stanza si è svolto.
Voglio ottenere statistiche suddivise sia per persona che per stanza. Non ho bisogno di tenere traccia delle singole riunioni (quindi no meeting_id
o qualcosa di simile), tutto quello che voglio sapere sono le informazioni aggregate giornaliere. Nella mia applicazione reale ci sono centinaia di migliaia di eventi al giorno, quindi non è possibile memorizzarli singolarmente.
mi piacerebbe essere in grado di rispondere a domande come:
Nel 2012, quanti minuti hanno Bob, Sam, e Julie trascorrono in ogni sala conferenze (non necessariamente insieme)?
probabilmente bene a che fare questo con 3 domande:
>>> 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}
Nel 2012, quanti minuti hanno Sam e Julie trascorrono incontrarsi in ogni sala conferenze? Che mi dici di Bob, Sam e Julie tutti insieme?
>>> query(dates=2012, people=[Sam, Julie])
{Board-Room: 128, Broom-Closet: 55}
>>> query(dates=2012, people=[Bob, Sam, Julie])
{Board-Room: 22}
Nel 2012, quanti minuti ha fatto ogni persona spende nel Board-Room?
>>> query(dates=2012, rooms=[Board-Room])
{Bob: 35, Sam: 790, Julie: 190}
Nel 2012, quanti minuti è stato il Board-camera in uso?
Questo è in realtà piuttosto difficile poiché la strategia ingenua di sommare il numero di minuti che ogni persona impiega si tradurrà in un eccessivo conteggio. Ma probabilmente possiamo risolvere questo problema memorizzando il numero separatamente come meta-persona Chiunque:
>>> query(dates=2012, rooms=[Board-Room], people=[Anyone])
865
Quali sono alcune buone strutture di dati o banche dati che posso utilizzare per abilitare questo tipo di interrogazione? Dal momento che il resto della mia applicazione utilizza MySQL, sono tentato di definire una colonna stringa che contiene i (ordinate) ID di ogni persona nel corso della riunione, ma la dimensione di questo tavolo crescerà abbastanza rapidamente:
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
Cos'altro posso fare?
Quindi, per chiarire, avete un "incontro" di bajillion in corso, quindi li aggregate di giorno. Ciò significa che hai passato dei minuti per il giorno di intersezione delle persone in intersezione delle sale (chiamiamolo R U P U D). Vuoi R U (intersezione P1 intersezione P2 P3) U D in un modo in cui non devi memorizzare ogni riunione ... – Temuz
Sì esattamente! Se memorizzassimo meeting_ids, potremmo semplicemente prendere gli UNIQUE meeting_ids e quindi cercare informazioni per ognuno, ma sarebbe una tonnellata di record per MySQL da aggregare. –
Questi set di query sono stati risolti o possono essere modificati? Voglio dire, può essere come trovare tutte le volte in cui Julia e Bob non erano in questa stanza di incontro con Borad. Penso che Meeting Id non sia così importante qui, poiché possiamo ottenere incontri unici usando la combinazione di tempo e BoardRoom. – AKS