首页 > 解决方案 > 如何为每日事件日志构建数据库?

问题描述

我正在存储记录用户是否记录了他们在给定日期的出勤情况的数据。有些日子并不重要(节假日、周末),因此也将这些日子存储起来。

这两个要求是:

  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

优点:

挑战:

我的问题是:有没有办法使用选项 1 并以某种方式对丢失日志的数量进行编码,或者是否有其他方式来存储满足这两个要求的数据?我尝试过使用选项 2,尽管扩展已成为一个相当大的挑战。提前感谢您的任何建议。

标签: databasedata-structures

解决方案


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

假设您想知道用户 X 在start-date和之间错过了哪些天end-date

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

    从开始日期到结束日期的每一天 如果日期在特殊日期,则继续到下一天 如果日期在日期中 用户登录,继续到下一天 用户在这一天没有登录

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

我不是 SQL 专家,但如果你不能用单个 SQL 查询做到这一点,我会感到惊讶。


推荐阅读