Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 更好的数据库模式_Mysql_Events_Triggers_Schema - Fatal编程技术网

Mysql 更好的数据库模式

Mysql 更好的数据库模式,mysql,events,triggers,schema,Mysql,Events,Triggers,Schema,我有一个应用程序,用户可以在其中锁定某个商品,一旦他锁定了它,他就必须在2小时内取下它。若他在2小时内并没有取回物品,那个么该物品将被解锁,用户将失去1次锁定机会。用户最初有3次锁定机会,如果他在2个月内失去所有3次锁定机会,那么他将被禁止2个月。现在我已经为此准备了一个模式,但我觉得它不是最佳的。模式如下所示 user table --locking_chances_left //initially 3 --first_chance_miss_date

我有一个应用程序,用户可以在其中锁定某个商品,一旦他锁定了它,他就必须在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\u items
表中的任何项是否已被锁定超过2小时,如果它找到任何项,则将其从该表中移除,该表将解锁该项,然后将
users
表中的
locking\u left
减少1。现在我必须跟踪一个用户是否在2个月内失去了所有禁止他的机会。因此,我保留了
first\u chance\u miss\u date
以保留他机会从3减少到2的日期,以及
second\u chance\u miss\u date
以保留他机会从2减少到1的日期。我在
users
表上有一个
after update trigger
,它检查
locking\u chances\u left
的值何时更改,并相应地更新
first\u chance\u miss\u date
second\u chances\u miss\u date
。有没有更好的方法,不使用这两个字段作为
miss dates
,而只使用一个字段。
谢谢你带上这个

我可能会使用一个“user\u missed\u date”表,其中包含user\u id和missed\u date作为字段,你可以这样做

选择用户id,按用户id将(*)计算为用户错过日期中的错过,其中日期>[过去两个月]分组

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


您可能希望在user\u id、missed\u date和missed\u date、user\u id上建立索引,我可能会使用一个“user\u missed\u date”表,将user\u id和missed\u date作为字段,然后您就可以这样做了

选择用户id,按用户id将(*)计算为用户错过日期中的错过,其中日期>[过去两个月]分组

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


您可能需要用户id、missed_date和missed_date、user_id的索引,我不认为这是一个更好的解决方案,但我会把它扔出去:

您可以有一个lock\u事件表,而不是lock\u项。每次项目被锁定时,它都会进入事件表。如果某个项目被拾取,您可以将其删除,也可以添加一个额外的事件,表明该项目已被拾取。如果您选择的项目超过2小时,您将获得过期锁定项目的列表


这样,您就有了系统中所有事件的历史记录。很容易计算出用户离开的机会,也很容易看出用户是否在2个月内耗尽了所有机会。你在这里完成了更多的CPU周期,但是你也得到了站点上所有事务的良好记录

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

您可以有一个lock\u事件表,而不是lock\u项。每次项目被锁定时,它都会进入事件表。如果某个项目被拾取,您可以将其删除,也可以添加一个额外的事件,表明该项目已被拾取。如果您选择的项目超过2小时,您将获得过期锁定项目的列表


这样,您就有了系统中所有事件的历史记录。很容易计算出用户离开的机会,也很容易看出用户是否在2个月内耗尽了所有机会。你在这里完成了更多的CPU周期,但是你也得到了站点上所有事务的良好记录

然后我可以创建一个事件来定期删除2个月前的
user\u missed\u date
表中的行是的,但显然它只需要非常不频繁地运行,比如说一次晚上。然后我可以创建一个事件来定期删除2个月前的
user\u missed\u date
表中的行是的,但很明显,它只需要很少运行,比如说一次晚上。