【发布时间】:2013-08-04 01:12:45
【问题描述】:
我正在寻找一种有效的方法来存储在事件期间一起发生的对象集,这样我就可以每天对它们生成汇总统计信息。
举个例子,让我们想象一个跟踪办公室会议的系统。对于每次会议,我们都会记录它持续了多少分钟以及在哪个房间举行。
我想按人和房间细分统计数据。我不需要跟踪单独的会议(所以没有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 在每个会议室中的 MEETING TOGETHER 花了多少分钟? 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
我还能做什么?
【问题讨论】:
-
所以,澄清一下,你有一个 bajillion “会议” 正在发生,所以你每天汇总它们。这意味着您在房间交叉口人交叉日花费了几分钟(我们称之为 R U P U D)。您希望 R U (P1 交点 P2 交点 P3) U D 以一种不必存储每个会议的方式...
-
没错!如果我们存储了 meeting_ids,我们可以只获取 UNIQUE meeting_ids,然后查找每个信息的信息,但这将是 MySQL 汇总的大量记录。
-
这些查询集是固定的还是可以改变的?我的意思是,当 Julia 和 Bob 不在这个会议室时,它会不会像 find 一样。我认为会议 ID 在这里并不重要,因为我们可以结合使用时间和董事会会议室来获得独特的会议。
-
您需要提供更多信息:您预计有多少个会议室,有多少人?您以什么粒度进行查询?只是按天汇总? “共度时光”已经包含了会议的含义,因此无论如何您都在隐式存储此信息。
标签: database database-design data-structures analytics