9

私は SQL のバックグラウンドを持っているので、NoSQL ファイアベース スキーマの設計に問題がありました。私は「WHERE」句を使用して何かを照会できることに慣れていますが、firebase でこれを行うのはより難しいようです (ただし、パフォーマンスは簡単に補います!)。

曲の「トラック」オブジェクトを保存しています。これらのオブジェクトには、次のように、artist_name、トラック タイトル、ジャンル、評価、created_date などのキーと値のペアがあります。

tracks
|_____-JPl1zwOzjqoM8xDTFll
          |____ artist: "Bob"
          |____ title: "so long"
          |____ genre: "pop"
          |____ rating: 52
          |____ created: 1403129692781
|
|_____ -JPv7KnVi8ASQJjRDpvh
          |____ artist: "Mary"
          |____ title: "im alright now"
          |____ genre: "rock"
          |____ rating: 70
          |____ created: 1403129692787

私のサイトのデフォルトの動作は、これらすべてのトラックを一覧表示することで、最新の追加トラックがリストの一番上に表示されます。$priority を作成するように設定し、それを負 (created * -1) にすると、この効果が得られると思います。

しかし、将来的には、次のような他の方法でリストをフィルタリング/クエリできるようにしたいと考えています。

  • ロック、ポップ、またはヒップホップのジャンルを持つすべてのトラックを取得します。

  • レーティングが 80 以上で、過去 7 日間に追加されたすべてのトラックを取得します。

firebaseでこれを達成するにはどうすればよいですか? 私の理解では、データを注文する方法は実際には 2 つしかありません。

  1. 私の場合、トラックを追加すると自動的に選択された「firebaseURL.firebaseio.com/tracks/id」の物理的な場所を持つ「ID」値を介して。詳細をリストする個々のトラック ページのページがあり、私のサイトの URL は "www.mysite.com/tracks/-JPl1zwOzjqoM8xDTFll" のようなものなので、これで問題ありません (と思います)。

  2. $priority を使用することで、私の場合は "created" 値に使用して、リストを適切な日付順に並べることができます。

私が物事を設定している方法を考えると (そして、より良い方法があれば教えてください)、特定のジャンルや特定の評価を簡単に照会できる方法はありますか?

「Denormalizing your Data is Normal」( https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html ) というブログを読みましたが、理解できたと思います。Anant の説明から、私が望むものを達成する 1 つの方法は、次のように、firebase でジャンルの新しいオブジェクトを作成し、そこにすべてのトラックをリストすることです。

tracks
|______ All
        |_____ -JPlB34tJfAJT0rFT0qI
        |_____ -JPlB32222222222T0qI
        |_____ -JPlB34wefwefFT0qI

|______ Rock
        |_____ -JPlB32222222222T0qI
        |_____ -JPlB34tJfAJT0rFT0qI

|______ Pop
        |_____ -JPlB34wefwefFT0qI

ブログの前提は、ハード ドライブの容量は安いということでしたが、ユーザーの時間はそうではありません。したがって、より高速な読み取りが可能になるため、重複データがあっても問題ありません。

それは理にかなっており、私はこの方法を気にしません。ただし、これは、ユーザーが 1 つのジャンルのみからすべてのトラックを選択したい場合にのみ機能します。ロックとポップの両方からすべてのトラックを取得したい場合はどうすればよいでしょうか? Rock&Pop という別のオブジェクトを保存し、誰かがいずれかのジャンルの曲を提出するたびにそこにトラックを保存する必要がありますか?

genre
|_______pop-rock
         |_________ -JPlB34tJfAJT0rFT0qI (a rock song)
         |_________ -JPlB34wefwefFT0qI (a pop song)
         |_________ -JPlB32222222222T0qI (a rock song)

また、trackid を使用して ENTIRE トラック オブジェクトまたは単なる参照を保存する方が理にかなっていますか? たとえば、/genre/pop の下:

Should I store just the reference?
genre
|______ pop
        |______ -JPlB34wefwefFT0qI

Or, Should I store the entire track?
genre
|______ pop
        |______ -JPlB34wefwefFT0qI
                    |___ artist: "bob"
                    |___ title: "hello"
                    |___ genre: pop
                    |___ etc..

2 つの方法にパフォーマンスの違いはありますか? 他の詳細について個々のトラックごとにクエリを実行する必要がないため、後者の方が高速になるのではないかと考えていますが、確認したいだけです。

私は自分のfirebaseスキーマをすでに数回やり直しました。いくつかの改善を行いましたが、アプリケーションが大きくなるにつれて、変更にかかるコストと時間が増えています。コードの残りの部分をもう一度一致させるために多くの時間を費やす前に、これらの質問を最後に解決できればいいのですが..

これについて何か助けてくれてありがとう、それは非常に感謝しています。また、追加情報が必要な場合はお知らせください。

4

2 に答える 2

5

Firebase は、来年にかけてクエリ API に多くの機能を追加します。コンテキスト検索 ( foo はbarのように) は、おそらくリアルタイム データで大ヒットすることはありません。遅くて面倒です。

Firebase の SQL クエリと同等のパターンに関する 2 部構成のブログ記事があります。一読することをお勧めします。特にパート 2 では、Flashlightについて説明します。

ElasticSearch とサービスを使用する理由 リアルタイムのデータ ストレージと同期と同様に、検索は定型文が多く、発見可能な複雑さを伴う複雑なトピックです。SQL で where 句を記述するのは簡単で、それで道が開けますが、すぐにユーザーの期待を裏切ってしまいます。

ES はすぐに Firebase と統合でき (Flashlight サービスはアプリとの統合に 5 分もかかりませんでした。前回私が試みました)、堅牢で完全な検索機能を提供します。

そのため、Firebase がクエリに関する革新的な機能を展開するまでは、別の方法で検索機能を追加しようとするのではなく、最初にこのアプローチを検討することをお勧めします。

于 2014-06-25T20:37:07.127 に答える