【问题标题】:Firebase database structure and query format optionsFirebase 数据库结构和查询格式选项
【发布时间】:2016-12-24 17:11:51
【问题描述】:

基本上,我的应用有基于位置的帖子,可以投票/否决。 我需要构建一个查询,该查询返回位于指定区域的前 15 个投票帖子,这些帖子是在过去 24 小时内发布的。来自 sql 背景,我发现使用 JSON 格式和 firebase 内置的按顺序查询和过滤选项很难做到这一点。我意识到我很可能需要进行大量的客户端过滤,所以我想问一下 JSON 结构和查询格式将是什么,以最大限度地减少客户端过滤。到目前为止,这是我的 JSON 格式的样子:

  "posts" : {

    "-KPFIsDbf3WUljWvBwi-" : {

      "latitude" : 33.64114800203589,
      "longitude" : -116.4236003651668,
      "time" : 1.47129994542173E12,
      "uid" : "wjXpBBJMBVPvRVG48fFkerAw6TD3",
      "upvotes" : 0
},

我尝试使用 Geofire,但不幸的是,它似乎只能按地区查询,而且由于我想按地区和发布时间(除其他外)查询,因此使用 Geofire 无法很好地扩展。

【问题讨论】:

  • 你知道你的地区会是什么吗?还是由用户位置决定?
  • 查询区域可以是任何东西

标签: ios swift firebase firebase-realtime-database geofire


【解决方案1】:

以下是我将在类似设置中使用 GeoFire 和 Firebase 查询的组合执行的操作:

第 1 步(保存):保存帖子时,先将其保存到数据库,使用随机 ID。然后,获取该 ID,创建 GeoFire 位置,并将您的帖子 ID 设置为位置键。

第 2 步(查询):这将是一个 2 步查询

步骤 2a:获取指定区域内的所有 GeoFire 位置。现在,您可以从快照中获取所有位置的键,并在每个位置附加一个数据事件处理程序。

第 2b 步:维护一个按赞数排序的帖子对象数组。在单个事件侦听器的快照中,首先检查时间戳以查看它是否在过去 24 小时内。接下来,如果数组的计数小于 15,则将您的帖子添加到排序位置(使用适当的解析方法)。如果它已经有 15 个,您需要查看数组中最小的最低元素是否有更多的赞成票。如果没有,您需要在阵列中找到一个位置进行替换。解析完 Geofire 中的每个快照后,您将获得过去 24 小时内的一系列帖子,按点赞数排序。

【讨论】:

  • 听起来这样可行。我唯一担心的是帖子列表增加时的性能。由于我要永久存储每个帖子,因此不可避免地会出现越来越差的性能,因为客户必须过滤越来越多的帖子。在遇到问题之前,您估计此方法可以处理的帖子总数大约是多少? (让我们假设用户必须查询每个帖子的最坏情况)。谢谢
  • 好吧,如果您已经拥有 ID,则捕获快照相当快。我会说,一旦你获得接近 1,000 个帖子,它就会开始导致性能问题,但考虑到其中还有排序数组部分。我将看看 GeoFire 查询在后台做了什么,试图将所有内容组合到一个查询中。我会尽快回复您。
  • 因此,仔细观察后,在这个查询中添加第三个约束似乎并不可行。 Geofire 已经在同一个查询中做了很多工作来处理纬度和经度。您必须在客户端实现其余部分。
  • 感谢您的意见。我在想最好只查询过去 24 小时内的所有帖子并在客户端进行经度/纬度过滤
  • 是的,这是您必须做出的决定。这取决于您是否认为在过去 24 小时内会有更多帖子或指定区域内的帖子总数更多。
猜你喜欢
  • 1970-01-01
  • 2015-05-31
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
相关资源
最近更新 更多