2009-09-18 55 views
1

我正在开发一个允许用户进行社交互动的在线系统,当然,能够识别实际上在线的用户将是非常重要的。我知道HTTP是无状态的,而且我知道使用会话,所以我需要通过比较用户的最后一次活动时间和任意到期时间来完成此操作。我应该使用单独的表来存储在线用户,还是应该在现存成员表中使用其他字段?

我的终极问题归结为:如果我只是将某些字段添加到现有成员表(last_active_timeis_user_onlinehide_online_status等),或者这将是最好保持在一个单独的表这一信息?我最初的想法是为了简单而使用现有的表格。除了复杂程度之外,一个人与另一个人有什么好处/不利之处?

回答

1

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

2

创建一个新表。

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

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

如果你把这个数据在主表,而且,比那些块将被分散在一个更广阔的空间,而块的内容将不断增长和收缩为你改变的数据。

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

0

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

相关问题