【问题标题】:How to structure database for daily event log?如何为每日事件日志构建数据库?
【发布时间】:2019-01-12 02:16:11
【问题描述】:

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

两个要求是:

  1. 可以快速计算日志和丢失日志的数量,并且
  2. 每当添加新用户时,该结构都是可扩展的。

现在,我似乎面临着两种数据存储方式的选择,每一种都有自己的优点/缺点:

选项 1:两个表

Table calendar - 不计算的跟踪天数

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

Table 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:一张桌子(我尝试过的)

Table 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,尽管扩展已成为一个相当大的挑战。提前感谢您的任何建议。

【问题讨论】:

  • “有些日子是不重要的(节假日、周末),所以也会存储这些日子”。你的意思是“重要”吗?他们在哪里“记录他们的出勤率”?在另一个数据库中?您应该能够对此进行查询。

标签: database data-structures


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多