我正在寻找一种有效的方法来存储在事件期间一起发生的对象集,这样我就可以每天对它们生成聚合统计信息。
举个例子,让我们想象一个跟踪办公室会议的系统。对于每次会议,我们都会记录它持续了多少分钟以及在哪个房间举行。
我想按人和房间细分统计数据。我不需要跟踪单独的会议(所以没有meeting_id
或类似的东西),我只想知道每日汇总信息。在我的实际应用程序中,每天有数十万个事件,因此单独存储每个事件是不可行的。
我希望能够回答以下问题:
2012 年,Bob、Sam 和 Julie 在每个会议室(不一定在一起)花了多少分钟?
使用 3 个查询可能很好:
>>> 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}
2012 年,Sam 和 Julie 在每个会议室中的会议时间是多少?Bob、Sam 和 Julie 在一起怎么样?
>>> query(dates=2012, people=[Sam, Julie])
{Board-Room: 128, Broom-Closet: 55}
>>> query(dates=2012, people=[Bob, Sam, Julie])
{Board-Room: 22}
2012 年,每个人在董事会会议室花费了多少分钟?
>>> query(dates=2012, rooms=[Board-Room])
{Bob: 35, Sam: 790, Julie: 190}
2012 年,董事会会议室使用了多少分钟?
这实际上非常困难,因为总结每个人花费的分钟数的幼稚策略会导致严重的过度计算。但是我们可以通过将数字单独存储为元人任何人来解决这个问题:
>>> query(dates=2012, rooms=[Board-Room], people=[Anyone])
865
我可以使用哪些好的数据结构或数据库来启用这种查询?由于我的应用程序的其余部分使用 MySQL,我很想定义一个字符串列来保存会议中每个人的(排序的)id,但是这个表的大小会很快增长:
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
我还可以做些什么?