【问题标题】:How to store total visits statistics for user history efficiently?如何有效地存储用户历史的总访问统计信息?
【发布时间】:2019-01-01 10:15:35
【问题描述】:

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

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

使用 ERD (Entity-Relationship-Diagram),我可以生成以下概念模型

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

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

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

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

谢谢。

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

【问题讨论】:

  • 这看起来已经是存储此信息的最紧凑的方式之一了。不过,你的数学似乎不对劲。 10 万用户,每天 30 本书,例如,每条记录 30 字节,相当于每天 90MB。不那么令人生畏了。
  • 嗨@SergioTulentsev。感谢您的关注。你能告诉我你是怎么做这个计算的吗? 3 列增加 16 字节,以及 100,000 名用户每天执行 30 次查看的系统,数据库中每天将消耗多少空间?我重述了我的计算结果,每天大约有 457.76 兆字节,或每月 12 吉字节。也许我做错了。你能给我举个例子吗?此外,我没有考虑使用 8 字节代理键,因为我不能使用其中一个字段作为主键。
  • 只需将数字相乘即可:(100_000 * 30 * 30) / 1_000_000 为您提供 90 兆字节。我也不知道你是怎么得到你的号码的。
  • 我的数字是纯数据大小。存储在数据库中会产生一些开销,是的。但不是 500% 的开销。
  • @SergioTulentsev 天哪……这些天我分心了。您可以将您的评论设置为答案,以便我可以将其定义为正确答案吗?谢谢你,我很抱歉......我让你浪费了你的时间。 :(

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-11-06
    • 2010-11-16
    • 2021-04-03
    • 2015-06-23
    • 2010-10-13
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    相关资源
    最近更新 更多