質問

スタックオーバーフローに似たプログラムでポイントシステムを作成しようとしています。つまり、ユーザーが何らかの善行(アクティビティ)を行うと、ポイントが増加します。これをdbスキーマ+ロジックの観点から実装する最善の方法は何だろうと思っています。

3つのオプションが考えられます:

  1. ユーザーテーブルにポイントと呼ばれる追加のフィールドを追加し、ユーザーが何かをするたびにそのフィールドに追加します(ただし、これは並べ替えのアクティビティを表示できません)
  2. ユーザーが善行を行うたびに実行される関数を作成し、値をゼロから計算してポイントフィールドを更新します
  3. ポイントフィールドのない関数を使用して、毎回計算します。

これについて最善の方法は何ですか?お時間をいただきありがとうございます。

役に立ちましたか?

解決

個人的には、2番目のオプションを使用してこの問題に対処します。

最初のオプションは機能を制限するため、すぐに削除します。

3番目のオプションはパフォーマンスの点で非効率です-その数を取得する可能性が高いですたくさん、そしてあなたのプログラムがstackoverflowのようなものであれば、おそらくその数を表示(計算)しますページビュー/アクションごとに何度も。

私にとって、2番目のオプションはまともなハイブリッドソリューションです。通常、システムにデータが重複しているのは嫌いです(どちらかではなくアクションとポイント)が、この場合、整数フィールドはユーザーごとにかなり少ないスペースです不必要に値を再計算するのに多くの時間

データストレージスペースをパフォーマンスと引き換えにするか、またはその逆を行うことが必要な場合があります。#2はアプリケーションにとって大きなメリットとなるトレードオフだと思います。

他のヒント

これは、予想される計算の数に大きく依存します。実際、SOでは、パフォーマンス上の理由から、1)のアプローチに似た方法を使用しているようです。

これにより、要素が変更された場合(ポイントを獲得したアイテムの削除や、コミュニティWikiになるSOの返信、ポイントルールの変更、SOでの別のアカウントへの参加などの外部アクションなど)の数値のジャンプも防止されます)

再計算ソリューション(2)が必要な場合は、「スマート」を実装できます。ポイントの変更が行われるたびに値をクリア(「ダーティ」を意味するNULLに設定)してキャッシュし、それ以外の場合はキャッシュを使用して、NULLの場合に再計算します。また、1時間、1日、または最初に考えたものが何であれ、値をクリアして、特定の時間後に再計算が強制的に行われるようにすることもできます。状態。

1と2に進みます(1分ごとにcronで実行します)。

そのため: -追加のフィールドは、ポイントの量に対するキャッシュとして機能します。 -ポイントを計算する関数は、すべてのユーザーのポイントを一度に再計算して速度を上げる単一のSQLクエリにすることができます。

ポイントを受け取るたびにフィールドを再計算すると、やり過ぎになると思います。

個人的には、最初のオプションを選択し、「アクション」を追加します。アクティビティ履歴を追跡するための表。

ユーザーが何か良いことをすると、「アクション」にエントリが表示されます。テーブル、アクションといくつかのポイント値。ポイント値は、別のテーブルまたはいくつかの設定ファイルから取得できます。同じ値がユーザーレコードに追加されます。

いつでもアクションを合計してユーザーの合計を取得できますが、パフォーマンスのために、アクションレコードを追加するときに更新するだけで十分です。

ポイントシステムはどのくらいシンプルになりますか? すべてのユーザーで毎日/毎週/毎月のアクティビティを追跡できるように、何らかのログ/ジャーナリングが良いと考えています

http://code.google.com/p/userinfuser/ <をご覧ください。 / p>

オープンソースであり、アプリケーションにポイントとバッジを追加できます。 Java、Python、PHP、およびRubyバインディングがあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top