首页 > 解决方案 > 如何有效地存储用户历史的总访问统计信息?

问题描述

我正在维护一个系统,用户可以在其中创建其他用户可以访问的称为“书籍”的东西。

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

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

在此处输入图像描述

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

在此处输入图像描述

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

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

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

谢谢你。

OBS:我使用的是 PostgreSQL 9.X,系统是用 Java 编写的。

标签: databasepostgresqlperformancedatabase-designentity-relationship

解决方案


正如评论中提到的,您可能高估了数据大小。让我们算一下。10 万用户,每天 30 本书,每条记录 30 字节。

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

即使您添加索引大小和一些开销,这仍然比“每天许多 GB”低几个数量级。


推荐阅读