【问题标题】:Get the top N records from two unconnected data sets从两个未连接的数据集中获取前 N 条记录
【发布时间】:2014-05-21 05:13:56
【问题描述】:

我有两个 Rails 服务从不同的数据库返回数据。在一个数据集中,我有如下字段的记录:

query, clicks, impressions

第二个我有这样的字段记录:

query, clicks, visitors

我想要做的是从合并集中获取分页数据,匹配查询。但它还需要包含一个或另一个数据集中存在的所有记录,然后按“点击次数”列对其进行排序。

在 SQL 中,如果这两个表在同一个数据库中,我会这样做:

SELECT COALESCE(a.query, b.query), a.clicks, b.clicks, impressions, visitors 
FROM a OUTER JOIN b ON a.query = b.query 
LIMIT 100 OFFSET 1 
ORDER BY MAX(a.clicks, b.clicks)

每个数据集的单个“前 100 名”会产生不正确的结果,因为数据集“a”中的“点击”可能明显高于或低于数据集“b”。

由于它们不在同一个数据库中,我正在寻求有关使这种查询高效且干净的算法的帮助。

【问题讨论】:

  • 您是否使用 ActiveRecord 来查询您的数据库?
  • 是的,我正在使用 ActiveRecord。虽然我不确定这是否相关。服务通过 HTTP/JSON 连接。
  • @jwadsa​​ck 我想这个 SO 答案可能会有所帮助,stackoverflow.com/questions/2186682/…
  • @jwadsa​​ck 其他冗长的选项可以是使用基于条件的迭代和联合合并来自两个数据库的合并 AR 集合。
  • @AlokAnand 您指向的 SO 答案涉及可以读取两个数据库的 Access。我们的数据集是数百万条记录,我们需要 100 页(通常只有第一条)。访问不是一种选择。我们可以使用现有的数据库(两种情况下都是 PostgreSQL),但这违反了我们的 SOA 分离。合并 ruby​​ 中的记录也是可能的(SOA 接口没有 AR 连接器,但是,我再次认为这不相关。)基于其他数据处理代码,我也不认为这对于数据集的规模。

标签: ruby sorting pagination


【解决方案1】:

我从未找到在数据库之外执行此操作的方法。最后,我们只是使用 PostgreSQL 的 Foreign Data Wrapper 功能将两个数据库连接在一起,并使用 PostgreSQL 来处理排序和分页。

对于任何走这条路的人来说,一个技巧是,我们在远程服务器上构建了 VIEW,它提供了上面a 所需的数据。这比尝试通过远程连接连接表要快数千倍,因为索引的值会丢失。

【讨论】:

    猜你喜欢
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 2019-02-03
    • 2013-06-14
    • 2011-08-20
    • 1970-01-01
    • 2014-08-28
    相关资源
    最近更新 更多