【问题标题】:Firebase Realtime Database - Best practice for additional data nodes (lookups and initial load)Firebase 实时数据库 - 额外数据节点的最佳实践(查找和初始加载)
【发布时间】:2020-06-30 10:27:43
【问题描述】:

我有一个具有以下结构的 Firebase 实时数据库。

我希望获取用户有权访问的所有“笔记”,并且最初只显示笔记的标题。

notes: {
  "noteId-1345" : {
    "access" : {
      "author": "1234567890"
        "members": {
          "1234567890": 0 <--- Author
          "0987654321": 1 <--- Member
        }
      },
    "data" : {
      "title": "Hello",
      "content": "Konichiwa!",
      "comment": "123"
    }
  }
}

为了能够获取用户有权访问的所有笔记,我通过在根目录中保留一个额外的 user_notes 节点来扩展我的数据模型: 每当我将用户(members 的更新)与注释相关联时,我都会在 /notes/$noteid/user_notes/$uid 中写入该关系。

user_notes: {
  "$uid": {
    "noteId-1345": true
  }
}

在获取初始数据时,我只需要用户可以访问的“注释” - 包括标题

(如果用户想要查看完整的“笔记”,我只获取整个“笔记”)

我首先获取用户有权访问的笔记的 ID,然后我必须进行 另一个查找以获取标题。

let titles = []
database.ref(`user_notes/${uid}`)
.on('value', (snaps) => {
  snaps.forEach((snap) => {
    const noteId = snap.key
    database.ref(`notes/${noteId}/data/title`).on('value', (noteSnap) => {
      const title = noteSnap.val()
      titles.push(title)
    }
  })
})

这是最有效的方法吗? - 双重查找似乎效率低下。

我是否应该在 user_notes 节点中也存储标题、和初始加载所需的其他数据以避免重复查找?

在使用 NoSQL 数据库时,在这种情况下,什么被认为是最佳做法?

亲切的问候 /K

【问题讨论】:

    标签: javascript firebase-realtime-database nosql


    【解决方案1】:

    您所做的确实是常用方法。它并不像你最初想象的那么慢,因为Firebase pipelines the requests over a single connection

    需要考虑的几点:

    • 我通常会将每个注释的成员移动到顶级节点note_members 下。分离数据类型通常更容易使您的安全规则保持合理,并记录在 keep your data structure flat 下。

    • 如果您想摆脱查找,可以考虑将每个笔记的标题存储在您拥有 ID 的每个 user_notes 节点下。您基本上将 true 替换为名称:

      user_notes: {
        "$uid": {
          "noteId-1345": "Hello"
        }
      }
      

      这简化了查找代码(它的主要优点)并使其更快。

      在使用 Firebase 和其他 NoSQL 数据库时,这种数据重复很常见,您需要牺牲写入复杂性和额外的数据存储,以获得简单性和可扩展性。

    【讨论】:

    • 非常感谢您的及时回复和有见地的回答!我将阅读有关保持我的数据结构平坦的内容。 /K
    猜你喜欢
    • 2018-07-18
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    相关资源
    最近更新 更多