在用户表中存储用户登录时间

时间:2011-12-31 18:56:11

标签: php mysql sql sql-server database

在用户表中,我想跟踪每个用户作为运行总计登录的时间。例如

UserID    midnightTo6am    6amToNoon    noonTo6pm    6pmToMidnight
User1     3                2            7            1
User2     4                9            1            8

请注意,这是较大表格的一部分,其中包含有关用户的更多信息,例如地址和性别,头发颜色等等。

在此示例中,存储此数据的最佳方法是什么?它应该是用户表的一部分,尽管知道不是每个用户都会每次都登录(用户可能永远不会在早上6点到中午之间登录)?或者这个表是1NF失败,因为重复列应该移动到一个单独的表?

如果存储为“用户表”的一部分,则可能存在永远不会填充数据的空单元格,因为用户从未在此时登录。

如果此数据是1NF故障并且数据要放在单独的表格中,我如何确保在特定时间内+1顺利进行?我会在单独的表中搜索用户,看看他们之前是否已登录并且+1?或者如果该列是第一次在该时间段内登录,则向该表添加一列?

欢迎任何澄清或其他解决方案!

2 个答案:

答案 0 :(得分:5)

我建议将登录事件存储在基于文件的日志中,或者只存储在登录的用户ID和DATETIME的简单表中。

每天一次,或者经常需要报告您在问题中说明的数据,将这些数据汇总到您想要的形状的表格中。通过这种方式,您不会丢弃任何原始数据,并且可以随时在不同时段,按小时等重新聚合。

此外:我怀疑导出聚合数据的最快方法是为每个聚合周期运行多个范围查询,这样您就可以在2011-12-25 00:00:00 - 2011-12-24 03:00:00范围内搜索(例如)登录日期。如果你采用这种方法,并且(datetime,user_id)的索引可以正常工作。这似乎是违反直觉的,因为你想在以用户为中心的基础上做事,但DATETIME字段上的索引可以轻松找到行,然后尾随的user_id索引可以实现快速分组。

答案 1 :(得分:1)

有几件事。首先,这不违反1NF。实际上可以接受4列。其次,如果您使用此设计,则不应使用空值,而是使用零(可能的现有记录除外)。最后,您应该使用此设计还是将其拆分为另一个表(或两个)取决于您的目的和用途。如果您对表的标准使用不使用此信息,则它应该进入另一个具有1对1关系的表。如果您可能需要增加登录时间的粒度,那么您应该使用另一个表。最后,如果您将其拆分为另一个带有时间戳的表,请考虑隐私。