0

ユーザーが Web サイトでどの記事を読んだかを追跡したい。

次に、そのデータを使用して、次のことを知ることができます。

1) - 過去 1 時間/日/週/月に読まれた上位 N の記事

2) - 推奨事項を表示する (「これを読んだユーザーは、それも読んだ」)

3) - (1) と同じですが、サイトの特定のセクション用です

サイトのトラフィックが多いため (> 1M ビュー/日)、これに RDBMS を使用することはできません。

私はNoSQL(特にcassandra)を見始めましたが、それは私にとってまったく新しいものなので、それが必要かどうかわかりません。

私は、このようなことを必要とする最初の人ではないと確信していますが、このようなことを行う方法についてのポインタを提供するリンク/記事を見つけることができませんでした. NoSQL は最善のアプローチですか? データモデルに関するヒントはありますか?

ありがとう。

4

2 に答える 2

0

うーん、 easyrecにはまさに必要な機能があり、1M アクションを管理できます (mysql を使用します) 最大アクションに関するフォーラム スレッドをチェックしてください:フォーラム トピック

于 2011-10-12T12:48:21.637 に答える
0

SQL はこれを非常にうまく処理します。1 日 100 万回のビューは、1 秒あたりわずか 10 回です。ほとんどのデータベースは数百を簡単に実行できます。

Articles 用のテーブルと Users 用のテーブルが既にあるはずです。ユーザーと記事の間の多対多の関係であり、おそらくタイムスタンプであるテーブル Read を作成する必要があります。記事を配信するたびに、「ユーザー x は記事 y を読んだ」というエントリを Read テーブルに追加します。

次に、「記事 y は過去 1 週間に何回読まれましたか」、「平均的な読者は木曜日に何記事を見ますか」などの質問をすることができます。

速度を上げるために、この情報の一部を前処理し、選択的な非正規化を行うことも役立つ場合があります。たとえば、記事ごとに読まれた回数をカウントします。

編集:

http://nosql.mypopescu.com/post/1016320617/mongodb-is-web-scaleを参照したくなります。「NoSQL」であっても、必要な作業量が減ったり、魔法のように高速になったりするわけではありません (ただし、多くの場合、問題を好きな形で表現できれば、より多くのハードウェアを投入するのが簡単になります)。

「これを読んだユーザーは次の記事も読んでいます:」

SELECT
  Article.id, OtherArticle.id as oid, COUNT(*) AS cnt
FROM
  Article
  JOIN Read AS R1 ON Article.id=R1.article_id
  JOIN Read AS R2 ON R1.user_id=R2.user_id AND NOT R1.article_id=R2.article_id
  JOIN Article AS OtherArticle on R2.article_id=OtherArticle.id
GROUP BY
  OtherArticle.id, OtherArticle.title
ORDER BY
  cnt DESC, OtherArticle.title ASC

これを実行するのにかかる時間を必ず確認してください。おそらく、すぐに使用できるように結果を参照テーブルとして保持し、数時間ごとにバックグラウンド プロセスで更新します。

于 2011-01-02T01:16:21.327 に答える