我正在一个项目中,我将存储对特定项目列表的每次点击。经过一番研究,我一直怀疑最聪明的解决方案是什么。
我的系统建立在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。最重要的是,我从一开始就存储数据,而不会以缓慢的系统结束。 而且数据库最好应该是开源的。
我希望有人能给我一些反馈,并告诉我我是否在正确的轨道上。
克里里
答案 0 :(得分:1)
如果表很大,此查询将以很大的方式吸引。
这不是PostgreSQL或任何其他数据库管理系统的缺点,而是由于对数据进行排序的开销为O(n × ln(n))
。
解决方法是预先汇总数据:
每当有点击进入时,您都会更新一个表,该表计算每个项目的点击次数。这很便宜,您可以立即获得结果。数据库触发器是必经之路!
该技术称为实例化视图。