我想使用Firebase进行聊天。我需要为每个用户显示他们所属的组列表以及每个组的所有成员。
由于Firebase的设计方式,并且为了获得可接受的性能,我认为列出包含成员列表的所有组,并为每个用户创建一个包含所有组的条目。< / p>
我的第一个问题是,这是正确的方法吗?
如果是这样,我的第二个问题是如何以原子方式添加(或删除)用户,即确保将用户添加到组中并将组添加到用户中或根本不添加(即从未存储在仅限1个位置并使DB不一致)?
答案 0 :(得分:2)
您提出的数据模型与firebase的建议一致。 best way to structure data in firebase
中概述了更详细的说明users/userid/groups
groups/groupid/users
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
}
})
}
});