我存储的数据记录了用户在给定的一天中是否记录了他们的出勤情况。某些日子不重要(假日,周末),因此也将其存储起来。
两个要求是:
现在,我似乎面临着两种存储数据的方法,每种方法都有其各自的优点/缺点:
选项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,尽管缩放已成为一个很大的挑战。预先感谢您的任何建议。
答案 0 :(得分:0)
两表解决方案对我来说更好。错过了多少天虽然并不明显,但计算起来很容易。
比方说,您想弄清楚用户X在start-date
和end-date
之间错过了几天。
start-date
和end-date
之间所有特殊日子的列表。start-date
和end-date
之间登录的所有天数的列表。执行以下操作:
从开始日期到结束日期的每一天 如果一天是特殊的日子,请继续第二天 如果日期在用户登录的日期,请继续第二天 用户当天未登录
您可以通过为特殊日子和用户登录的日子创建集合或通过按日期对列表进行排序并运行简单的三向合并算法来做到这一点。
我不是SQL专家,但是如果您无法通过单个SQL查询做到这一点,我会感到惊讶。