向某些用户显示管理员消息的最佳方式?

我正在用PHP / MySQL / jQuery构建一个社交网站。 一旦用户登录到我的网站,我想查询数据库并获得管理员通知(如果存在)。 这将是一个消息框,在页面上显示给所有用户,但它将有一个X点击它,并且在管理员发布新的公告消息之前不再显示它。 因此,如果您从未单击过X并且数据库中存在公告消息,它将始终在您的页面上显示此消息框,但是如果您确实cli9ck X关闭该框,那么您将返回页面它将除非有新的管理员消息,否则不在那里。

我知道有几种方法可以做到这一点,但我正在寻找最有效的方法。

我有一个想法,如果我在用户的表“admin_message”上添加一个额外的mysql字段并将其标记为0,那么当我发布一个新的管理员消息时,它会将每个用户的记录更改为1,如果管理员消息设置为1然后它显示在用户的页面上。 然后,当用户单击X以隐藏该框时,它将更新用户表行并将该值重新设置为0。

我的另一个想法是使用cookie来检查用户是否选择隐藏消息,我认为这会更快但可能不那么好,因为用户可以使用不同的计算机登录,如果显示新消息,他们可能会不能马上看到它。

所以我只是想知道使用额外的数据库字段是不是一个坏主意? 如果我有1,000,000个用户,当我发布新的管理员消息时,我需要更新1,000,000行以确保每个人都能看到该消息。 有没有更好的办法? 此外,一旦用户登录到我的站点,我将使用会话来存储他们看到或隐藏消息的值,而不是在每个页面加载时查看数据库。



UPDATE

对不起我认为我的post可能有点令人困惑或者不清楚我究竟是什么意思,因为大多数回复都是针对一个消息系统,而这个系统并不接近。

请忘记留言,我会尝试用不同的词来解释。 假设网站上有1名管理员,这是唯一可以向用户发布消息的管理员。 用户只会看到1条消息,如果在网站的生命周期内发布了2352345234条消息,则无所谓,它们只会看到1条消息,即最新消息。

现在,一些登录并在页面上看到此消息“div”的用户可能厌倦了查看它,因此他们将能够隐藏它再次显示。

在这个页面上显示此消息就像是或否一样简单。

但是,如果我确定需要发布新的管理员消息供所有用户查看,那么即使是选择隐藏但未显示管理员消息的用户仍会再次看到它,直到他们选择再也看不到它为止。

两个简单的解决方案如下:

好:检查用户cookie,如果它包含一个标志,表明显示的消息不显示消息,否则显示它。 当用户关闭它时,更新cookie。 优点:绝对简单。 缺点:用户可能会看到相同的消息两次,具体取决于他们是否清除了Cookie或从其他计算机登录。

更好:在某个地方的数据库中存储一个标志(你现在可以将它存储在admin用户表中,然后将它分成另一个表)。 当用户登录时,1)将该标志保存到用户的cookie或会话中,2)更新数据库,3)决定是否需要显示该消息。 当用户关闭消息时,更新cookie /会话和DB。 优点:用户永远不会两次显示该消息。 缺点:稍微需要在db中维护标志。

实现细节:对于标志,您可以使用已建议的消息ID,或者您可能已经保留用户的上次登录时间戳并且可以使用它。

每个用户都可以拥有last_message_seen ,因此您必须为您的用户查询“新”消息(message_id> last_message_seen)。 如果你[X]关闭(或超时),那么你的javascript可以检查新消息等等……

另一个想法是在javascript环境中最后一条消息看到数字 ,但是在这种情况下,当你刷新/放弃页面时它将被重置(重新计算),如果它不在数据库上,你的用户可能会错过最后插入的消息页面加载和此刷新。

或者…… 它可以在会话中 ,所以你不要错过任何一个。 当您登录时,该号码将被重置为某个“正常”号码,例如:最后一条消息,或者(现在 – 1小时)之后的消息,或者其他……

您是否为用户保留了登录时间? 像last_login datetime一样?

所以获取date_created> = last_login的所有消息。 显示它们,然后将last_login时间更新为now()。

我会用#1的想法。 我不会使用bool-field来检查用户是否已阅读该消息,我将使用datetime-field,并使用一些默认值。 如果field == default,则未读。 读取时,设置字段NOW()。

通过这种方式,您可以大致了解用户阅读邮件的速度。

编辑:

编辑后,我仍然使用相同的机制。 该消息需要一个字段来查明是否已读取。 如果用户单击X(关闭),请更新数据库并将消息标记为已读。

如果管理员发布了新消息,则会弹出。

您还需要一个创建日期时间,因为如果用户没有关闭上一条消息,并且管理员发布了新消息,则只能显示最新消息。

EDIT2:回复此评论:

即使用户错过了am消息,也只显示最新消息。 也许我是误会,但听起来你说要基本上标记一条消息,读取100,000次是100,000个用户点击X,我认为它应该更多地在用户桌面上,显示或不显示消息框,而不是单独的

在你的理论中,某些东西不是地方性的。 您希望将“显示/不显示”保存为设置,但无论如何都要显示消息。 你怎么知道何时推翻用户设置,何时不记得系统是否向用户显示了消息? 即使您只想显示一次,您也需要数据库中的一个字段(在消息级别)来存储系统是否向用户显示消息。

我建议使用admin_message_queue表。 它将具有消息正文,用户ID和消息ID。 当您发布新的管理员消息时,它将为该表的每个管理员用户添加一条记录。 然后,当他们登录时,您只需选择所有admin_message_queue行,其中用户ID =登录用户。

要删除消息,您只需使用关闭按钮就会触发AJAX回调到服务器上获取消息ID的方法。 该方法将从admin_message_queue中删除,其中消息ID =发布的消息ID和用户ID =会话中的用户ID。 这样,用户就无法删除其他人的消息。

这样做可以使您不必保留已查看消息的行。 为什么要为某人隐藏它? 你最终会保留大量不再使用的数据。

问题更新后更新:对不起,我以为您试图向管理员显示消息。 您可以保持同样的逻辑,以便向所有用户显示最新消息。 只需要一个包含userID和消息文本的表。 每当您发布消息时,它都会通过并覆盖所有记录仍然存在的人(未隐藏消息的人)的消息文本,并为其他人添加行。 当他们隐藏消息时删除该用户的行。