【问题标题】:Optimizing Firebase query for speed: search Users by city优化 Firebase 查询以提高速度:按城市搜索用户
【发布时间】:2017-09-17 20:00:49
【问题描述】:

场景:我有一个存储其位置(城市和国家/地区)的用户节点。我想找到居住在特定城市的所有用户。然后每个城市,我想过滤 roomType,最后按用户的分数对用户进行排序。

问题:城市和国家是 字符串 字段,因此遍历所有用户以首先匹配国家和城市将是非常耗费资源的 string_comparison 查询。

我可以做些什么来加快搜索速度?

一种可能的方法:将城市 + 国家/地区“location_pair”转换为数值(例如 int_val_location_pair)。然后对 int_val_location_pair 进行整数比较。这比对国家和城市进行两个字符串比较要快得多。当然,我必须将映射存储为单独的节点。

世界上没有那么多城市(大约 4,000,000),所以我可以轻松地使用一个 32 字节的整数来表示世界上所有的城市。另外,实际上,我将让最多 10,000 个不同城市的用户注册。

架构可以是这样的:

$Users:
    name:
    city:
    country:
    $int_val_location_pair:
    score:
    roomType:   
$int_val_location_pair:
    city:
    country:

问题:这是一个好方法吗??

如果是,我有下一个问题:在注册时,当用户填写国家和城市时,我想为 int_val_location_pair 自动创建一个新值,只有在 location_pair(城市和国家) 在数据库中不存在。

在这种情况下如何确保没有重复的int_val_location_pair?假设有 10 个人同时在同一位置注册(数据库中不存在)。他们都查询数据库并确认 location_pair 不存在,因此最终为 int_val_location_pair 创建了一个新值,从而导致重复。我应该如何避免这种情况?

提前致谢。

【问题讨论】:

    标签: firebase firebase-realtime-database database-schema nosql


    【解决方案1】:

    为什么不为树中的每个位置保留一个用户 ID 列表?

    usersByLocation
      $country
        $city
          uid1: true
          uid2: true
    

    您可以通过以下方式简单地查找特定城市中用户的 UID:

    ref.child("United States").child("San Francisco").on("child_added"...
    

    【讨论】:

    • 我想过这个问题,但假设应用程序用户居住的城市总共有 10,000 个城市,并且每个城市有 5,000 个用户。那不会有问题吗?加上我的应用程序的另一部分(我最初没有提到)将把这 5,000 名用户带到城市中,然后对他们进行额外的过滤。我还要对 5,000 个用户的结果进行一次字符串比较和一次排序操作。
    • 我展示的方法不使用查询和过滤。这意味着它的扩展性非常好。但是很难在如此广泛的声明中进行优化。相反,我建议阅读 NoSQL data modeling 并观看 Firebase for SQL developers 以更好地掌握该主题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 2016-02-29
    • 2011-06-17
    • 1970-01-01
    相关资源
    最近更新 更多