Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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
Database 我应该使用什么作为此表的主键?_Database_Database Design - Fatal编程技术网

Database 我应该使用什么作为此表的主键?

Database 我应该使用什么作为此表的主键?,database,database-design,Database,Database Design,我正在为一个网站构建一个小的论坛组件,其中子论坛有不同的管理员和mod负责它们,用户可以被禁止进入各个子论坛。我的ban表如下所示: _Bantable_ user_id group_id start_date end_date banned_by comment 起初我打算使用前四列作为主键,但现在我想知道如果我使用一列是否重要,因为没有人会在同一时间被禁止进入同一论坛,不管怎样,我仍然必须检查他们是否已经被禁止以及在什么时间间隔内被禁止。我是否应该在这里不使用键,只需在用户id

我正在为一个网站构建一个小的论坛组件,其中子论坛有不同的管理员和mod负责它们,用户可以被禁止进入各个子论坛。我的ban表如下所示:

_Bantable_ 
user_id 
group_id
start_date 
end_date 
banned_by 
comment 

起初我打算使用前四列作为主键,但现在我想知道如果我使用一列是否重要,因为没有人会在同一时间被禁止进入同一论坛,不管怎样,我仍然必须检查他们是否已经被禁止以及在什么时间间隔内被禁止。我是否应该在这里不使用键,只需在用户id上创建一个索引,并在需要时对其进行分组和搜索?

为什么不将
用户id
作为主键?我的意思是,您甚至不必使用
自动增量
(这显然在这里没有任何意义)


猜测您会在登录时请求
用户id
,这可能会提供最好的性能,以查看是否有禁止事项的条目。

这不是100%清楚,但听起来您希望针对特定的
组id
在每个用户的基础上临时禁止功能。如果是这种情况,则应创建复合主键:

user_id,
group_id,
end_date
这会让你做的

SELECT * FROM bantable WHERE user_id=$currentUserToCheck AND group_id=$currentGroupToCheck AND end_date < $currentDate
从bantable中选择*,其中用户id=$currentUserToCheck和组id=$currentGroupToCheck和结束日期<$currentDate
或者类似的

注意:如果您希望主键在您所遵循的数据库设计原则方面保持一致,那么您可以将主键设置为
用户id
(因为它确实是一个唯一标识符),然后在我上面指定的三列上创建一个复合索引


绝对确保针对该表运行的任何需要单独索引的查询都正确生成了这些索引。

是否需要过去禁令的历史记录

  • 如果没有,就在
    {user\u id,group\u id}
    上创建一个复合PK。
    \u Bantable\u
    中当前存在的任何数据都决定了当前被禁止的用户。当BAN过期时,只需删除相应的行(并考虑是否需要<代码> EngDeals< /Calp> ALL1)。

  • 如果您确实需要历史记录,请像以前一样将活动的ban放入原始表中,但当ban过期时,不要将其删除,而是将其移动到一个单独的“历史”表中,该表将具有独立于
    {user\u id,group\u id}
    的代理PK2(因此相同的用户/组对可以位于多行中)以及防止时间重叠的触发器(类似于)


1如果这是禁令结束的日期,那么你确实需要它。如果这是禁令结束的日期,那么你就不知道了——到那时争吵就会过去了


2或者,在
{user\u id,group\u id,start\u date}

上进行PK,如果有多个禁止条目,该怎么办?我决定创建一个“违规”表,其中一定数量的违规(默认为3)将禁止一个用户,并且该禁令将是临时的(默认为一周)。导致禁令的第n个违规行为将记录禁令的历史记录(可能在注释列中),禁令本身将在到期时从ban表中删除。但是有没有办法自动从表中删除禁令?或者我应该创建一个线程,定期检查过期的ban记录吗?@RoryBreaker是的,你可以定期这样做。或者,只要在检查给定用户是否被禁止时检查禁令是否过期(如果过期,则将其从表中删除)。感谢您的回答,是的,我本可以更具表达力,但我认为“过期”日期表示禁令是临时的。我将使用我在其他评论中解释的一种变体。