【问题标题】:Most efficient way to track unread messages per user跟踪每个用户未读消息的最有效方法
【发布时间】:2014-03-27 00:07:22
【问题描述】:

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

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

我认为两者都可以,但我正在努力平衡利弊。保存在数据库中可以让我保留历史记录(特别是如果我添加了时间戳列以了解他们何时阅读消息),但如果由于表大小会损害应用程序性能,那么它可能不值得它。该应用可能拥有数十万用户。

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

【问题讨论】:

  • 为每条消息添加一个read 列。不应该对性能造成太大影响(如果有的话)。 MySQL 是一款功能强大的数据库软件,只要你有不错的服务器和优化,你就可以处理数百万条记录
  • 我不能只在消息表中添加一个已读列,因为一条消息可能来自 1 到 1000 个用户。我正计划在消息表中只保留一行。在消息表中有 1 行和一个带有 message_id、uid 的单独表将它们标记为已读会影响效率吗?
  • 额外表的任何性能变化都可以忽略不计(想想几毫秒)。
  • 另外,另外,您不应该保持会话数月。它非常不安全,因为它为会话劫持打开了一个更大的窗口。相反,您应该在每次访问应用程序时生成一个新会话,并每次使用不同的“记住我”cookie 或其他东西来验证它们。
  • 我相信这实际上是正在发生的事情(我没有亲自编写该代码),但我会仔细检查它。谢谢

标签: php mysql


【解决方案1】:

好的,我会将我在 cmets 中所说的所有内容都放在一个可靠的答案中。

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

背后的逻辑:

  1. 即使有数十万用户,使用体面的服务器和优化的代码(最大几毫秒)对性能的影响应该可以忽略不计
  2. 高度可维护
  3. 您可以跟踪它并跨设备同步它

为什么不应该使用会话

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

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

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

如何将其存储在数据库中
这称为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)

【讨论】:

  • 所以使用这种方法,当我添加一条消息时,我会在消息中添加一行,然后在messages_users 中添加一行,以便每个用户收到消息,然后将每一行标记为已读他们打开它们来阅读它们,对吗?
  • @TroubleZero Oxford 不同意 :P oxforddictionaries.com/definition/english/bajillion
  • @livewire1407 或者您可以将消息插入表 1,然后仅在用户看到消息时创建表 2 记录。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 2021-08-07
    • 1970-01-01
    相关资源
    最近更新 更多