2016-05-22 4 views
0

私はFacebook Messengerのようなチャットアプリを設計しています。私の2つの現在のルートノードはchatsusersです。ユーザーにはチャットの関連リストusers/user/chatsがあり、チャットはchatsノードchats/a151jl1j6にautoIDで追加されます。そのノードは、メッセージのリスト、最後のメッセージの時刻、誰かが入力しているときなどの情報を保存します。双方向リンクのFirebaseクエリ

私が苦労しているのは、どの2人のユーザーがチャットに参加しているかを定義する場所です。もともと、私はusers/user/chatsノードのchatIdキーの値として他のユーザーへの参照を入れましたが、グループチャットが欲しいと思っていたのは悪い考えでした。

より具体的にはchats/chat/membersノードを定義し、userId: true, user2id: trueと定義します。私の問題は、これを効率的にクエリする方法です。たとえば、ユーザーがユーザーと新しいチャットを作成しようとしている場合、チャットが既に存在するかどうかを確認する必要があります。私はどのように "メンバーがcurrentUserIdfriendUserIdを含んでいるチャットを見つける"の質問をするか、これが効率的な非正規化されたやり方であるかどうかはわかりません。

ヒント

答えて

2

は内のIDを持つという考えが、 id1---||---id2という形式は間違いなく仕事を得ますが、大きなグループがあると予想される場合には縮尺が変わらず、id2---||---id1の比較を考慮する必要があります。会話に多くの人がいると複雑になります。大規模なグループについて心配する必要がない場合は、それを実行する必要があります。

無料で入手できるので、実際にはautoId chats/a151jl1j6を使用しています。データを構造化するための推奨される方法は、関連する子オブジェクトを持つ他のノードでautoIdキーを作成することです。したがって、chats/a151jl1j6には会話メタデータが含まれ、members/a151jl1j6にはその会話のメンバーが含まれ、messages/a151jl1j6にはメッセージなどが含まれます。

"chats":{ 
    "a151jl1j6":{}} 

"members":{ 
    "a151jl1j6":{ 
     "user1": true, 
     "user2": true 
    } 
} 

"messages":{ 
    "a151jl1j6":{}} 

この部分がほとんど「非効率的」であるのは、user1とuser2の両方を含む会話を照会することです。推奨される方法は、各ユーザーの会話のインデックスを作成し、次にmembersデータを照会することです。

"user1":{ 
    "chats":{ 
     "a151jl1j6":true 
    } 
} 

これは、フラット化されたデータ構造を使用してリレーションシップをクエリするときのトレードオフです。データのサブセットのみを処理しているため、クエリは高速ですが、変更/削除時にユーザーがチャットの会話を離れるときに考慮する必要がある重複データが多くなります。複数の構造を更新する。

参考:https://firebase.google.com/docs/database/ios/structure-data#flatten_data_structures

+0

ありがとうございました!だから、これはあなたがユーザーxとの既存の変換をチェックすることです、私は私のチャットを繰り返し、それぞれのxがそれらにあるかどうかを確認するためにそれらをチェックする?これは、私が持っているチャットの量にクエリを制限します。これは安価でなければなりません。 –

+0

はい、それはあなたのアプリのuxにも依存します。ほとんどのチャットアプリにはすべてのチャットの一覧が表示される画面が表示されますので、既存の会話はアプリ内でローカルに保存されますので、ファイアベースで同期されたままになるため、クエリをローカルで行うこともできます。ただし、他の場所からの会話を開始し、既存の会話をたくさん確認する必要がある場合は、会話とそのメンバーを弾性検索(https://github.com/firebase/flashlight)でさらに索引付けして、 1つのクエリで複雑な検索を実行できます。 – ArunV

1

私は以前も同様の問題があったことを覚えています。

  • ユーザー1は、固有のID id1
  • ユーザー2は、固有のID id2

代わりのAUTOID chats/a151jl1j6チャットのIDで新しいチャットを追加することがありますがあります。私はそれを解決する方法方法はid1---||---id2(人為的に読みやすい区切り文字)

(これは最初に提案したものです)

もともと、私は、ユーザー/ユーザー/チャットノードでchatIdキーの値として、他のユーザーへの参照を置くが、私は私が今までにグループチャットを望んでいた場合にはそれは悪いアイデアだと思いました。

ことわざがあります:https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it

パスに住むことができますどのように多くのユーザーIDの制限はありかもしれない - あなたは常に値をハッシュすることができますが...

+0

私の元々の考えは正しいと思います。クエリを保存するので、ユーザーIDとキー/値を持つことは理にかなっています。あなたはこれはグループチャットのためにスケーラブルだと思いますか? 他の考えは、ユーザーIDがどの序列にあるかをどのように知っていますか? –

+0

オーダーについて - 救助隊へのソート。チャットをグループ化するスケーリングについて - 私はそのような機能を必要としませんでした。 YAGNI +はいつも "最悪なことが起こる可能性があります"と尋ねる価値があります:) –