【发布时间】: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