如何有效地存储总访问统计信息以获取用户历史记录?

时间:2018-07-24 17:35:03

标签: database postgresql performance database-design entity-relationship

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

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

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

enter image description here

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

enter image description here

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

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

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

谢谢。

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

1 个答案:

答案 0 :(得分:1)

如评论中所述,您可能高估了数据大小。让我们做数学。每天有30本书,每天每条记录30个字节,有10万名用户。

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

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