【问题标题】:Can "rules" be used to improve query performance in a Firebase DB? [duplicate]可以使用“规则”来提高 Firebase 数据库中的查询性能吗? [复制]
【发布时间】:2017-01-09 07:38:58
【问题描述】:

假设我有一个收藏“书籍”,其中包含大量儿童。

(请这个例子是虚构的,所以不要专注于书籍的最佳解决方案)

现在,我知道我们可以/应该以这样一种方式构建集合,即每个用户都有他/她自己的集合,如下所示:

  • 书籍
    • userId1
      • 书1
      • 书2
      • 书5
    • userId5
      • 书2

但我想知道是否有像下面这样的集合,允许用户仅读取用户 ID 列在“reader”属性下的子项。

  • 书籍
    • 书1
      • 读卡器
        • userId1
        • userId2
        • userId4
    • 书2
      • 读卡器
        • userId1
    • 书5
      • 读卡器
        • userId3

如果这条规则可行,我们是否可以调用参考 mDatabase.child("books") 并只接收用户可以阅读的书籍的快照而不是所有书籍?

【问题讨论】:

标签: firebase firebase-realtime-database


【解决方案1】:

不,这是不可能的,因为 Firebase 规则不充当过滤器。如果您尝试请求示例中的所有书籍,但阅读规则说您无权访问其中一本,则用户将根本无法请求这些书籍,整个请求将失败。

处理此类事情的推荐方法是对您的读者列表进行不同的处理。一个有效的结构应该是这样的:

  • 书籍
    • 书0
    • 书1
  • 读者
    • 用户0
      • 阅读
        • 书0
        • 书1
    • 用户1
      • 阅读
        • 书1

因为您知道用户的用户 ID,所以查找用户的成本很低。然后检查用户正在阅读哪些书也很便宜,因为那是在用户对象中。如果您有用户正在阅读的书籍的 ID,则可以通过它们的 ID 单独获取这些书籍,而无需请求整个书籍数组。

在这种情况下,性能不再是问题。通过数组中的索引或对象中的键来查找对象是相当便宜的。

【讨论】:

  • 谢谢瑞克,我明白了。另一个小问题,如果我正在显示用户正在阅读的书籍列表,并且我希望在该列表中显示保存在书籍集合中的数据,这些数据不断变化并且对每个用户都是独一无二的......比如总数量读那本书的朋友。对用户列表中的每个项目进行查询仍然便宜吗?我仍然发现很难进入 Firebase 的数据结构思维模式以获取此类关系到每个用户的唯一信息。
  • 好吧,我不确定这种查询的复杂性。表示友谊实际上非常困难,因为它是关系数据的一个典型例子:友谊不属于所涉及的朋友之一,它是一种共享关系。如果您关心性能,请将每个用户的朋友保存在每个用户对象下,这意味着数据的重复。如果您关心正确性并确保您的数据没有损坏,请将其另存为单独的实体。然后,您可以请求用户的朋友以及朋友正在阅读的书籍,并对这些数据进行计算。
猜你喜欢
  • 2020-08-20
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多