2
我仍然在Firebase上,这次我有一个与删除对象相关的问题。删除对象时删除嵌套字段中的索引
我有这样的结构如下:
users: {
UsErId1:{
name: "Jack",
email: "[email protected]"
},
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的方法。
您认为如何?还有另一种方法可以做到吗?
同样在这里:无论何时您发现自己需要循环+过滤,您最好创建一个反向索引。 –