我正在做一个项目,我要存储对特定项目列表的每次点击。经过一些研究后,我一直怀疑最聪明的解决方案是什么。
我的系统是建立在 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/