2

概要

一部のタグは事前定義され、一部はユーザーが定義することiOSで人々が検索できるアプリがあります。tags

tagsユーザーが検索したいことを書くと、それらで利用可能な結果の数を示す行を表示したいと思いますtags(検索画像の例を参照)。

注: #Exercise or #Routine are parenttagは、その人が常にそれらのいずれかを最初に使用することを意味します。

私はサーバー側を使用PHPしています。MongoDB私は、すべてのクライアントがそれを取得してリソース消費を最小限に抑えることができるように、1 時間ごとにタグ数を含むファイルを作成することを考えました。

操作された情報がtagsユーザーによって制御されることを考えると、リストは時間の経過とともに大幅に拡大します。

チャレンジ

  • そのようなリストを作成、操作、および保存するためのパフォーマンスとオーバーヘッドを考慮すると、何が最善のアプローチであるかに戸惑っています。

私の最初のアイデア2d arrayは、すべての値を保存する (写真を参照)を作成することでした。これは、MongoDB に格納できるように JSON に変換されます。

しかし、このアプローチでは、すべてのタグを取得してメモリにロードし、+1 または -1 を実行する必要があります。したがって、私はそれが最善かもしれないとは思わない。

すべての操作は、各要素の挿入、更新、および削除で行われます。したがって、かなりのRAMオーバーヘッドが発生します。

私の 2 番目のアイデアdocumentは、使用済みのものをすべて保存する場所を作成し、tags1 時間ごとにカウント クエリを実行して、クライアントが使用するリストを生成することでした。

これは、削除、更新、および挿入のたびに、タグがこれdocumentに存在することを確認し、条件に応じて作成または削除するか、何もしないことを意味します。

1 時間ごとにすべてのタグを取得し、すべてのタグの組み合わせを含む配列を生成します。すべてのタグの組み合わせに対して DB をクエリし、返された結果の数をカウントしてファイルを作成します。

MongoDBこのアプローチは、私が使用していて使用していないことを考えると、より良いものになる可能性があると思いますMySQL。しかし、私はまだそのパフォーマンスについて確信が持てません。

誰かが同様のシステムを作成し、より良いアプローチについてアドバイスできますか?

例 検索の画像

2次元配列

4

3 に答える 3

0

質問が長いので、質問を数回読んだ後に行ったいくつかの仮定をリストします。

  1. n個のタグを入力して検索できます。
  2. タグは事前定義またはユーザー定義です。
  3. タグは時間の経過とともに大幅に増加します。
  4. 特定のタグ セットの合計ドキュメント数が必要です。#tag1 が 10 個で #tag2 が 13 個の場合、およそ 23 個のドキュメントがあります (両方のタグを持つものもあると考えてください)。

アプローチについていくつかの推奨事項があります。

  1. あなたはすでにこのように考え始めていますが、読み取りと書き込みを分離することを計画しています。誰かがドキュメントに#chestのタグを付けた場合は、すぐにそれを書いてください。(これは、1 時間ごとに実行されるジョブに戻ります。)

  2. ドキュメントにタグを付けたユーザーにすぐにフィードバックを与えることができます。YouTubeがこれを行っていることを読みました。YouTube で気に入ったものがあり、書き込みがコミットされていなくても、すぐに数値が増加します。アイデアは、たとえそれが完全に正確でなくても、すぐにユーザーに何かを与えるということです。

  3. (2) に基づいて、数値が「十分」である必要があると考えてください。#chest#routineを検索すると、 100 件の結果が返されるとしましょう。代わりに 98 または 99 を自由に表示してください。球場内です。つまり、ユーザーが結果の数を把握できる限り、+1 と -1 をすぐに説明しなくてもかまいません。

  4. Mongo からデータを移動するジョブを実行することを検討してください。Mongo のコレクションに出力する map/reduce クエリを Mongo で実行することができます。次に、これを Redis のようなものに入れてデータを提供できます。または、Mongo で保持できると思います。

  5. 考えられるすべての組み合わせを作成するかどうかはわかりません。特に人々が独自のタグを作成できる場合はなおさらです。代わりに、検索語とカウントを含む単純なデータ構造を作成するだけです。["#胸", 100], ["#ルーチン", 543], ["#上腕三頭筋", 12], ...

  6. ドキュメントに複数のタグがある場合は、2 回カウントすることに注意してください。それは本当ですが、私はそれをそのままにしておくことを単純化することを主張します. カウントの精度を多少犠牲にしても構わない場合は、コードの保守とパフォーマンスが向上します。

于 2013-09-06T17:58:06.710 に答える