如何有效地存储用户历史的总访问量统计?
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" 低几个数量级。
我正在维护一个系统,用户可以在其中创建名为 "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" 低几个数量级。