我想使用Firebase进行聊天.我需要为每个用户显示他们所属的组列表以及每个组的所有成员.
由于Firebase的设计方式,并且为了获得可接受的性能,我认为列出包含成员列表的所有组,并为每个用户创建一个包含所有组的条目.
我的第一个问题是,这是正确的方法吗?
如果是这样,我的第二个问题是如何以原子方式添加(或删除)用户,即确保将用户添加到组中并将组添加到用户中或根本不添加(即从不仅存储在1个位置并使DB不一致)?
您提出的数据模型与 firebase 的建议一致。以在 firebase 中构建数据的最佳方式概述了更详细的解释
users/userid/groups
groups/groupid/users
Run Code Online (Sandbox Code Playgroud)
Firebase 为原子操作提供 .transaction。您可以链接多个事务以确保数据一致性。您还可以使用 onComplete 回调函数。详细解释请参阅firebase transaction。我正在使用相同的方法来使仪表板显示的多个消息计数保持最新。
嵌套事务的示例代码:
ref.child('users').child(userid).child(groupid).transaction(function (currentData) {
if (currentData === null) {
return groupid;
} else {
console.log('groupid already exists.');
return; // Abort the transaction.
}
}, function (error, committed, snapshot) {
if (committed) {
console.log('start a new transaction');
ref.child('groups').child(groupid).child(userid).tranaction(function (currentData) {
if (currentData === null) {
return userid;
} else {
console.log('Userid already exists.');
//add code here to roll back the groupid added to users
return; // Abort the transaction.
}
}, function (error, committed, snapshot) {
if (error) {
//rollback the groupid that was added to users in previous transaction
}
})
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4633 次 |
| 最近记录: |