1

私のデータベースには約 100,000 のアーティスト/バンドがあります。各バンドのビューを追跡できるようにしたいので、たとえば、Pearl Jam メトリックを表示している場合、2012 年 1 月 1 日に 10,000 回のビューがあり、2012 年 1 月 2 日には12,000 回再生されました ... などなど。

このデータを取得する最善の方法は何ですか? 私はコードのヘルプを探しているのではなく、理論/提案を探しています。

私は次のことを考えていました:

  1. アーティストのヒット表。パール ジャム (または他のアーティスト) が表示されるたびに、新しい行を挿入してこのビューを追跡します (アーティスト ID とタイムスタンプを含めます)。
  2. 過去 24 時間、これらの行に対して毎晩スクリプトを実行します。アーティスト ID でグループ化してカウントします。その特定の日のアーティストごとに、このカウントを新しいテーブルに挿入します。
  3. このヒット テーブルを切り捨てて、信じられないほど大きくならないようにします。
  4. ビューを取得するには、アーティスト ID を選択します。

これは正しい考え方ですか?助言がありますか?

4

1 に答える 1

2

私はオープン ソース分析プラットフォームCountlyの開発者であり、私の経験を皆さんと共有したいと考えています。

ビューごとに新しい行をアーティストに挿入し、それらの結果を毎日 map-reduce することは確かな解決策ですが (これは実際には古い分析ソリューションで使用されてきた解決策です)、選択できるより良いアプローチがあります。ただし、このアプローチでは、 MongoDBと同様にドキュメント指向のデータベースを使用する必要があります。

アーティストへのビューがある場合は、関連するフィールドを次のようにインクリメントします。

db.views.update({'artist_id': 1}, {
    '$inc': {
        "views": 1,
        "2012.views": 1,
        "2012.8.views": 1,
        "2012.8.4.views": 1
    }
})

そして、以下のようにビュー コレクション内のドキュメントを取得します。

{
    "artist_id": 1,
    "2012": {
        "8": {
            "4": {
                "views": 1 /* today */
            },
            "views": 1 /* august */
        },
        "views": 1 /* 2012 */
    },
    "views": 1 /* all time */
}

このソリューションはバッチ処理を必要とせず、実際に真のリアルタイムです。8 月のすべての統計を確認したい場合は、以下のような結果を取得するだけで、8 月のすべての日のデータに加えて、8 月自体の総視聴回数が得られます。

db.views.findOne({"artist_id": 1}, {"2012.8": 1})

または、2012 年の合計ビューだけが必要な場合。

db.views.findOne({"artist_id": 1}, {"2012.views": 1})

LAMP スタックを使用していると仮定して、MongoDB PHP ドライバーを確認できます。

于 2012-08-04T13:37:18.113 に答える