Php 通知系统-读与写

Php 通知系统-读与写,php,sql,Php,Sql,我考虑过两种类型的用户通知系统 它们都有一个订阅表,用户在其中订阅特定频道。 下面的模式用于存储事件的表 1.昂贵的书写 当新的事情发生时: |id| |type| |uid| |read| |created| 1 2 2 0 1234 |id| |type| |created| 1 2 1234 在这个系统中,当某个频道发生新的事情时,为订阅该频道的每个用户插入一个新行 缺点: 如果有100万用户订阅了某个频道,则必须为该频道中

我考虑过两种类型的用户通知系统

它们都有一个订阅表,用户在其中订阅特定频道。
下面的模式用于存储事件的表

1.昂贵的书写 当新的事情发生时:

|id| |type| |uid| |read| |created|  
 1    2       2      0     1234
|id| |type| |created|
 1     2     1234
在这个系统中,当某个频道发生新的事情时,为订阅该频道的每个用户插入一个新行

缺点:

  • 如果有100万用户订阅了某个频道,则必须为该频道中发生的每一个新事件插入100万行
  • 浪费空间,如果未正确规范化,则重复内容
优点:

  • 快速阅读时间
  • 简单实现
2.昂贵的阅读 当新的事情发生时:

|id| |type| |uid| |read| |created|  
 1    2       2      0     1234
|id| |type| |created|
 1     2     1234
在这个系统中,它只为一个事件插入一行,即它不是特定于用户的。 然后,用户读取表并检查发生的事件是否在其订阅的通道中,然后还比较创建的时间是否大于上次读取时间

缺点:

  • 昂贵的读取,因为用户必须进行大量过滤
  • 用户特定事件无法轻松处理[例如回复您的评论]
  • 用户特定事件出现时的复杂实现
优点:

  • 所需空间更少
  • 事件的一对一插入,即插入时间更短
您认为以下哪种情况更好:

  • 这些事件一天可能发生5到10次(即写作)
  • 每分钟为每个用户检查(即读取)新事件

  • 我建议结合你的方法

    先创建一个包含消息的表,然后创建另一个将这些消息的每用户状态与用户关联的表。例如,您的messages表可能非常简单:

    • 身份证
    • 消息(varchar/text)
    您的其他表可能有:

    • 身份证
    • 消息id
    • 用户id
    • 读取(布尔值)
    然后,如果您有该用户的任何其他特定信息,您可以在原始消息之外跟踪它。如果您更新了该原始消息,它仍然会为所有用户更新