我正在做一个项目,在这个项目中,我将存储在特定项目列表上所做的每一次点击。经过一些研究后,我一直在怀疑最聪明的解决方案是什么。
我的系统是建立在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 server,执行聚合的速度要快得多,所以我想为什么继续将数据存储在SQL server中是有意义的。我使用PostgreSQL的原因(我知道)是因为没有最大数据库大小,据我所知,它对大型数据库很好。
就这一点而言,我对与MySQL (MariaDB)、PostgreSQL和MongoDB合作都很满意。最重要的是,我从一开始就存储数据,而不会导致系统变慢。数据库最好是开源的。
我希望有人能给我一些反馈,告诉我我是否在正确的轨道上。
小格子
发布于 2018-09-28 03:24:21
如果表很大,那么这个查询就会很糟糕。
这不是PostgreSQL或任何其他数据库管理系统的缺点,而是排序数据以O(n × ln(n))
为代价的结果。
解决这个问题的方法是预先聚合数据:
每当点击进入时,您都会更新一个表,该表计算每个项目的点击量。这很便宜,而且你可以立即得到你的结果。数据库触发器就是最好的选择!
这种技术称为物化视图。
https://stackoverflow.com/questions/52535747
复制相似问题