2017-11-16 6 views
2

私は単純な概念だと思ったことを頭の中に入れようとしています。Firebase User photoURLとdisplayName

私はユーザーにサインアップするアプリを持っており、そのユーザーはFirebase Authシステムの「ユーザー」情報に「フォトURL」を設定することができます。これは機能します。ユーザーが自分のアプリに投稿を作成すると、作成者のタイトル、画像、 「photoURL」を表示します。

現在、私は記事を保存します。

-Post { 
-id 
-title 
-image 
-photoURL <- from current logged in user } 

私はまた、ユーザーは、ルーティングを経由してポスターのページを訪問することができ/ポスター/「のdisplayName」

ので、後に、ユーザーは次のように自分のプロファイル情報を更新しますdisplayNameまたはphotoURL、私はすべての投稿、コメント、メッセージ、返信、およびこのユーザーがレコードを持っている他の場所を見つけて、photoURLを更新する必要がありますか?

私は私が行うことができるだろうと思ったことは言うされています(擬似コード)

get all posts => 
foreach(post) 
    post = { 
      title: post.title.val() 
      image: post.image.val() 
      avatar: firebase.database().ref().child('users' + post.key) 
      } 

私が読んですべてが私は自分の "ユーザーの表にそのphotoURLを保存する必要があると述べています。私がそれを行うならば、変更があるたびにそれを行うサーバー呼び出しを書き込まない限り、どのポストも更新されません。問題は、ユーザーが100,000人で、そのうちの10%がフォトURLを変更した場合、ユーザーごとに投稿、コメント、返信、およびメッセージを変更する必要があるということです。平均的なユーザーが100件の投稿、4000件のコメント、6000件の回答を持っている場合、更新する必要のある約10Kのユーザー* 10Kのユーザーが見えます。平均サーバーコールが137ミリ秒の場合は、約175ドルです(costs

もう1つの方法は、2つのテーブルから情報を取得し、毎回新しいオブジェクトを作成することです。これにより、サーバーの呼び出しと時間が約2倍になり、コストが倍増します。

これは最適なアプローチですか?ユーザーの写真と表示名を取得するほうがずっと簡単だと思いました。

叙事詩の長いポストに申し訳ありませんが、私は学びたいと思っています。皆さんありがとう!

+0

はい私は文字列を更新していますが、私はそれを何度もやっています。関数では1トン、サーバ時間では1ミリ秒かかるだろうか? – DKinnison

答えて

3

説明しているのは、noSQLデータベースを操作する際の典型的な問題です。一方で、データの複製により、アプリとそのクエリがより高速に実行されます。一方、その重複したデータを変更したい場合は、すべての出現箇所を見つけて置き換えるのが問題になります。

何をすべきかを判断するための最良の方法はありません。それはあなたの特定の事件に完全に依存します。極端な量のデータが重複して更新される可能性がある場合は、更新するのではなく、毎回ユーザーレコードを照会する方がよいでしょう。しかし、やはり、最終的にはあなた次第です。

+0

私の基本的な理解は、私が100Kのユーザーを抱えていて、月に10回の訪問をしていると、私は1Mのビューにあります。彼らが投稿をプルアップするたびに参加し、平均的なユーザーが異なるアバターを持つ210個のオブジェクトを見ると、私は約210Mコールを見ています。約7,286msで370ドルになります。しかし、私は実際に約半分の金額でそれを行い、お金の約半分を節約します。これらのオプションはいずれかの極端に見えます。私はこれについて間違っていますか? – DKinnison

+0

もう1つの考慮すべき点は、何らかの形のクライアントサイドキャッシングを使用して、場合によってはそのクエリを繰り返す必要がないということです。Realtime Databaseは、読み込んだすべてのものに対して永続性を提供します。また、遭遇したユーザーのためにシンプルなキャッシュを実装することもできます。 –

関連する問題