2016-05-29 22 views
11

次のチャットアプリのfirebaseガイドstructuring dataへ。彼らは以下のような構造を示唆している。私は簡単に、彼らはの一部であるチャットのすべてのリストを表示し、それらの一つ一つのために最後のメッセージとタイムスタンプを表示することができるようにFirebaseのチャットアプリのデータ構造

{ 
    // Chats contains only meta info about each conversation 
    // stored under the chats's unique ID 
    "chats": { 
    "one": { 
     "title": "Historical Tech Pioneers", 
     "lastMessage": "ghopper: Relay malfunction found. Cause: moth.", 
     "timestamp": 1459361875666 
    }, 
    "two": { ... }, 
    "three": { ... } 
    }, 

    // Conversation members are easily accessible 
    // and stored by chat conversation ID 
    "members": { 
    // we'll talk about indices like this below 
    "one": { 
     "ghopper": true, 
     "alovelace": true, 
     "eclarke": true 
    }, 
    "two": { ... }, 
    "three": { ... } 
    }, 

    // Messages are separate from data we may want to iterate quickly 
    // but still easily paginated and queried, and organized by chat 
    // converation ID 
    "messages": { 
    "one": { 
     "m1": { 
     "name": "eclarke", 
     "message": "The relay seems to be malfunctioning.", 
     "timestamp": 1459361875337 
     }, 
     "m2": { ... }, 
     "m3": { ... } 
    }, 
    "two": { ... }, 
    "three": { ... } 
    } 
} 

は、どのように私は自分のユーザーデータを構造化します。私は次の構造を行う場合は、次の

ref.child("users").child("ghopper").child("chats").observeSingleEventOfType(.Value, withBlock: { (snapshot) in 
    //do something with data 
} 

私が勝っしかし:

"users": { 
    "ghopper": { 
     "name": "Gary Hopper", 
     "chats": { 
      "one: true", 
      "two": true 
     } 
    }, 
    "alovelace" { ... } 
    }, 

を私は簡単に(迅速に)行うことにより、例えばghopperのために、特定のユーザーのための各チャットグループのリストを取得することができますこのスナップショットにはlastMessageとtimestampがありません。このデータにアクセスするには何が必要ですか?

  • 各ユーザーのすべてのデータを複製しますか?つまり、ユーザー/ゴッファー/チャット/ one/{"lastMessage": "ゴーファー:リレーの不具合が見つかりました"原因:moth "、"タイムスタンプ ":1459361875666}
  • チャットごとに" chats/specificGroupId "ユーザーは(複数のリスナーを追加する)の一部ですか?
  • 他の方法はありますか?あなたはユーザがすべてのチャット、あなたが行うことができますのリストを持っているブロックで

答えて

2

var dictionary: [String: Long] 
var lastMessage: String 
for chat in listOfChatsUserIsIn 
    ref.child("chats").child("\(chat)").child("lastMessage").observeSingleEventOfType(.Value, withBlock: { (snapshot) in 
     lastMessage = snapshot 
     ref.child("chats").child("\(chat)").child("timestamp").observeSingleEventOfType(.Value, withBlock: { (snapshot) in 
      //add timestamp and last message to dictionary 
     } 
    } 

私は私の構文がどのように正しいのか分かりません。まだファイアーベースを学んでいます。しかし、これは基本的には2番目の提案だと思います。他のデータをどのように取得するかわからない。これはO(2n)になりますが、それは悪くありません。

[[更新1]]

私のコードは怠け者でした。 lastMessage = snapshotを付けて保存して、次のブロックの辞書に追加することができます。

Firebaseは非同期です。タイムスタンプやメッセージをキーとして使用し、メッセージのいずれかをディクショナリの値として使用している限り、これはまだ機能すると思います。それは順不同であるかもしれませんが、後でいつでもタイムスタンプでソートすることができます。しかし、これはおそらくベストプラクティスではありません。

ジェイ、私はあなたの解決策が好きです。 uid_2: falseもリストアップする必要はありませんか?

残念ながら、この2つのデータベース構造は、n^2でユーザー - > inf、チャット - > infとして成長するようです。

+0

あなたはその変数を使用していないので、lastMesssage = snapshotの機能は何ですか?また、ブロック内でself.variableの名前を使用することをお勧めします(クロージャ)。また、最初のref.child内のref.childは重複しているため、同じデータを読み込みます。最大の問題は、Firebaseが非同期であり、ループのタイトループがobserveブロック内でデータが返されるよりも速く* way *実行されるため、データの整合性に問題があると思われます。Firebaseには「もの」は非同期である。 – Jay

+0

答え内の質問に答えるには....いいえ、uid_2:存在しないかのようにfalseは必要ありません。デフォルトではfalse(コード化されている)になる可能性があります。そして、いいえ、データベースは指数関数的に増加しません。 10人のユーザーと1人のチャットをお持ちの場合、10人のユーザー全員がそのチャットに参加しているため、1000人のユーザーと100人のチャットがあれば、2人のユーザーとチャットするそれでも、それぞれ100人のチャットがあり、それぞれに2人のユーザーを持つユーザーノードがあります。 1000人のユーザーと1000のチャットでも、それは相当量のデータではありません。 – Jay

17

は、どのように私は簡単に、彼らはの一部であるチャットの すべてのリストを表示できるように、私のユーザーデータを構造化し、それらのそれぞれについて 最後のメッセージとタイムスタンプを表示します。

変更チャット構造チャットノードに

"chats": { 
    "one": { 
     "title": "Historical Tech Pioneers", 
     "lastMessage": "ghopper: Relay malfunction found. Cause: moth.", 
     "timestamp": 1459361875666 
     users 
     uid_1: true 
     uid_3: true 
    }, 
    "two": { ... }, 

ているユーザーを追加することによって、少し次に、あなたはすべてのチャットのための深いクエリ特定のユーザがの一部であることができます - これはチャットのuid_3が返されます

各firebaseユーザーは、auth.uidでユーザーを作成したときに得られる控えめなユーザーIDを持つことに注意してください。これは(一般的に)各ユーザーのキーとして使用する必要があります。

+1

こんにちはジェイ、あなたの答えをありがとう。私はあなたのソリューションを試してみたが、それはトリックを行うようだ。しかし、ユーザーがいるチャットのすべてを見つけるために、すべての "チャット/"を見なければならないと考えると、この操作はあまりにも高価になります。 – Nilsymbol

+1

@Nilsymbolうれしい!あなたがメガバイトのデータを引っ張っているようには見えません。いくつかの子供がいる数百のノードだけです。 Firebaseは非常に高速ですので、何千ものノードでこのようなクエリを実行するとすばやくできます。 Firebaseを息切れさせることさえできません。我々はそれをテストしました! – Jay

+0

@ジェイ私はほとんどの部分の構造を理解しているだけで、ユーザーが "チャット"の子どもたちにどのように表現されているのか分かりません。ユーザーの配列ですか?ブールのUIDとの関連をもう少し詳しく説明できますか?本当にありがとう! -Colbey – justColbs