我正在开发一个在线系统,可以让用户在社交上进行互动,当然,能够识别出实际上是在线的用户也是很重要的。我知道HTTP是无状态的,我也知道如何使用会话,所以我需要通过将用户的最后活动时间与任意过期时间进行比较来实现这一点。
我的最终问题是:我应该只是在现有的成员表(**last_active_time**,、is_user_online**,、* hide_online_status**,等中添加一些字段,还是最好将这些信息保存在一个单独的表中?*我最初的想法是使用现有的表来简化操作。除了复杂程度之外,其中一个与另一个相比有什么好处/缺点?
发布于 2009-09-18 16:34:59
我会把它放在另一张桌子上。如果你有一百万用户,你想知道谁是在线的,你不想一遍又一遍地扫描那个表来查找信息。您的“联机”表将相对较小,您可以有一项任务定期扫描过去5分钟左右未进入的表,然后从联机表中删除它们,并更新"last_seen“成员表中的任何必需内容。
发布于 2009-09-18 16:36:35
创建一个新表。
首先,有一个哲学原因,那就是一个对象(读:表)应该有一个目的。在数据库逻辑设计中,这会变得非常模糊,但这仍然是一个很好的原则。
但真正的原因来自于物理设计:首先,在任何特定时间登录的用户数量可以假定远远少于总用户数,这样存储需求就会更低。更低的存储需求直接转化为减少了数据库上的负载,这仅仅是因为需要读取和更新的块更少。
如果您将这些数据放在主表中,那么这些块将被分散在更大的空间上,并且随着数据的更改,这些块的内容将不断增长和缩小。
最后,您可能需要一些索引,例如,查看谁现在在线。这些索引将(1)占用更多的空间,(2)创建更分散的脏块,这些块必须物理地写入磁盘,(3)引入更新争用点。
发布于 2009-09-18 17:44:49
我认为这取决于你期望拥有多少用户。如果只有几千个用户,我只会在user表中将在线状态作为用户的属性。如果不止这些,那么您将需要一个online_users表,并将该信息保存在那里,其中包含主users表的外键。为了获得好处(在上面的海报中提到),您需要每隔几个小时运行一次任务,将不活跃的用户从online_users表中删除。
https://stackoverflow.com/questions/1445617
复制相似问题