0

我正在为一个网站构建一个小型论坛组件,其中子论坛有不同的管理员和模块负责,并且可以禁止用户访问各个子论坛。我的禁令表如下所示:

_Bantable_ 
user_id 
group_id
start_date 
end_date 
banned_by 
comment 

起初我打算使用前四列作为主键,但现在我想知道如果我使用一个是否重要,因为没有人会在同一时间从同一个论坛被禁止,并且不管我仍然需要检查他们是否已经被禁止以及在什么时间间隔内。我是否应该在这里不使用密钥,而只需在 user_id 和 group_id 上创建一个索引并在需要时搜索它们?

4

3 回答 3

1

这不是 100% 清楚的,但听起来您希望针对特定groupId. 如果是这种情况,您应该创建一个复合主键:

user_id,
group_id,
end_date

这会让你做

SELECT * FROM bantable WHERE user_id=$currentUserToCheck AND group_id=$currentGroupToCheck AND end_date < $currentDate

或类似的东西

注意:如果您希望您的主键在您遵循的任何数据库设计原则方面保持一致,那么您可以将主键设置为user_id(因为它确实是一个唯一标识符),然后在我在上面指定的三列。

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

于 2012-09-03T22:22:09.193 回答
0

你为什么不把user_id主键作为主键?我的意思是你甚至不必使用auto_increment(这显然在这里没有任何意义)。

猜测你会user_id在登录时请求无论如何,这可能会提供最好的性能来查看是否有禁止事项的条目。

于 2012-09-03T22:13:30.603 回答
0

您需要过去禁令的历史记录吗?

  • 如果没有,只需在{user_id, group_id}. 当前在其中的任何数据都_Bantable_决定了谁当前被禁止。end_date当禁令到期时,只需删除相应的行(并考虑是否需要1)。

  • 如果您确实需要历史记录,请像以前一样将有效禁令放入原始表中,但是当禁令到期时,不要只是将其删除 - 而是将其移动到单独的“历史”表中,该表将具有代理 PK 2独立于{user_id, group_id}(因此相同的用户/组对可以在多行中)和防止时间重叠的触发器(类似这样)。


1如果这是禁令即将结束的日期,那么您确实需要它。如果这是禁令结束的日期,那么您不会 - 届时该行将消失。

2或者,在 上进行 PK {user_id, group_id, start_date}

于 2012-09-04T00:00:56.547 回答