首页 > 解决方案 > Firebase 实时数据库 - 数据库触发器结构最佳实践

问题描述

我在 Firebase 实时数据库中有一些数据,我希望将一个onUpdate()触发器拆分为两个触发器。我的数据结构如下。

notes: {
  note-1234: {
    access:{
      author: "-L1234567890",
      members: {
        "-L1234567890": 0,
        "-LAAA456BBBB": 1
      }
    },
    data: {
      title: "Hello",
      order: 1
    }
  }
}

目前我有一个onUpdate()node 的数据库触发器'notes/{noteId}'

exports.onNotesUpdate = functions
.region('europe-west1')
.database
.ref('notes/{noteId}')
.onUpdate((change, context) => {
  //Perform actions
  return noteFunc.notesUpdate({change, context, type:ACTIVE})
})

但是,由于我的代码在处理数据和访问更新方面变得相当广泛 - 我正在考虑将代码分成两部分。一部分处理access子节点中的更新,另一部分处理data子节点。通过这种方式,我的代码将更容易阅读和理解,因为它可以在逻辑上分成单独的代码块。

exports.onNotesUpdateAccess = functions
.region('europe-west1')
.database
.ref('notes/{noteId}/access')
.onUpdate((change, context) => {
  //Perform actions
  return noteFunc.notesAccessUpdate({change, context, type:ACTIVE})
})

exports.onNotesUpdateData = functions
.region('europe-west1')
.database
.ref('notes/{noteId}/data')
.onUpdate((change, context) => {
  //Perform actions
  return noteFunc.notesDataUpdate({change, context, type:ACTIVE})
})

不过我有点不确定,因为accessdata都是note-1234(noteId) 节点的子节点。

我的问题是 - 这是一种推荐的方法,还是单独的子节点上的触发器会产生问题?

值得一提的是,整个note-1234节点(accessdata有时.update()会通过我的应用程序中的一个操作进行更新。在其他时间 accessdata将被更新。

亲切的问候/K

标签: javascriptfirebase-realtime-databasetriggers

解决方案


看起来您已经在一个分支下嵌套了两种类型的数据,这是 Firebase 文档在避免嵌套数据扁平化数据结构的部分中明确建议反对的。

因此,除了将代码一分为二之外,我还建议将数据结构分为两个顶级节点:一个用于每种类型的数据。例如:

"notes-data": {
  note-1234: {
    author: "-L1234567890",
    members: {
      "-L1234567890": 0,
      "-LAAA456BBBB": 1
    }
  }
},
"notes-access": {
  note-1234: {
    title: "Hello",
    order: 1
  }
}

通过在两个顶级节点中使用相同的键,您可以轻松地查找其他类型的数据以获取注释。而且由于 Firebase通过单个连接对这些请求进行管道传输,因此“客户端数据连接”并不像您最初想象的那么慢。


推荐阅读