database - 如何为每日事件日志构建数据库?
问题描述
我正在存储记录用户是否记录了他们在给定日期的出勤情况的数据。有些日子并不重要(节假日、周末),因此也将这些日子存储起来。
这两个要求是:
- 可以快速计算日志和丢失日志的数量,并且
- 每当添加新用户时,该结构都是可扩展的。
现在,我似乎面临着如何存储数据的两个选项,每个选项都有自己的优点/缺点:
选项 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,尽管扩展已成为一个相当大的挑战。提前感谢您的任何建议。
解决方案
这两个表解决方案对我来说看起来更好。虽然错过了多少天并不明显,但计算起来很容易。
假设您想知道用户 X 在start-date
和之间错过了哪些天end-date
。
start-date
获取和之间的所有特殊日子的列表end-date
。- 获取用户在
start-date
和之间登录的所有天数的列表end-date
。 请执行下列操作:
从开始日期到结束日期的每一天 如果日期在特殊日期,则继续到下一天 如果日期在日期中 用户登录,继续到下一天 用户在这一天没有登录
您可以通过为特殊日子和用户登录的日子创建集合,或者通过按日期排序列表并运行简单的 3 路合并算法来做到这一点。
我不是 SQL 专家,但如果你不能用单个 SQL 查询做到这一点,我会感到惊讶。
推荐阅读
- python-3.x - 如何使用 Python 生成唯一值列表以用作 MySql 数据库的主键?
- api - Wealthfront 与外部账户连接背后的技术
- python - 在 Python 中,我可以从另一个对象创建或继承一个对象,而不会丢失或覆盖旧对象中先前存在的属性吗?
- postgresql - 如何在 Postgress PGadmin 4 编辑器中设置变量?
- python - 如何在 unittest 和 pytest 中访问这些模拟
- sql - Snowflake 根据不同列值的组合返回记录一次
- c# - 正则表达式 - 获取冒号后的数字
- c# - 我的第二个表单没有显示,但是里面的代码被执行了
- ios - 从此特定 main.dart 中删除调试横幅
- javascript - GQL 解析器:返回 null