【问题标题】:Store clicks as big data将点击存储为大数据
【发布时间】:2018-09-27 11:18:02
【问题描述】:

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

我的系统是建立在 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。最重要的是我从一开始就存储数据,而不会以缓慢的系统结束。 而且数据库最好是开源的。

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

克雷利

【问题讨论】:

  • 您的假设是有缺陷的:本文讨论了两种产品,一种是 MongoDB(一种 NoSQL 数据库),另一种是 SQL Server - Microsoft 的产品。这篇文章没有比较 NoSQL 和 SQL 数据库,而是从字面上比较了两种特定的产品——因此你不能把它应用到你最喜欢的选择上。

标签: database postgresql bigdata


【解决方案1】:

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

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

解决方法是预先聚合数据:

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

这种技术称为物化视图

【讨论】:

  • 你完全正确。在一个大型数据集上尝试了查询,执行时间为 100 秒。我现在已经阅读了物化视图,这似乎是解决我的问题的好方法。非常感谢您的帮助!
  • 我添加了对触发器的引用(我忘记了)。
  • 所以你是说每次我在数据库中存储一次点击时,触发器应该去更新给定表中的一行并增加计数值?
  • 否;这就是它的美妙之处:更新或插入 自身 启动触发器,然后修改物化视图。两者都运行在同一个事务中,所以数据库保证要么都成功要么都失败,并且不可能出现不一致!
猜你喜欢
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
  • 2016-08-16
  • 1970-01-01
相关资源
最近更新 更多