【问题标题】:better schema for a database更好的数据库架构
【发布时间】:2011-07-18 02:29:50
【问题描述】:

我有一个应用程序,用户可以在其中锁定某种商品,一旦他锁定它,他必须在 2 小时内取走它。如果他在 2 小时内没有捡起它,则该物品被解锁并且用户失去 1 次锁定机会。用户最初有 3 次锁定机会,如果他在 2 个月内失去所有 3 次锁定机会,则会被禁止 2 个月。现在我已经为此准备了一个模式,但我觉得它不是最佳的。架构看起来像这样

user table
--locking_chances_left              //initially 3
--first_chance_miss_date            //date on which the user loses its first locking chance
--second_chance_miss_date           //date on which the user loses its second locking chance
--banned                            // boolean field to indicate whether the user is banned

locked_items table
--item_no
--user_id
--locking_time

banned_users table
--user_id
--ban_date                          //date on which the user is banned i.e lost the last chance

现在我有一个计划每分钟运行一次的事件,以查看 locked_items 表中的任何项目是否已锁定超过 2 小时,如果找到任何项目,则将其从该表中删除,从而解锁该项目并然后从users 表中将locking_chances_left 减1。现在我必须跟踪用户是否在 2 个月内失去了禁止他的所有机会。所以我保留了first_chance_miss_date 以保留他的机会从 3 减少到 2 的日期和 second_chance_miss_date 保留他的机会从 2 减少到 1 的日期。我在 users 表上有一个 after update trigger 来检查何时locking_chances_left 的值已更改,它会相应地更新 first_chance_miss_datesecond_chance_miss_date。有没有更好的方法而不使用miss dates 的这两个字段而只使用一个字段。 谢谢你承受这个

【问题讨论】:

    标签: mysql events triggers schema


    【解决方案1】:

    我可能会使用带有 user_id 和missed_date 作为字段的“user_missed_date”表然后您可以这样做

    select user_id, count(*) as misses from user_missed_date where date>[last two months] group by user_id

    或者将其用作子查询的基础。

    您可能希望同时在 user_id、missed_date 和missed_date、user_id 上建立索引

    【讨论】:

    • 然后我可以创建一个事件来定期删除 2 个月大的 user_missed_date 表的行
    • 是的,但显然它只需要非常不频繁地运行,比如晚上一次。
    【解决方案2】:

    我不认为这是一个更好的解决方案,但我会把它扔在那里:

    您可以有一个 lock_events 表,而不是locked_items。每次锁定项目时,它都会进入事件表。如果一个项目被拾取,您可以删除它,或者您可以添加一个额外的事件来说明它被拾取。如果您选择超过 2 小时的项目,您将获得过期锁定项目的列表。

    这样您就可以了解系统中所有事件的历史记录。计算 chance_left 很简单,也很容易查看用户是否在 2 个月内烧毁了所有机会。您最终会在此处执行更多 CPU 周期,但您也会获得网站上所有交易的良好记录!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-16
      • 2010-10-07
      • 2017-12-16
      • 2012-01-22
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多