Database 如何高效地存储用户历史记录的总访问量统计信息?

Database 如何高效地存储用户历史记录的总访问量统计信息?,database,postgresql,performance,database-design,entity-relationship,Database,Postgresql,Performance,Database Design,Entity Relationship,我正在维护一个系统,在这个系统中,用户创建一种被其他用户访问的称为“书籍”的东西 我需要一种方便(性能良好)的方法来将事件存储在数据库中,用户可以在数据库中访问这些书籍,以便稍后显示带有统计信息的图表。这些图表需要展示一个历史记录,书的所有者可以看到一周中的哪几天,以及哪几次有更多的访问活动(整个月) 使用ERD(实体关系图),我可以生成以下概念模型: 起初,这个问题似乎已经解决了,因为我们这里有一个非常简单的情况。这将为我提供一个包含3个字段的表。一个是访问事件的发生,另两个是外键。一个表示

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

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

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

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

然而,考虑到一个用户平均每天可以访问10到30本书,并且拥有一个拥有10万用户的系统,该表可以在一天内添加许多千兆字节的新记录。在良好的数据库性能实践方面,我不是最有经验的人,但我非常确定这不是解决方案

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

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

多谢各位


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

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

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

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

这看起来已经是存储此信息的最紧凑的方法之一。不过,你的数学似乎有问题。10万用户,每天30本书,比如说,每条记录30字节,相当于每天90MB。没那么吓人了,嗨,塞尔吉奥图兰采夫。谢谢你的关注。你能告诉我你是怎么计算的吗?3列增加16字节,一个100000用户每天执行30次查看的系统,每天在数据库中会消耗多少空间?我重述了我的计算结果,每天大约得到457.76兆字节,或者说每月12千兆字节。也许我做错了。你能给我举个例子吗?另外,我没有考虑使用8字节代理密钥,因为我不能使用字段中的一个作为主键。只需将数字乘以:<代码>(100000×30×30)/1y000 0000 000 < /代码>给您90兆字节。我也不知道你是怎么得到你的号码的。我的号码是纯数据大小。在数据库中存储会产生一些开销,是的。但不是500%的开销。@SergioTulentsev哦,天哪。。。这些天我多么心烦意乱。你能把你的评论设为答案吗?这样我就可以把它定义为正确答案了?谢谢你,我很抱歉。。。我让你浪费时间(