2016-10-04 218 views
2

我仍然在Firebase上,这次我有一个与删除对象相关的问题。删除对象时删除嵌套字段中的索引

我有这样的结构如下:

users: { 
    UsErId1:{ 
     name: "Jack", 
     email: "[email protected]" 
    }, 
    UsErId2: { + }, 
    UsErId3: { + } 
}, 
user_contacts: { 
    UsErId1:{ 
     UsErId2: true, 
     UsErId3: true 
    }, 
    UsErId2: { 
     UsErId1: true 
    } 
} 

所以,如果我要删除我有一个用户:

  1. 删除用户对象
  2. 下删除用户对象user_contacts分支
  3. 删除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的方法。

您认为如何?还有另一种方法可以做到吗?

回答

1

你的第二个解决方案是我会建议如何做,不需要搜索。您可以将这些信息存储在每个用户的基础上,但是如果它变得太大,将它放在其他地方会更好。

同样,在其他方向删除也变得更容易。

+1

同样在这里:无论何时您发现自己需要循环+过滤,您最好创建一个反向索引。 –