【发布时间】: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