1

SOと同様に、評判ポイントテーブルをクリーンアップするための効率的な自動タスクを設計するのに苦労しています。

ユーザーが記事を読んだり、記事にコメントしたり、記事を共有したりすると、メンバーに評判ポイントが与えられます。たとえば、メンバーがこれら 3 つすべてを行う場合、その DB テーブルには 3 つの個別の行が存在します。メンバーのポイントを表示するときは、単純に SUM クエリを使用して、そのメンバーのすべてのポイントをカウントします。

現在、100 万人のアクティブなメンバーがいて、評判が高く、私のテーブルには非常に多くの行があり、どうにかしてそれらをクリーンアップしたいと考えています。Cron ジョブを使用して、3 か月以上経過した各メンバーのすべての評価行を 1 つの行にマージしたいと考えています。例えば:

  user     |  repTask                      |  repPoints   |  repDate
-----------+-------------------------------+--------------+-----------------------
  10001    +  Commented on article         |  5           |  2012-11-12 08:40:32
  10001    +  Read an article              |  2           |  2012-06-12 12:32:01
  10001    +  Shared an article            |  10          |  2012-06-04 17:39:44
  10001    +  Read an article              |  2           |  2012-05-19 01:04:11

次のようになります。

  user     |  repTask                      |  repPoints   |  repDate
-----------+-------------------------------+--------------+-----------------------
  10001    +  Commented on article         |  5           |  2012-11-12 08:40:32
  10001    +  (merged points)              |  14          |  Now()

または (合併月):

  user     |  repTask                      |  repPoints   |  repDate
-----------+-------------------------------+--------------+-----------------------
  10001    +  Commented on article         |  5           |  2012-11-12 08:40:32
  10001    +  (Merged for 06/2012)         |  12          |  Now()
  10001    +  (Merged for 05/2012)         |  2           |  Now()

3 か月以降のものはすべて正当と見なされますが、それ以前のものは不正行為の場合に取り消す必要がある可能性があるため、3 か月と述べる理由があります。

まず、これでよろしいでしょうか?私は回避しようとしています。たとえば、3 年後には数億行になることを避けようとしています。ポイントをマージするのが得策でない場合、データを入力時に保存するより良い方法はありますか。明らかに、すでに入力されているものを変更することはできませんが、将来のためにそれを改善することはできます.

これが良いアイデアである場合、データを変更するための効率的なクエリを考え出すのに苦労しています。私は正確なコードを探しているわけではありませんが、ユーザーごとに 3 か月以上前のすべてのポイントをマージする、または 3 か月以上前のすべてのポイントをユーザーごとに別々の月にマージできる適切なクエリを誰かが説明するのを助けることができれば、非常に役に立ちます。

4

1 に答える 1

2

cron ジョブを使用してそのようにすることもできますが、これはどうでしょうか。ポイントが追加されるたびに users テーブルの列が更新され、ポイントが取り消されるたびに列が減算されるように、トリガーまたはプロシージャを作成します?totaltotal

このようにすると、ポイント テーブルに何百万または何十億もの行があったとしても、合計ポイントの結果を取得するためにそれらをクエリする必要はありません。月または年ごとに個別の列を作成することもできます。また、行を削除していないため、必要に応じて、たとえば 1 年前にさかのぼってポイントを取り消すことができます。

于 2012-11-12T09:07:46.707 に答える