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

mti*_*l89 2 php mysql

我正在开发一个jQuery Mobile Web App,公司将能够向某些用户组发送消息(基于他们的个人资料首选项).

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

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

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

Kev*_*Pei 6

好吧,我会把我在评论中说的所有内容都放到一个可靠的答案中.

简答:您应该使用数据库存储"读取"通知

背后的逻辑:

  1. 即使有成千上万的用户,它也应该是一个可以忽略不计的性能,其中包括不错的服务器和优化的代码(几个ms最大值)
  2. 它是高度可维护的
  3. 您可以跟踪它并跨设备同步它

特别是为什么你不应该使用会话

  1. 会话旨在存储临时用户数据(想想ram),他们不应该记录东西.

  2. 你不应该保持几个月的会议.它非常不安全,因为它为会话劫持打开了一个更大的窗口.相反,您应该在每次访问应用程序时生成一个新会话,并使用不同的"记住我"cookie或每次进行身份验证.

  3. 即使你确实让你的会话持续了几个月,在这几个月之后,用户不会突然得到一个bajillion"未读"的通知吗?

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

表1:消息

ID, message, timestamp
Run Code Online (Sandbox Code Playgroud)

表2:messages_users

ID, user_id, message_id, read
Run Code Online (Sandbox Code Playgroud)

表3:用户

(Do user business as usual)
Run Code Online (Sandbox Code Playgroud)

  • @TroubleZero牛津不同:P:http://www.oxforddictionaries.com/definition/english/bajillion (6认同)
  • @livewire1407 或者您可以只在表 1 中插入消息,然后仅在用户看到消息时创建表 2 记录。 (2认同)