社交网站如何处理通知

use*_*382 0 notifications facebook ruby-on-rails social-networking

我正在实施一个小型社交网站,我正在尝试实施通知.

通知具有以下要求

  • 所有用户都会在他们关注的用户做某些事件时收到通知(更改个人资料图片,如帖子,创建帖子,发表评论等等...
  • 通知的状态为已读或未读(如facebook和stackoverflow).当用户的一组通知未读时,就像Facebook一样,用户将继续在其导航栏上看到阅读通知图标

以下是我想用MySQL实现它的方法:

通知表:type_of_event,event_id,message Notification_read表:user_id,notification_id,read

  • 每当用户执行触发通知发送给其所有关注者的事件时,该通知都存储在Notification表中
  • Notification_read表格将填写新创建的通知,其中包含新通知的ID和应接收通知的每个用户的ID(通知创建者的关注者)
  • 每当用户收到通知并读取通知时,通知都将标记为 read

这个解决方案对我来说似乎效率很低,因为每次发生通知时,通知都会notification_read多次写入表中(取决于用户拥有多少关注者)

有人能告诉我是否有更好的解决方案来解决这个问题

Roe*_*mer 6

在这些问题中,权衡通常是读取与写入.

在这种情况下,写入可以表示将通知写入数据库所花费的时间和存储成本.

对于阅读,它是关于您为特定用户获取通知的速度有多快.

在@kecebongsoft的示例中,您在写入时非常有效(因为相对较少的字段)但是读取需要花费大量时间.在数据库的文本字段中搜索通常很慢.对于用户,如果列出了用户,则必须检查所有通知及其检查字段,如果是,则状态是什么.

通过为每个用户存储单独的通知,可以增加存储空间,但是您在阅读方面获得了很多收益.也就是说,因为您可以使用用户ID搜索索引表,并快速查找任何通知及其状态.

当然,有非常复杂的混合方法.但一般来说,大网站不喜欢告诉这些秘密:)

如果您从一个网站开始,我不会担心写作成本.使用许多通知填充表格并不昂贵.最后,他们可能都相对较小.你甚至可以考虑修剪旧的通知.

更重要的是阅读速度.发现您网站的人不会对您的高效存储适配器留下深刻印象,但会在收到通知时注意到照明速度.

我的建议:现在重点关注读取速度,以及何时扩展存储效率.

最后一点:如果您在创建通知时创建了大量数据库条目,请查看从主Web服务器线程调度的解决方案.这样,创建通知的人可以快速继续,您可以在后台执行昂贵的SQL工作.速度更快!