2016-10-04 5 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からすべてのインデックスを削除します。

私のパフォーマンスの問題は、すべてのuser_contactsエントリを反復して、ユーザーが子供にいるかどうかを確認する必要があるため、ポイント3から発生します。

コードの例は以下の通りである。

私は2つの解決策を考えてきました
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) { 

     } 
    }); 

} 

  • ソリューション1user_contacts、いつからインデックスを削除しないでくださいユーザーの連絡先を読み込む必要があります。ユーザーがnull(削除されている)かどうかを確認するために各ユーザーへの呼び出しを行いました。その場合は表示しないでください。ところで、この結果、データベースが汚れてしまいます。

  • ソリューション2:私は削除しようとしているユーザーが参照されているユーザーを格納逆インデックスcontacts_usersを作成します。次のように:

    contacts_user: { 
        UsErId1: { 
         UsErId2: true 
        }, 
        UsErId2: { 
         UsErId1: true 
        }, 
        UsErId3: { 
         UsErId1: true 
        } 
    } 
    
  • ので

、私はユーザーを削除しなければならないとき、私はcontacts_usersにそのチャイルズを見て、その連絡先にそれを持っているすべてのユーザーを知っているし、今では(それを削除に進みます私は全体のパスを知ることができます)。これは、NoSqlのようなアプローチであるように思えます。

あなたはどう思いますか?それを行う別の方法がありますか?

答えて

1

あなたの2番目の解決方法は、私がそれを行うことを提案する方法であり、検索する必要はありません。その情報をユーザーごとに格納することもできますが、大きすぎると他の場所に移動する方が良い場合もあります。

同様に、他の方向への削除も容易になります。

+1

同じです:ループフィルタリングが必要なときはいつでも、リバースインデックスを作成する方がよいでしょう。 –

関連する問題