我正在创建一个网络应用程序,我希望包含一个功能,用于记录用户与网站交互的所有日子,就像Stackoverflow一样:
哪种数据结构适合这种情况?
我曾经想过将一个用户ID作为列的表,所有的日子都作为行,但这只是最直观的答案,会占用大量空间。
我没有必须运行的特殊查询。只显示日历中的日期(如图所示)并计算总天数和连续天数(如图中所示)
关于什么是最佳方式的任何建议? Stackoverflow是如何做到的?
答案 0 :(得分:0)
您无法绕过需要存储每个用户访问的每一天,否则您显然无法回忆这些信息。如果您要将其简化为只存储天数,则可以使用每个用户只有两个值 - 上次访问日期和访问天数来完成。
我不会创建用户ID的列,因为向表中添加列是一项昂贵的操作(可能需要重新创建整个表)。更好的想法是在每行中存储用户ID,日期对。
Table Visited
? - Column ID (Primary key)
Column UserID
Column Day
如果索引正确,我希望你做的大多数操作应该是快速的。
我的猜测就是这就是Stack Overflow / Stack Exchange的做法。
请注意,与Stack Overflow存储的数据相比,这实际上是一个可以忽略不计的数据量 - 如果您每天只是发布评论,那么您已经远远超过了存储您在线所需的数据量一天。
另一种方法是为每个用户提供一个天数位图。我相信Stack Overflow已经存在了5年多,那是〜2000天,所以~2000位,~250字节。一旦你认为你应该至少在接下来的五年内加倍(并且你需要满足这个位图中用完空间的那一天),那么查询它并不是特别好和/或效率最高接口,以及许多用户可能没有多次访问该网站,与上面建议的访问表相比,这看起来不是一个好的选择。