最有效的方法来跟踪每个用户的未读消息

时间:2014-03-27 00:07:22

标签: php mysql

我正在开发一个jQuery Mobile Web App,公司将能够向某些用户群发送消息(基于他们的个人资料偏好)。

我正在讨论每个用户阅读最新消息时最有效的标记方式。我已经考虑过使用会话来尝试跟踪他们上次打开消息页面的时间,并将其与消息的发布时间进行比较。我还考虑了一个带有message_id和user_id的表,在打开页面时将每个表标记为已读。

我认为两者都有效,但我试图平衡利弊。保留在数据库中将允许我保留历史记录(特别是如果我添加时间戳列以了解他们何时阅读消息),但如果由于表大小而导致应用程序性能受损,则可能不值得它。该应用程序可能拥有数以万计的用户。

我应该提到的一件事是,用户可能会在多个设备上使用该应用,并且该应用会有非常长的会话时间,可能允许用户保持登录数月。我喜欢这样的想法:如果他们在一台设备上读取它,那么它会在所有设备上标记它,这可能会使会话难以使用,对吧?

2 个答案:

答案 0 :(得分:6)

好的,我会把我在评论中说的所有内容都写成一个可靠的答案。

简答:您应该使用数据库来存储“阅读”通知

背后的逻辑:

  1. 即使拥有数十万用户,它也应该是一个可以忽视的性能服务器和优化的代码(几个ms max)
  2. 高度可维护
  3. 您可以跟踪它并跨设备同步
  4. 特别是为什么你不应该使用会话

    1. 会话旨在存储临时用户数据(想想ram),它们不应该记录内容。

    2. 你不应该保持几个月的会议。它非常不安全,因为它为会话劫持打开了一个更大的窗口。相反,你应该在每次访问应用程序时生成一个新会话,并且每次使用不同的“记住我”cookie或其他东西来验证它们。

    3. 即使您确实让会话持续数月,在这几个月之后用户不会突然收到大量“未读”的通知吗?

    4. 如何将其存储在数据库中
      这称为many-to-many关系(从消息角度看)或one-to-many关系(从用户角度来看)

      表1:消息

      ID, message, timestamp
      

      表2:messages_users

      ID, user_id, message_id, read
      

      表3:用户

      (Do user business as usual)
      

答案 1 :(得分:0)

我可以做一件事,如果一个用户或100个用户没有问题,您创建了一个名为readUnread的列,该列包含63,999个以上的字符,您在其中使用的每个用户的消息分配为0和1,例如{jeff:0,kevin:1,Sal:0}当读取的更新从0升级到1并在屏幕上将其打开时,将其与当前用户和“;”分开,这将对您有所帮助(这是提高性能的逻辑)。