2017-10-25 22 views
1

私はiOSアプリケーションを開発中です。そのためには、原料とレシピを含むfirebaseデータベースがあります。想像するのは難しいことではありません。レシピに関連する子成分があり、複数のレシピに成分を含めることができます。私のJSONの構造の一例は以下の通りです:Firebaseに複数の条件を照会してください

{ 
    "ingredients" : { 
    "chicken" : { 
     "meal1" : true, 
     "meal2" : true 
    }, 
    "beef" : { 
     "meal2" : true 
    }, 
    "lamb" : { 
     "meal1" : true, 
     "meal3" : true 
    } 
    }, 
    "meals" : { 
    "meal1" : { 
     "ingredients" : { 
     "chicken" : true, 
     "lamb" : true 
     } 
    }, 
    "meal2" : { 
     "ingredients" : { 
     "chicken" : true, 
     "beef" : true 
    }, 
    "meal3" : { 
     "ingredients" : { 
     "lamb" : true 
    } 
    } 
} 

質問:ユーザーが選択した成分のセットが含まれているレシピの一覧を照会し、レシピの配列に追加するためのベストプラクティスは何ですかオブジェクトを二重のレシピで引っ張っていない?私は少なくとも1つの原料マッチを含むすべてのレシピを探しています。

例:ユーザーが「」と私の例のDBから「牛肉」などのレシピを探している、私はrecipe1とrecipe2を返すことを期待しています。レシピ2にはチキンとビーフの両方が含まれていますので、検索結果に2度表示されることは望ましくありません。

私の最初の考えは、最初のチキンの下ですべての食事を照会し、次に牛肉の下ですべての食事を照会し、次に重複を取り除く何らかの機能を実行することでした。これは理論的に取り除かなければならない複数の重複した食事を生成する可能性があるため、私にとっては良い解決策ではないようです。より良い方法がありますか?

答えて

1

Firebase自体に複数のクエリやチェーンを使用する方法はありません。これにより、アプリケーションの実行速度が遅くなることを防ぎます。 (私たちはそれについて喜んでいるはずです)。

ここで、希望の結果を得るための3つの方法があります。

  1. frontend queries:あなたは、これはおそらく、あなたの目標を達成するための最も簡単な方法であるデータのトンを持って期待していない場合。彼らを使用するために恥ずかしがり屋ではない、彼らはかなり効率的なことができます。

  2. data structure: 2番目の方法は、データベースを再構築することです。私を信じて、想像を絶するほど多くの人々をこのように達成することができます。query chain

  3. この両方の方法を組み合わせてください。場合によっては、返される値の数を減らすための構造体を構築し、その後にフロントエンドクエリを使用して残りの部分を作成することができます。

あなたの場合、あなたはすでに非常に良い構造を持っています。だから、ユーザーがlambchickenを探していて、それらのノードを呼び出して、フロントエンドで何らかのマージを実行できるとします。

しかし、それはもっと速くなる可能性があります。おそらく、あなたのデータを反映させるのが最善の方法でしょう。 chicken-lamb,chicken,lambなどのノードを作成してから直接呼び出すことができます。もちろん、これは多くのデータに終わる可能性がありますが、非常に高速です。

ユーザーがchicken,beefおよびlambを検索したとします。単純に英数字の順序を作成して、ノード:/beef-chicken-lambを取得します。

この方法に従えば、クエリを避けることができます。あなたが本当にパフォーマンスに入っているなら、これはすばらしいやり方です。

+0

ありがとうございました。私は、リストラについての2番目の点に興味があります。私はそれが潜在的に数千のノードとfirebaseの重複を生成することがわかりますが、私はNoSQLに慣れてそのパフォーマンス上の利点を最適化していると思います。 – afcgold

関連する問題