如何有效地存储用户历史的总访问量统计?

How to store total visits statistics for user history efficiently?

我正在维护一个系统,用户可以在其中创建名为 "books" 的内容,其他用户可以访问这些内容。

我需要一种方便的(良好的性能)方法来将事件存储在数据库中,用户访问这些书籍以便稍后显示带有统计信息的图表。这些图表需要展示历史记录,书的所有者可以在其中看到一周中的哪几天,以及什么时候有更多的访问activity(整个月)。

使用 ERD(实体关系图),我可以生成以下 概念模型

起初问题似乎解决了,因为我们这里的情况很简单。这将给我一个包含 3 个字段的 table。一个是访问事件的发生,另外两个是外键。一个代表用户,而另一个代表访问了哪本书。简而言之,table中的每条记录都是一次访问:

但是,考虑到一个用户平均每天可以访问大约 10 到 30 本书,并且拥有一个拥有 100.000 个用户的系统,这个 table 可以在一天内添加许多 GB 的新记录。在良好的数据库性能实践方面,我不是最有经验的人,但我很确定这不是解决方案。

即使我对数据库进行清理以删除旧记录,我也需要保留最近 2 个月的访问记录历史记录(至少)。

几天来我一直在寻找解决这个问题的方法,但我还没有找到任何东西。有人可以帮帮我吗?

谢谢。

OBS:我用的是PostgreSQL9.X,系统写在Java.

如评论中所述,您可能高估了数据大小。让我们来计算一下。 30 books/day 的 100k 用户,例如每条记录 30 字节。

(100_000 * 30 * 30) / 1_000_000 # => 90 megabytes per day

即使添加索引大小和一些开销,这仍然比 "many gigabytes per day" 低几个数量级。