2016-06-15 2 views
3

新しいアプリケーションのfirebaseの探索を始めました。アプリは、基本的にユーザーとグループチャットのチャットが必要です。 MessageThread:私たちが作成しているチャットアプリケーションのために firebase googleまたはクエリのサポートまたは代替ソリューション

(ID、ユーザ:ユーザA、ユーザ:ユーザーB、UserGroupに:グループ、アレイ:deletedBy、...)

主な問題はfirebaseしないで私のユースケースで必要なORクエリとINクエリをサポートしています。 フェッチMessageThread(S)(currentUser.id == userA.id)OR(currentUser.id == userB.id)OR(currentUser.idの場合:ユーザーの会話のリストにアクセスするための

ダミークエリ:たとえば、 group.members)

Firebaseを理解するのに何か不足していますか?この問題を解決するためにデータベースを設計する他の代替方法は何ですか?

答えて

3

NoSQLでは、あなたのアプリがそれを使いたい方法でデータをモデリングする必要があります。あなたは、ユーザーがその一部である会話のリストが必要な場合、あなたは、データベースにそのリストを維持する必要がありますので。これにより

/conversationMessages 
    $conversationId 
     $messageId 
      text: "Hello world" 
      sender: "uid of sender" 
      name: "name of sender" 
/userConversations 
    $uid 
    $conversationId1: true 
    $conversationId2: true 

あなたは簡単に各ユーザーがその一部である会話のリストを調べることができますそれらのいずれかのメッセージをロードします。おそらく、また、各会話のためのメタデータの別のリストを維持したいと思う:

/conversationMetadata 
    $conversationId 
     lastUpdated: timestamp (set with ServerValue.TIMESTAMP) 
     title: "name of our chat room" 

あなたが彼らの会話IDをロードし、各会話のメタデータをロードすることによって、ユーザーのための会話のリストを表示することができますこの方法:

var ref = database.ref().child("userConversations").child(auth.uid); 
ref.on('child_added', function(conversationKey) { 
    var conversationRef = database.ref().child("conversationMetadata").child(conversationKey.key); 
    conversationRef.once('value', function(metadataSnapshot) { 
     console.log(metadataSnapshot.val()); 
    }); 
}); 

SQL知識をNoSQLデータベースにマップしようとすると、学習が困難になります。 relevant section of the Firebase documentationとこのarticle about NoSQL data modelingを読むことを強くお勧めします。

+0

ありがとうございました。もう1つの質問:Firebaseで参照を作成するサポートはありますか?たとえば、ユーザーのオブジェクトを会話に保存して、会話リスト画面にユーザーの名前と写真を表示できるようにします。 – iMemon

+0

管理された外部キー参照はありません。しかし、(管理されていない)参照を持つことは非常に一般的です。 [データをスケールする](https://firebase.google.com/docs/database/android/structure-data#fanout)のドキュメントのセクションを参照してください。 –

+0

私のセネリオではグループ/ユーザチャットがあり、チャット名と画像はそのグループ/ユーザからフェッチされます。ユーザーはいつでも変更するオプションがあるので、それをデノーマライズすることはできません。だからあなたの言及したアプローチから、私はテーブル/ conversationMetadata私はユーザー/グループの参照をすることができます。問題は、上記のコードで説明したように、会話リストを取得することです。まず、userConversationsを取得してから会話ごとにconversationMetadataを取得してから、userDataまたはgroupData(名前/画像を取得する)を取得する必要があります。それは遅すぎると思いませんか?助けてください。 – iMemon

関連する問題