我使用一张notifications
桌子和一张subnotifications
桌子,而且我还使用队列,因此当用户发布内容时它会在后台运行。当用户有 10 个关注者并且他们创建了一个帖子时,该notifications
表会获得一个条目,其中包含通知的帖子数据,并且该subnotifications
表会获得 10 个条目(每个关注者一个子通知,每个子通知都引用通知的 id,所以我们不必重复通知数据 10 次,并read_at
知道该关注者是否已读取它)。
这很快,效果很好,没有任何问题。但是,在使用 100 万关注者进行测试时,插入一篇帖子的子通知大约需要6 个小时!这当然是不可接受的,因为插入 100 万个子通知需要太长时间,每个关注者一个。想象一下,同一个用户发布了 10 个帖子,这将是大约 60 个小时的插入和 1000 万个子通知行。
我只是想让追随者知道有一个新帖子,如果他们还没有阅读的话。有没有更好、更有效的扩展方式?
更新:坚持目前的方法见下文......
如果一个追随者$user
有 100 个他们追随的领导者(他们created_at
当然在追随者表中以不同的时间戳追随),那么从追随者追随每个领导者的那一刻起,了解领导者新帖子的正确查询是什么?created_at
我被这个伪代码困住了:
// Assume `leader_id` is a column in the notifications table
DB::table('notifications')
->whereIn('leader_id', $leaderIds)
->where(`created_at`, '>', $whatTimestampsGoHere)
->paginate(20);
有 100 个不同的时间戳,我被困在如何正确有效地解决这个问题上。有任何想法吗?