連續簽到獎勵 資料庫如何設計?

用戶連續簽到7天 7天均有不同的獎勵 如果有中間則會從第一天重新開始簽到 7天一個周期完成後恢復到第一天開始重新簽到

考慮到用戶數大概在200W,資料庫如何設計更加合理?


更新:

-- 表結構
簽到表(用戶ID, 最近簽到日期, 連續簽到天數)

-- 用戶簽到時:
UPDATE
簽到表
SET
連續簽到天數 = CASE 最近簽到日期
WHEN Today THEN 連續簽到天數
WHEN Today - 1 THEN (連續簽到天數 + 1) MOD 8
ELSE 1
END,
最近簽到日期 = Today
WHERE
用戶ID = 用戶ID;

-- 查詢用戶連續簽到天數
SELECT
CASE
WHEN 最近簽到日期 &>= Today - 1 THEN 連續簽到天數
ELSE 0
END AS 連續簽到天數
FROM
簽到表
WHERE
用戶ID = 用戶ID;

-----------------------------------------------------------------------------------------------------------

原答案:

簽到表(用戶ID, 最近簽到日期, 連續簽到天數)

當用戶簽到時,

UPDATE
簽到表
SET
連續簽到天數 =
CASE WHEN 最近簽到日期 = Today - 1 THEN (連續簽到天數 + 1) MOD 7
ELSE 0 END
WHERE
用戶ID = 用戶ID;

UPDATE 簽到表 SET 最近簽到日期 = Today;



1,連續簽到

 用戶點擊簽到記錄一次CheckTimes_YYMMDD

 記錄CheckTimes_Last_YYMMDD

 然後記錄一次 CheckLog

 用戶進行簽到行為的時候:

   對比CheckTimes以及CheckTimes_Last

  當YYMMDD_Last - YYMMDD 中 YYMM相同 且 DD=0 :請勿重複簽到

  當YYMMDD_Last - YYMMDD 中 YYMM相同 且 DD=1 :CheckLog+1

  當YYMMDD_Last - YYMMDD 中 YYMM相同 且 DD&>1 :CheckLOG=0

 用來記錄連續簽到的次數。

2,單位時間可重複操作限制

 同理可進行使用的地方是用戶單位時間內可執行操作次數限制。

 用戶執行動作時進行記錄:CheckTimes_STAR_YYMMDD

 用戶執行後續執行動作操作:CheckTimes_YYMMDD

 記錄CheckLog

 用戶每次執行操作的時候,進行對比CheckTime_STAR。

 既:用戶在20150601141430 執行操作記錄為 STAR;

 1) 第二次執行時間為  20150601141630, CheckLog=2

 2)第三次執行時間為  20150601141730,CheckLog=3

  3)CheckLog 大於預設值,反饋您的操作過於頻繁。

  4)第四次執行時間為 20150616000,大於操作間隔。

  5)重置CheckStar=2015071600,CheckLog=1


用一個整型欄位表示簽到欄位 1 2 4 8 16...分別代表周一到周日 的值。如果欄位等於3,剛表示周一周二都簽到了。


id sessionid session_name time status


推薦閱讀:

怎麼樣從 web 開發人員轉成 DBA ?
數據量很大,邏輯不能在內存里做怎麼辦?
高並發insert ignore是選擇innodb還是myisam?
innodb的意向鎖有什麼作用?
如果從頭開始,如何少走彎路成為合格的DBA?

TAG:資料庫 | SQL | MySQL | 資料庫設計 |