2012-02-16 17 views
-1

はこれで私を助けてください:ポイントシステム値幅制限

シナリオ:システムを構築 (バックエンド:Mysqlの、スクリプトのla​​ng:Javascriptを/ PHP) ユーザーはいくつかのポイントを獲得するために、いくつかのアクションを実行します。 1アクション= 1ポイントとしましょう。

私の問題:今では、1日に最大5ポイントを得るようにユーザーを制限したいと考えています。 24時間間隔の平均値は、何回でも何度でも実行できますが、「5」に達した時点でポイント増分が上になります。

効率的な方法を提案してください。私のDBは最小限であり、ユーザーの詳細、ポイントしか持っていません。

タイムスタンプ列を追加する必要があります。問題はありませんが、問題はどうすれば時間を更新するかを選択することができます。非常に混乱しています:(

答えて

1

これを達成する方法の1つは、合計ポイント、特定の日のポイント、最後のポイント更新のタイムスタンプを追跡することです。ロジックは次のようになります。

if the action is performed, which may cause a point award 
    if last_point_timestamp < today then 
     increment total points 
     set today's points to 1 
     set last_point_timestamp to current date/time 
    elseif today's points below 5 
     increment total points 
     increment today's points 
     set last_point_timestamp to current date/time 
    else 
     maximum number of points for today is reached - no more points 
    end if 
end if 

基本的に、任意の暦日に5ポイントを超えることはできません。あなたのシステムが複数のタイムゾーンから使用される場合でも、 "今日"とは異なる人物を意味するため、注意する必要があります。例えば、それはロンドンの火曜日の午前2時(つまり、日が変わる)かもしれないが、それはサンフランシスコでまだ月曜日の午後6時です(つまり、日が変更されていない)

0

これが最も効率的な方法であるかどうかわかりませんが、その日に獲得したポイント数を追跡​​する各ユーザーのデータベースにフィールドを持つことができます。

次に、指定された時間にすべてのユーザーに対して0にリセットされるcronジョブなどを作成できます(例:深夜など)

+0

はいそれは私がやってますが、これは余分な不要バードンように感じているためにcronジョブを実行していると考えまさにそれだトリガーを作成するために完全なクエリです。もっと簡単な方法があるはずです。多くのウェブサイトでは、事前定義された数の失敗したリクエストの後にいつかログインフォームがブロックされるシステムを実装しています。私は同じ種類の論理がここで私の目的に役立つと信じています。 –

+0

Hm ...まあ、別の方法はあなたのタイムスタンプとあなたのデータベースのポイントカウンターを持っているだろうと思います。たとえば、深夜にリセットする場合は、コードが新しい日になっているかどうかを確認することができます。その時点で、カウンタを新たにインクリメントする前にそのカウンタを自動的にリセットします。 – MysticXG

0

はテーブルが4つのフィールドを持つポイントと呼ばれる持っている: ユーザー をポイントを追加するには todays_points last_point

ポイント:

SELECT * FROM points WHERE 'user' == $user" 

if(last_point < older than today) 
    resetPoints($user); 
    addPoint($user); 

elseif(todays_points < 5) 
    addPoint($user) 



function resetPoints($user) 
    UPDATE todays_points to zero; 

function addPoint($user) 
    ADD one to total points 
    ADD one to todays points 
    UPDATE last_point to current times 
0

私は個人的にこれと類似の限界を追跡するためのトリガとしかしMysticXGするだろう。私がcronジョブを使用する理由は、ポイントのリセットを一元管理し、毎日 "UPDATE users SET limit = 5"を実行するだけで簡単に処理できるデータベースに負担をかけないことです。この例では、私は

user  INT UNSIGNED AI PK 
points  INT UNSIGNED 
dailyLimit TINYINT UNSIGNED DEFAULT 5 

IF NEW.points > OLD.points THEN 
    IF NEW.points - OLD.points > OLD.dailyLimit THEN 
    SET NEW.points = OLD.points + OLD.dailyLimit; 
    END IF; 
    SET NEW.dailyLimit = OLD.dailyLimit + OLD.points - NEW.points; 
END IF 

これは、ユーザーがポイントの増加ならば、それはアップによって増加することを意味し、私は次のロジックでアップデートする前に発射するトリガーを追加フィールドを持つテーブルを作成しましたその日に残っているポイント数に加算します。彼らが限界を越えた場合、残っているポイントの数が増えるにつれて消滅する。ポイントが減少した場合、その制限は影響を受けません(これが望ましいかどうかは不明です)

制限をリセットするには、毎日この設定を実行するスクリプトを実行する必要があります。

UPDATE users SET dailyLimit = 5 

ちょうどFYIここ

CREATE TRIGGER `checkLimit` BEFORE UPDATE ON `points` FOR EACH ROW 
IF NEW.points > OLD.points THEN 
    IF NEW.points - OLD.points > OLD.dailyLimit THEN 
    SET NEW.points = OLD.points + OLD.dailyLimit; 
    END IF; 
    SET NEW.dailyLimit = OLD.dailyLimit + OLD.points - NEW.points; 
END IF;