我仍在使用 Firebase,这次我有一个与删除对象相关的问题。
我有如下结构:
users: {
UsErId1:{
name: "Jack",
email: "[email protected] /cdn-cgi/l/email-protection"
},
UsErId2: { + },
UsErId3: { + }
},
user_contacts: {
UsErId1:{
UsErId2: true,
UsErId3: true
},
UsErId2: {
UsErId1: true
}
}
因此,如果我想删除用户,我必须:
- 删除用户对象
- 删除user_contacts分支下的用户对象
- 从 user_contacts 中删除指向该用户的所有索引
我的性能问题来自第 3 点,因为我需要迭代所有 user_contacts 条目以查看用户是否存在于子项中。
代码示例如下:
private void deleteUser(String userId) {
firebaseDatabase.getReference("users").child(userId).removeValue();
firebaseDatabase.getReference("users_contacts").child(userId).removeValue();
firebaseDatabase.getReference("users_contacts").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot usersSnapshot : dataSnapshot.getChildren()) {
for( DataSnapshot contactSnapshot : usersSnapshot.getChildren() ){
String contactId = contactSnapshot.getValue(String.class);
if( contactId.equals(userId) ){
contactSnapshot.getRef().removeValue();
}
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
我想到了两种可能的解决方案:
解决方案1: 不要删除索引user_contacts
当我必须加载用户联系人时,我必须对每个用户进行调用以查看该用户是否为空(已被删除),在这种情况下,不要显示它。顺便说一句,这会导致数据库脏。
-
解决方案2:创建反向索引contacts_users
我在其中存储引用我尝试删除的用户的用户。如下:
contacts_user: {
UsErId1: {
UsErId2: true
},
UsErId2: {
UsErId1: true
},
UsErId3: {
UsErId1: true
}
}
因此,当我必须删除一个用户时,我会查看它的子用户contacts_users
并了解其联系人中包含该文件的每个用户,然后继续删除它(现在我可以知道整个路径)。在我看来,这是一种更像 NoSql 的方法。
你怎么认为?还有其他方法吗?
您的第二个解决方案是我建议的做法,无需搜索。您可以按每个用户存储该信息,但如果信息变得太大,则将其存储在其他地方会更好。
同样,从另一个方向删除也变得更容易。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)