【发布时间】:2018-09-08 08:25:22
【问题描述】:
我使用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 种不同的时间戳,我一直纠结于如何正确有效地解决这个问题。有什么想法吗?
【问题讨论】:
-
为什么不只在用户阅读时插入子通知?从
notifications表中获取要显示的通知,其中subnotifications上没有带有user_id 和该通知id 的条目,一旦用户看到,将条目添加到subnotifications -
谢谢!这听起来是个不错的选择,但我认为的问题是,如果用户今天有 3 个关注者并创建了一个帖子,我们可以使用
user_id/notification_id检查它们是否存在于subnotifications中行来知道它是否被读取。但是,如果他们明天有 7 个新关注者,则不应通知新的 7 个关注者,因为他们在发布后开始关注。我是否必须扫描关注者表以比较他们的以下时间戳 -
嗯,这听起来更合理,这样您实际上最终会节省大量插入数据库并保持功能不变
-
不太明白这个问题
-
如果您关注了 100 个人,关注者表将记录您的
follower_id、leader_id和created_at时间戳。当您查看通知时,您应该只看到您的领导发布的新内容。如果您只有 1 个领导者,很容易得到这一点,因为您将跟随他们的时间戳与通知的时间戳进行比较。但是由于您有 100 位领导者,您不想在关注他们之前获得他们的旧帖子,只在关注他们之后发布帖子,但是您没有 1 个时间戳仅用于比较,您有 100 个时间戳,所以这就是问题所在自动取款机..
标签: php laravel laravel-5 laravel-5.5 laravel-notification