在MySql和PHP中实现用户通知系统的建议

9

我正在实现一个通知系统,想确认以下建议是否可行,其中哪个更好或是否有更好的解决方案:

将通知添加到数据库。访客/可识别的用户登录或使用网站。他们会看到他们以前没有看过的通知,并可以选择关闭或稍后阅读。

  • Notification表存储通知文本和ID。
  • 选项1:Alerts表存储已读通知的所有用户。
  • 选项2:Alerts表存储未读通知的所有用户。

这两个选项是否差不多?如果将潜在的100,000+警报添加到表中,随着用户丢弃或与通知交互,他们的状态将被改变或删除,这可能会成为一个非常大的表......

基于用户活动的自定义通知的更可扩展的设置是什么?

3个回答

13

我不会那样做。我会为每个(用户,通知)存储一条记录,并将每条记录标记为已读或未读。然后您可以记录他们阅读通知的时间,这可能取决于您的应用程序(例如,如果您需要某种审计追踪)。

100k条记录并不算太多。在达到至少1000万条记录之前不要担心大小问题。如果必要,可以在某个时候对其进行归档。但是您应该对生成1000万条记录的速度进行一些估算。如果只需要3天,那么你确实有一个问题。如果需要3年,那就没有了。

当然,此选项将通知文本保存在单独的表格中。

这种方法也可以很好地扩展到更高数量的消息,因为您可以选择为用户选择未读消息(已索引),并且可以连接以获取通知文本(如果您的表格具有数千万条记录的规模),或者选择它们,然后分别选择消息。

对于(用户,通知)表格的分区很容易:您可以基于用户范围进行分区。

当用户删除消息时,一般情况下,您应该将其标记为已删除,而不是实际删除它。在数据库中,大多数时候没有太多删除任何内容的理由。


我想追踪阅读时间等,并像你所说的那样保留审核轨迹,很少或几乎不删除,只将状态更改为“d”表示删除。我的主要担忧是大小问题,因此也许可以将阅读通知添加到单独的表中,否则是否可以将其归档到数据库外的日志文件中?我预计经常过滤巨大的表会导致问题。我考虑每个通知100,000条记录,因此处理一百万条记录需要两周。 - Peter Craig

5

我正在编写我们的网站,有同样的问题,但我是这样解决的:

  1. 将所有记录存储在通知表中。
  2. 已读/未读 = true/false
  3. CRON作业:如果用户有超过50个通知,则删除旧的10个通知。

我认为Facebook定期运行cron作业来删除旧通知,当我们的通知限制达到后,我们将无法看到它们。


1
或者,您可以基于每个用户配置文件存储一组对尚未阅读的笔记的引用,然后在显示它们时将它们删除(通常情况下是一次性阅读所有笔记)。这样,当您提取单个用户时,只需要进行微小的查询,而您的成本在于全局消息的插入时间,而不是过滤大型未读消息表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接