我应该使用单独的表来存储在线用户,还是应该只使用现有成员表中的其他字段?

时间:2009-09-18 16:29:34

标签: sql database stateless

我正在开发一个允许用户进行社交互动的在线系统,当然,能够识别实际上在线的用户非常重要。我知道HTTP是无状态的,我知道使用会话,所以我需要通过比较用户的最后活动时间和任意的到期时间来实现这一点。

我的最终问题归结为:我是否应该只向现有成员表中添加一些字段(last_active_timeis_user_onlinehide_online_status等)或者是最好将这些信息保存在一个单独的表中?我最初的想法是使用现有的表格来简化。除了复杂程度之外,一方与另一方的利弊是什么?

3 个答案:

答案 0 :(得分:2)

创建一个新表。

首先,有一个哲学原因,即一个对象(读:表)应该有一个目的。这在数据库逻辑设计中变得很模糊,但它仍然是一个很好的原则。

但真正的原因来自物理设计:首先,可以假设在任何给定时间登录的用户数远远少于用户总数,因此存储要求会更低。较低的存储要求直接转化为减少数据库的负载,因为您只需要更少的块来读取和更新。

如果将这些数据放在主表中,那么这些数据块将分散在更宽的空间中,并且当您更改数据时,块的内容将不断增长和缩小。

最后,您可能需要一些索引,例如,看看谁现在在线。这些索引将(1)占用更多空间,(2)创建更多分散的脏块,必须物理写入磁盘,(3)引入更新争用点。

答案 1 :(得分:1)

我会在一个单独的表中维护它。如果您有一百万用户并且想要知道谁在线,则您不希望一遍又一遍地扫描该表以查找该信息。您的“在线”表格相对较小,您可以定期扫描那些在过去5分钟左右没有进入的工作,然后只需从在线表格中删除它们并更新成员表格中所需的任何内容为“last_seen”

答案 2 :(得分:0)

我认为这取决于您希望拥有多少用户。如果只有几千个用户,我只会在用户表中将在线状态设置为用户的属性。如果有更多,那么你将需要一个online_users表,并在那里保留那些信息,使用主用户表的外键。要获得好处(上面提到的海报),您需要每隔几个小时左右运行一个任务,以从online_users表中删除非活动用户。