2011-02-08 9 views
3

私は、私のウェブサイト上のstackoverflowのような忠実度プログラムを実装したいと思います。PHP/MySQL - フィデリティプログラムの実装

私は、自分のウェブサイトを30日間連続して訪問したユーザーに何らかの報酬を与えたいと考えています。

[MySQL]最適なテーブルアーキテクチャは何ですか?

[PHP]このタスクを最適化するためにどのようなアルゴリズムを使用しますか?

答えて

0

私は、@Matt H.が主張するアプローチよりも、データベースの生データをより好む。自分の時間と日付と一緒にサイトへのすべてのログインを記録したテーブルを作成します(または、あなたが好む場合は、新しいセッションイニシエーション):

CREATE TABLE LoginLog (
    UserId INT NOT NULL REFERENCES Users (UserId), 
    LoginTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP 
) 

CREATE INDEX IX_LoginLog USING BTREE ON LoginLog (UserId ASC, LoginTime DESC) 

ただ、ログイン時にテーブルにユーザーIDを挿入します。私はもちろん、あなたのデータベースについていくつかの仮定をしましたが、私はあなたが適応できると思います。その後

、直前の30日間ごとに個別のログインを確認する:

SELECT COUNT(*) 
FROM (SELECT DATE(log.LoginTime) AS LoginDate, 
       COUNT(*) AS LoginCount 
     FROM  LoginLog log 
     WHERE log.LoginTime >= DATE(DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 30 DAYS)) 
     GROUP BY LoginDate 
     HAVING COUNT(*) > 0) a 

結果が30である場合、あなたは黄金です。

私はしばらく(SQL ServerとPostgreSQLを中心に作業していますが)MySQLに触れていないことを認めますので、構文がちょっと残っていれば謝ります。しかし、そのコンセプトが意味をなさないことを願っています

0

上記の説明から、これはかなり簡単に、1つのテーブルで実行できます。

  • | ID |テーブルPK、自動インクリメント
  • | EMAIL |ウェブサイト訪問者一意のID。外見上は電子メールですが、一意のIDが訪問者のデータであれば何でも構いません。
  • | FIRST_CONSECUTIVE_DAY |タイムスタンプ
  • | LAST_CONSECUTIVE_DAY |タイムスタンプ
  • | HAS_BEEN_REWARDED | bool、デフォルトfalse(

これはテーブル用です。 :)

アルゴリズムは、3つの部分である: 彼らが確認された後、ユーザは、ログインする...

1)は、ユーザーLAST_CONSECUTIVE_DAYを確認してください。 LAST_CONSECUTIVE_DAYが今日の場合は、何もしないでください。 LAST_CONSECUTIVE_DAYが昨日の場合は、LAST_CONSECUTIVE_DAYを今日の日付に設定します。それ以外の場合は、FIRST_CONSECUTIVE_DAYとLAST_CONSECUTIVE_DAYを今日の日付に設定します。

2)DAY部によってLAST_CONSECUTIVE_DAYとFIRST_CONSECUTIVE_DAYを比較するTIMESTAMPDIFFを使用。 30を返した場合は手順3に進み、そうでなければアプリケーションを使用して進みます。

3)あなたのユーザーは毎日30日間連続してウェブサイトを訪れました。おめでとう! HAS_BEEN_REWARDEDをチェックして、以前に行ったことを確認します。まだ間違っている場合は、賞品を与え、HAS_BEEN_REWARDEDをtrueとマークします。