如何存储在事件期间一起发生的对象集?

Rob*_*ell 6 database analytics database-design data-structures

我正在寻找一种有效的方法来存储在事件期间一起发生的对象集合,这样我就可以每天在它们上生成聚合统计数据.

举一个例子,让我们想象一个跟踪办公室会议的系统.对于每次会议,我们会记录它的长度以及它在哪个房间.

我希望按人和房间分析统计数据.我不需要跟踪个别会议(所以没有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}
Run Code Online (Sandbox Code Playgroud)

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}
Run Code Online (Sandbox Code Playgroud)

2012年,每个人在董事会会议室花了多少分钟?

>>> query(dates=2012, rooms=[Board-Room])
{Bob: 35, Sam: 790, Julie: 190}
Run Code Online (Sandbox Code Playgroud)

2012年,董事会会议室使用了多少分钟?

这实际上非常困难,因为总结每个人花费的分钟数的天真策略将导致严重的过度计算.但我们可以通过将数字分别存储为元人来解决这个问题任何人:

>>> query(dates=2012, rooms=[Board-Room], people=[Anyone])
865
Run Code Online (Sandbox Code Playgroud)

我可以使用哪些好的数据结构或数据库来启用这种查询?由于我的应用程序的其余部分使用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
Run Code Online (Sandbox Code Playgroud)

我还可以做些什么?

Sha*_*awn 0

您的问题有点不清楚,因为您说您不想存储每个单独的会议,但是您如何获取当前的会议统计信息(日期)?此外,即使有大量记录,任何给定正确索引的表都可以非常快。

您应该能够使用像 log_meeting 这样的表。我想它可能包含以下内容:

employee_id, room_id, date (as timestamp), time_in_meeting
Run Code Online (Sandbox Code Playgroud)

其中员工 id 的外键到员工表,房间 id 的键到房间表

如果你索引员工 ID、房间 ID 和日期,你应该可以快速查找,因为 mysql 多列索引从左到右,这样你就可以获得索引(员工 ID、员工 ID + 房间 ID 和员工 ID + 房间 ID) + 时间戳)何时进行搜索。这在多索引部分有更多解释:

http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html