2016-08-07 15 views
2

ブログアプリを作成したいとします。私は次の2つのオプションのどちらかを選ぶべきですか?私はできるだけ多くの "真の単一の情報源"を持つことを望んでいますが、その好みが私のSQLの背景から来ているかどうかはまだ分かりません。Firebase(NoSQL):非正規化とインデックス作成

オプション1(非正規化):

Posts: { 
    post_1: { 
    title: "hello", 
    body: "hi there!", 
    uid: "user_1", 
    comments: { 
     comment_1: { 
     body: "hi I commented", 
     uid: "user_2", 
     }, 
     comment_2: { 
     body: "bye I commented", 
     uid: "user_2", 
     }, 
    } 
    } 
} 

Users: { 
    user_1: { 
    uid: "user_1", 
    post_1: { 
     title: "hello", 
     body: "hi there!", 
     uid: "user_1", 
     comments: { 
     comment_1: { 
      body: "hi I commented", 
      uid: "user_2", 
     }, 
     comment_2: { 
      body: "bye I commented", 
      uid: "user_2", 
     }, 
     } 
    } 
    } 
} 

オプション2(インデックス):

Posts: { 
    post_1: { 
    title: "hello", 
    body: "hi there!", 
    uid: "user_1", 
    authorName: "Richard", 
    comments: { 
     comment_1: true, 
     comment_2: true 
    } 
    } 
} 

Users: { 
    user_1: { 
    uid: "user_1", 
    displayName: "Richard", 
    email: "[email protected]", 
    posts: { 
     post_1: true 
    }, 
    comments: { 
     comment_1: true, 
     comment_2: true 
    } 
    } 
} 

Comments: { 
    comment_1: { 
    body: "hi I commented", 
    uid: "user_1", 
    }, 
    comment_2: { 
    body: "bye I commented", 
    uid: "user_1", 
    }, 
} 

は、私はオプション2

私が見る主な問題好むべきだと思いますオプション1の場合、1つのデータのソースが多すぎます。それぞれの投稿が特定のカテゴリまたはタグに属するようにアプリを拡張したいとします。その後、私はオブジェクトをと/users/uidに加えて/categories/category_idの下に書く必要があります。投稿が更新されたら、postオブジェクトを3つの異なる場所で変更することを忘れないでください。オプション2を使用すると、データのソースが1つしかないため、この問題は発生しません。

何か不足していますか?

参考文献:

  1. Firebase data structure and url
  2. https://firebase.google.com/docs/database/web/structure-data
+0

2番目のオプションが好きなら、なぜNoSQLを使用するのですか? SQLと一緒に行ってください... – obe

+0

私はバックエンドのためにfirebaseを試してみたいです。また、NoSQLでオプション1をオプション2よりも優先させるべきかどうかを知りたい。この(https://firebase.google.com/docs/database/web/structure-data)は、オプション2は優れていると述べていますが、多くの投稿でもオプション1を実行することが推奨されています。 –

+0

免責事項は賢明ではありませんプライマリバックエンドとしてNoSQLを使用する実践的な経験私は昔ながらのかもしれませんが、私は可能な限りデータを正規化した方が好きです。かなりのパフォーマンスやシンプルさの利益を得るには、ルールを曲げて二重性を持たせても大丈夫ですが、複雑なリレーショナルデータの場合、リレーショナルデータベース(おそらくキャッシュ層としてNoSQLを使用する)が最適です。私はあなたの質問に答えていないことを認識していますが、それは答えの代わりにコメントを書いている理由です:) – obe

答えて

-1

そうでなければ、(多くのことができる)すべてのコメントや投稿をダウンロードするには、ユーザーを強制されるため第二の選択肢が優れています。

hereのドキュメントをチェックインできます。

atomic writes across multiple locationsの複製を処理できます。

+0

この回答はこの例では理にかなっていますが、「コメント」や「投稿」のように問題のない例についていくつかのコメントを見たいと思います。スケールされない値に 'indexOn'をセットすることは受け入れられますか? –

+0

答えは間違っていますか? –

関連する問題