2016-08-26 9 views
2

私は現在、管理者がイメージにタグを付けることができるアプリケーションを作成しています。訪問者はタグを検索し、そのタグを持つ画像を見ることができます。Firebaseでクエリを行うためのデータ構造を設定する

1つのイメージに複数のタグを含めることができます。これは私が現在、私のデータを設定しているかを表し:

Images: { 
    PUSH_ID: { 
     url: "https://cdn.filestackcontent.com/o0ze07FlQjabT9nuteaE", 
     tags: { 
      PUSH_ID: { 
       tag: "1324" 
      }, 
      PUSH_ID: { 
       tag: "4321" 
      } 
     } 
    } 
} 

訪問者がタグを検索すると、私はタグを照会し、指定したタグを持つ画像のURLを見つけることができるようにする必要があります。

ref.orderByChild('tags/tag').equalTo(tag).once("value"...) 
しかし、いくつか読んだ後、私は、あなたがFirebaseで深いだけクエリ1つのレベルにすることができます理解に来ている:私はこの線に沿って何かがうまくいくことを考えていました。

このような場合は、データを再構成する必要がありますが、どのように構成する必要があるかわかりません。

誰でも手伝ってもらえますか?

Btw;私は、Firebaseで検索するためにElasticsearchのようなものを使うべきだと言われていますが、このアプリはトラフィックが限られているイベント用です。

ありがとうございます!

答えて

3

Firebase(およびほとんどのNoSQLデータベース)でデータをモデリングするときに、アプリケーションでの使用方法をモデル化する必要があります。

は、たとえば:ユーザーが見ているときにそれらを表示できるように、私はまだ、各画像のタグを保存

  1. Images: { 
        PUSH_ID_1: { 
         url: "https://cdn.filestackcontent.com/o0ze07FlQjabT9nuteaE", 
         tags: { 
          "tag1324": true, 
          "tag4321": true 
         } 
        }, 
        PUSH_ID_2: { 
         url: "https://cdn.filestackcontent.com/shjkds7e1ydhiu", 
         tags: { 
          "tag1324": true, 
          "tag5678": true 
         } 
        } 
    }, 
    TagsToImages: { 
        "tag1324": { 
         PUSH_ID_1: true, 
         PUSH_ID_2: true 
        }, 
        "tag4321": { 
         PUSH_ID_1: true 
        } 
        "tag5678": { 
         PUSH_ID_2: true 
        } 
    } 
    

    私はあなたのモデルからいくつかのことを変更しました単一画像

  2. しかし、今度はタグを"tag1234": true形式で保存します。これにより、画像に同じタグが何度もタグ付けされることはありません。 contains()オペレーションを実行する配列が必要だと感じるときは、このアプローチを使用することをお勧めします。これは、セットに似ています。
  3. タグ番号の前に静的な文字列を付けると、Firebaseがタグ番号を配列のインデックスとして解釈しないようにします。
  4. タグ・イメージIDのマップも保存するようになりました。このマップでは、特定のタグのすべての画像IDを簡単に検索し、ループ内で画像を読み込むことができます。

私たちは基本的に2つの方法で情報を見ることができるように、いくつかのデータを複製しました(タグは2回保存されています)。より多くの方法でデータにアクセスしたい場合は、さらに複製する必要があります。これはNoSQLデータベースでは正常であり、拡張性が高い理由の一部です。

この記事はNoSQL data modelingで読むことを強くお勧めします。

+0

これは本当に良い答えです。フランクに感謝します。画像にタグを表示する場合は、「タグ」接頭辞のクライアント側を削除するだけです。そうですか? –

+0

また、私は画像を削除したいと言っています。私はまた関連するイメージタグを削除したいと思う。自分のイメージIDを持つすべてのタグを見つけるために、 "TagsToImages"オブジェクトで実行するクエリは何ですか? –

+0

確かに:クライアントでは、値を元に戻すだけです。ここでFirebaseクライアントの気まぐれな動作に取り掛かりつつあります。タグを使ってすべての画像を取得するには 'ref.child( 'TagsToImages')。子( 'tag' + tag_id ')。on(' child_added '...') –

2

このような構造のタグノードがありますか?

Tags: { 
 
    "tag1324": { 
 
     tagName: pets  
 
    }, 
 
    "tag4321": { 
 
     tagName: daffodil 
 
    } 
 
    "tag5678": { 
 
     tagName: tasmanian wolf 
 
    }

関連する問題