如何构建日常事件日志的数据库?

时间:2019-01-12 02:16:11

标签: database data-structures

我存储的数据记录了用户在给定的一天中是否记录了他们的出勤情况。某些日子不重要(假日,周末),因此也将其存储起来。

两个要求是:

  1. 计算日志和丢失日志的数量可以快速完成,并且
  2. 无论何时添加新用户,该结构都是可调用的。

现在,我似乎面临着两种存储数据的方法,每种方法都有其各自的优点/缺点:

选项1:两个表

calendar-跟踪不计算的天数

date       | log |
-----------+-----|
2019-01-10 | DNL | // "Do Not Log" - holiday etc.
2019-01-12 | NB  | // "Non-business day"
2019-01-13 | NB  |

logs-跟踪成功的出勤记录

user_id | date       |
--------+------------|
      1 | 2019-01-08 |
      1 | 2019-01-09 |
      2 | 2019-01-09 |

// It's implied that user #2 missed their log on Jan. 8

优势:

  • 数据得到有效存储。
  • 统计用户日志和不计算日期很简单。

挑战:

  • 不知道错过了多少天。

选项2:一张桌子(我尝试过的事情)

calendar-跟踪要计数和不计数的日志和天数

date       | user_id | log  |
2018-01-09 |       1 |    1 | // Counted, logged
2019-01-10 |       1 |  DNL | // Not counted
2019-01-11 |       1 |   NB | // Not counted
2019-01-09 |       2 | NULL | // Counted, missed log

优势:

  • 错过的天数与记录的天数的总和是微不足道的(用于计算总百分比)。日历中的天数是明确的。

挑战:

  • 在以下情况下,向日历添加新条目很棘手:
    • 日历的长度增加。
    • 添加了新用户。
  • 表中有空格(log == NULL处),使遍历比选项1慢。

我的问题是:是否可以使用选项1并以某种方式对丢失的日志数量进行编码,或者是否可以通过其他方式存储满足这两个要求的数据?我尝试使用选项2,尽管缩放已成为一个很大的挑战。预先感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

两表解决方案对我来说更好。错过了多少天虽然并不明显,但计算起来很容易。

比方说,您想弄清楚用户X在start-dateend-date之间错过了几天。

  1. 获取start-dateend-date之间所有特殊日子的列表。
  2. 获取用户在start-dateend-date之间登录的所有天数的列表。
  3. 执行以下操作:

    从开始日期到结束日期的每一天     如果一天是特殊的日子,请继续第二天     如果日期在用户登录的日期,请继续第二天     用户当天未登录

您可以通过为特殊日子和用户登录的日子创建集合或通过按日期对列表进行排序并运行简单的三向合并算法来做到这一点。

我不是SQL专家,但是如果您无法通过单个SQL查询做到这一点,我会感到惊讶。