我正在做一个项目,我要把每一次点击都存储在一个特定的项目列表中。经过一些研究,我一直怀疑什么是最聪明的解决方案。
我的系统是建立在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.netsql服务器执行聚合的速度要快得多,我想继续将数据存储在sql服务器中是有意义的。
我之所以使用PostgreSQL(因为知道)是因为没有最大的数据库大小,它对于我理解的海量数据库来说是很好的。
在这方面,我和mysql(mariadb)、postgresql和mongodb一起工作都很舒服。最重要的是,我从一开始就存储数据,而不会以一个缓慢的系统而告终。
数据库最好是开源的。
我希望有人能给我一些反馈,告诉我我是不是在正确的轨道上。

最佳答案

如果表很大,则此查询将以很大的方式进行。
这并不是postgresql或其他任何数据库管理系统的缺点,而是排序数据需要花费O(n × ln(n))的结果。
解决方法是预先聚合数据:
每当有一个点击进入,您就更新一个表,该表计算每个项目的点击数。这很便宜,而且你可以立刻得到你的结果。一个数据库触发器就是解决办法!
这种技术称为物化视图。

07-24 17:41
查看更多