database - 将点击存储为大数据

标签 database postgresql bigdata

我正在做一个项目,我要存储对特定项目列表的每次点击。经过一些研究后,我一直怀疑最聪明的解决方案是什么。

我的系统是建立在 PostgreSQL 数据库上的,并且我知道我像这样存储点击:

id        itemId        userId        ipAdress        date
1         3             1             xx.xx.xx        01/01-2018
2         1             1             xx.xx.xx        01/01-2018
3         2             NULL          xx.xx.xx        01/01-2018
4         2             NULL          xx.xx.xx        01/01-2018
5         1             2             xx.xx.xx        01/01-2018

我的项目列表应该按点击次数最多的顺序排序。因此,查询可能看起来像这样,以按点击次数对项目进行排序:

select i1.*, count(i1.id) as totalClicks from itemClicks ic1
left join items i1 
on i1.id = ic1.itemId
group by ic1.itemId
order by totalClicks desc

所以这工作得很好——至少在没有庞大数据集的情况下。但在某一时刻,数据集中可能有数百万行。 According to this article by researchgate.net SQL 服务器进行聚合要快得多为什么我想继续将数据存储在 SQL 服务器中是有意义的。 我之所以选择 PostgreSQL(知道)是因为它没有最大数据库大小,据我所知,它适用于大型数据库。

就此而言,我对使用 MySQL (MariaDB)、PostgreSQL 和 MongoDB 都很满意。最重要的是我从一开始就存储数据,而不会以缓慢的系统结束。 并且数据库最好是开源的。

我希望有人能给我一些反馈,告诉我我是否在正确的轨道上。

克里利

最佳答案

如果表很大,这个查询会很糟糕。

这不是 PostgreSQL 或任何其他数据库管理系统的缺点,而是排序数据的开销为 O(n × ln(n)) 的结果。

解决这个问题的方法是预先聚合数据:

每当出现点击时,您都会更新一个计算每个项目点击次数的表格。这很便宜,您可以立即得到结果。数据库触发器是必经之路!

这种技术称为物化 View

关于database - 将点击存储为大数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52535747/

相关文章:

java - 尝试用Java设计数据库。到目前为止,我有一个可序列化的对象,我可以在需要时读取并更新该对象。好主意还是坏主意?

sql - 如何遍历不同的 WITH 语句

PostgreSQL 数据库大小不合理

postgresql - 将 Exposed with DataSource 与 Postgres 一起使用时不使用索引

hadoop - MapReduce架构

python - 用于映射大数据的Python共享内存字典

php - 如何向 php 添加 +1 值

database - Heroku 上的 SHARED_DATABASE 支持 Postgresql 功能吗?

c# - 普遍存在的 SQL 德语变音符号问题

hadoop - NameNode 地址的 URI 无效,s3a 不是模式 'hdfs'