我正在寻找一种有效的方式来存储事件期间一起发生的对象集合,以这种方式我可以每天在其上生成聚合统计信息。如何存储事件期间一起发生的对象集?
举个例子,让我们想象一个跟踪办公室会议的系统。对于每次会议,我们都记录了多长时间以及它发生在哪个房间。
我希望统计人员和房间的统计数据。我不需要跟踪个人会议(所以没有meeting_id
或类似的东西),我只想知道每日聚合信息。在我的真实应用程序中,每天有成千上万的事件,因此单独存储每个事件是不可行的。
我希望能够回答这样的问题:
在2012年,多少分钟没有鲍勃,山姆和朱莉花费在每个会议室(不一定在一起)?
也许还不错,要做到这一点有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年,没有萨姆和朱莉多少分钟花费在每个会议室TOGETHER会议?鲍勃,萨姆和朱莉一起怎么样?
>>> 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
我还可以做些什么?
因此,为了澄清,你有一个bajillion“会议”发生,所以你在一天之内汇总它们。这意味着你有十分钟的时间用于房间交叉路口人行天(我们称之为R U P U D)。您需要R U(P1路口P2路口P3)U D,您不必存储每次会议的方式...... – Temuz
是的!如果我们存储了meeting_ids,我们可以抓住UNIQUE meeting_ids,然后查找每个会议的信息,但这将是MySQL聚合的大量记录。 –
这些查询集是固定的还是可以更改的?我的意思是,当Julia和Bob不在这个会议的Borad会议室时,可以找到所有的时间。我认为会议ID在这里并不重要,因为我们可以通过组合时间和BoardRoom获得独特的会议。 – AKS