数据库设计,用于存储几种奖励类型的用户成就/分数

时间:2018-11-17 21:49:33

标签: database database-design relational-database

背景

-我正在研究一个允许企业创建几种类型的预定义奖励的系统,例如:

  • 基于用户访问量的奖励
  • 根据所花费的现金奖励。

-每种奖励类型都有其自己的进度指示器:

  • 访问奖励:访问次数
  • 现金奖励:现金金额

-对于每种类型的奖励,系统必须跟踪并记录每个用户的进度

-当用户达到奖励目标并兑现时,应重置奖励类型的分数。

实现此功能的最佳数据库设计是什么?请记住,该设计应着眼于可扩展性,以便将来包含多种奖励类型。

1 个答案:

答案 0 :(得分:0)

如果您希望它具有可扩展性,则应仅基于userId-rewardId组合存储单个值:

CREATE TABLE reward_progress (
    user_id int NOT NULL, -- reference to the user
    reward_id int NOT NULL, -- reference to the reward (or code if you choose)
    val int NOT NULL DEFAULT 0, -- value is tracked here
    date_achieved timestamp -- when reward conditions were met. NULL if not yet.
);

ALTER TABLE reward_progress
    ADD CONSTRAINT reward_progress_pkey
        PRIMARY KEY (user_id, reward_id); -- order is important here

这里的顺序很重要,因为您将仅按user_id(“为给定用户提供所有进度行”)或按user_idreward_id(“进度”给定区域中给定用户的数量”)。