2017-12-03 21 views
0

私はレビューアプリケーションを構築しています.Firebaseデータベースを構造化して、タイトルやお互いの投稿にユーザーからのレビュー、好き嫌い、コメントを保存するベストプラクティスを理解したかったのです。私はXcodeとSwiftを使用しています。Firebaseのデータ構造ベスト・プラクティス(ユーザーインタラクション用)

  1. Iレビューをすべて格納し、見直しの作家、レビューされているタイトルのIDのタイトルIDノードのユーザーIDのユーザーIDの子を持つ独立したレビューのノードを作るのですか?

  2. タイトルおよびユーザーノード内のタイトルまたはユーザーに関連付けられたレビューをネストしますか?

  3. ユーザーのすべてのレビューを表示するときに、ユーザーのIDを使用してデータベースをクエリしますか?

  4. タイトルのすべてのレビューを表示するには、タイトルのIDを使用してクエリしますか?

働くだろう100の異なる構造があるので、おかげで

答えて

0

は、これは、1つの答えを与えることは非常に困難です。ここではそのcrazynessでは、その点に

movies 
    movie_0 
    title: "Monty Python and the Holy Grail" 
    reviewed_by 
     uid_1: tre 
    reviews 
     review_0: true 

reviews 
    review_0 
    movie_id: "movie_0" 
    uid: "uid_1" 
    review: "Best movie evah" 

users 
    uid_0 
    name: "Tim" 
    reviewed_movies: 
     movie_0: true 
    reviews 
     review_0: true 

を説明するために架橋され、二重の参照構造です、次のことができます。

query movies for which users reviewed it or which reviews 
query reviews for certain users, certain movies and that the actual review was 
query users for names, which movies that user reviewed and what the reviews were 

そこで質問です。あなたは何を問い合せる必要がありますか?

は、それがすべてのユーザーのレビューを言って表示する時が来たとき、私は、ユーザーのIDを使用して データベースを照会しますあなたの#3

を取ることができますか?

私が提示した構造は、すべてのユーザーレビューを取得したい場合は、まったくクエリする必要はありません。あなたは、直接あなたがuidはユーザーのUIDでは全てのレビューをレビューノードを照会でき、ユーザノード

let ref = fbRef.child("users").child("uid_0").child("reviews") 
ref.observe... 

は、あなたがレビューを同様に

を参照して取得するために結果を反復処理することができますことを確認します質問。

私は、これは具体的な答えではない実現が、それは、ガイドにコメントの

EDIT

一つを提供しませんが、特定の質問ので、私はそれをこのように対処しましょうでした。

唯一の目的は、特定の映画のすべてのレビューを見ることだとします。構造を大幅に単純化することができます:

movies 
    movie_0 
    title: "Monty Python and the Holy Grail" 
reviews 
    review_0 
    movie_id: "movie_0" 
    uid: "uid_1" 
    review: "Best movie evah" 
users 
    uid_1 
    name: "Tim" 

次に、movie_0のムービーとムービーIDを知っているとします。レビューとユーザーを取得するには、このようなものが動作します

let reviewsRef = self.ref.child("reviews") 
let query = reviewsRef.queryOrdered(byChild: "movie_id").queryEqual(toValue: "movie_0") 
query.observeSingleEvent(of: .value) { snapshot in 
    for child in snapshot.children { 
     let snap = child as! DataSnapshot 
     let dict = snap.value as! [String: Any] 
     let uid = dict["uid"] as! String 
     let review = dict["review"] as! String 

     let userRef = self.ref.child("users").child(uid) 
     userRef.observeSingleEvent(of: .value, with: { userSnapshot in 
      let userDict = userSnapshot.value as! [String: Any] 
      let userName = userDict["name"] as! String 
      print("\(userName) said \(review)") 
     }) 
    } 
} 
+0

これは素晴らしい応答です。だから基本的に私は特定の映画のすべてのレビューを見たいと思ったら、私はその直接行うことができますか?私は本当の質問はこれだと思います。レビューを保存するための機能コードを実行すると、3つの異なる場所にレビューが保存されるでしょうか?ユーザとムービーIDが子としてある1つのレビューノードとは対照的に、ユーザ、ムービー、レビュー。 – ROKOKO

+0

あなたはある種の教育者ですか?あなたは非常に明確で簡潔です。ノード内にネストされた子にアクセスしてそれらのすべてを反復する前のあなたの応答は非常に役に立ち、私は1トン以上を把握するのに役立ちました。 – ROKOKO

+0

私が理解していないことの1つは、あなたが提示した「真の」値です。 – ROKOKO

関連する問題