9

我正在实施一个通知系统,并查看这些建议是否可以设置,如果一个比另一个更好,或者有更好的解决方案可用:

一个通知被添加到数据库中。访客/可识别用户登录或使用该站点。他们会收到以前从未见过的通知,并可以选择关闭或稍后阅读。

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

这些选项是否很多,添加潜在的 100,000 多个警报是否更好,并且随着这些用户丢弃或与通知交互,他们的状态会更改或警报被删除。这可能会变成一张非常大的桌子......

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

4

3 回答 3

13

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

100k 条记录不是很大。在获得至少 1000 万条记录之前,不要担心大小。如有必要,在某个时候将它们归档。但是您应该对生成 1000 万条记录的速度进行一些估计。如果是3天,那么是的,你有问题。如果是 3 年,那么你不会。

当然,此选项在单独的表格中具有通知文本。

当您为用户选择未读消息(已编入索引)时,这也应该可以很好地扩展更多消息,并且可以加入以获取通知文本(如果您的表具有数千万条记录大小)或选择它们然后分别选择消息。

对 (user,notification) 表进行分区很容易:您可以根据用户范围对其进行分区。

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

于 2009-07-25T08:14:28.197 回答
5

我正在编写我们的网站并且有同样的问题,但我以这种方式解决了自己:

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

我认为 Facebook 会定期运行一项 cron 作业来删除在达到限制通知后我们看不到的旧通知。

于 2012-09-08T09:57:00.753 回答
1

或者,您可以在每个用户配置文件的基础上存储一组对尚未阅读的笔记的引用,然后在它们显示时将其删除(一般用例可能是一次阅读所有笔记)。这样,当您拉取单个用户时,您只有一个很小的查询,并且您的成本是全局消息的插入时间,而不是过滤一个大的未读消息表。

于 2009-07-25T08:16:53.713 回答