1

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

我的最终问题归结为:我是否应该在现有成员表中添加一些字段(last_active_time、、、等) is_user_onlinehide_online_status或者最好将这些信息保存在单独的表中?为了简单起见,我最初的想法是使用现有的表。除了复杂程度之外,一个与另一个的优点/缺点是什么?

4

3 回答 3

2

创建一个新表。

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

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

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

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

于 2009-09-18T16:36:35.947 回答
1

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

于 2009-09-18T16:34:59.953 回答
0

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

于 2009-09-18T17:44:49.710 回答