【问题标题】:Private Messaging Notification - Database Table Design私信通知 - 数据库表设计
【发布时间】:2012-02-04 22:13:26
【问题描述】:

我已经创建了一个使用 PHP 和 mySQL 的私人消息传递系统,其通知有点像 Facebook。

数据库表有以下字段(未全部列出):

  • 消息ID
  • 发件人用户ID
  • RecUserID
  • 留言
  • 主题
  • 日期时间
  • 状态 - 是否已读
  • RepliedStatus - 我应该如何使用它?
  • DeleteRec - 从收件箱中删除
  • DelSender - 删除发件人收件箱
  • RepliedUserId - 当用户回复原始消息时,这是对接收者 ID 的更改

所有回复都存储在第二个表中,因为每条消息都会创建一个线程。第二个表看起来有点像这样:

  • messageID - FK
  • repuserID
  • 消息
  • 日期时间

在向用户发送新消息时,我将消息的“状态”更改为未读,由此可以运行计数查询以在通知中列出所有未读消息。

但如果用户回复该消息,我无法将原始“状态”字段设置为未读,因为这将出现在两个用户的通知中。所以我创建了另一个名为“RepliedStatus”的字段,但我不确定如何使用它来显示消息回复通知?

谢谢大家。

【问题讨论】:

    标签: php mysql database-design notifications private-messaging


    【解决方案1】:

    如果您有回复表,那么您的第一个状态不需要回复状态列。由于回复表中存在一条记录,您就知道用户已经回复了一条消息

    【讨论】:

    • aah 回复表中的状态存在一个问题,两个(发送者/接收者)用户都会收到通知,因为回复就像主消息的线程,有点像脸书。示例:用户 A 向用户 B 发送消息,用户 B 回复该消息,而不是用户 A 回复同一消息,等等所有这些都在同一消息中。
    【解决方案2】:

    为什么不向名为“previous_message”的第一个表(比如说“messages”表)添加一个 INT 和可为空的列?

    ALTER TABLE messages ADD COLUMN previous_message INT DEFAULT NULL;
    

    因此,每条消息都将在同一张表中包含前一条消息,您可以计算出顺序。如果有帮助,您可以拥有一个具有相同定义的“next_message”列,并在回复时更新相关记录。

    这样做您可以在每个回复中使用状态列。

    如果您想保持相同的数据库组织,我建议在第二个表上添加一个列状态(比如说“回复”)。

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      我将删除的列放一次,对于已读或未读的内容相同:

      [{"0":"both", "1":"Sender", "2":"receiver"}];
      

      然后获取胎面消息,例如:

      $sql = "SELECT * FROM messagetreads 
      WHERE (senderID OR receiverID = ".$_SESSION['MyCurrentId'].")
      AND deleted !== 0
      ORDER by TreadID AND DateTime ASC";
      

      当发送方“delete”为tread时...如果delete colomn为2,则数据库中所有treadrelatedID都更改为1或0...

      但我认为最好创建另一个列来获取重复的删除和通知数据,例如

      • TreadID (FK_message_Table)
      • 删除(0=已删除 UserID=不显示给此发件人或收件人)
      • 通知(0=都读取 UserID=读取给这个发送者或接收者)

      然后就是改变状态或者删除语句的ezee。

      SELECT 会是这样的:

      $SQL = "SELECT * 
      FROM messagetreads
      WHERE (senderID OR receiverID = ".$_SESSION['MyCurrentId'].")
      IN (SELECT TreadID WHERE delete !== (0 OR ".$_SESSION['MyCurrentId']."))";
      

      如果是我们的成员ID,则在列中删除所有不出现的消息,但如果是发送者将删除时接收者的ID,则可以归因于0,以便两个成员都可以“删除”消息。通知也一样!

      很久以后,一个 cron-job 可以删除非常旧的消息 read(0)...

      PS:这也可以是通知系统,例如通知墙上的新帖子或评论照片或日历上的新事件......只需在列数据中添加更多信息并使用 php 或 java-ajaxed 等方式对其进行格式化。 ..

      【讨论】:

      • [queue]:phpmaster.com/zend-queue 我发现有趣的通知方式是存储消息的时间戳和成员对 message_tread 的访问,并在类似的并行过程中进行比较zend-queue doe's ([zend-queue on PHP-MASTER][queue]phpmaster.com/zend-queue/).Also 我将参与者与另一个表中的踏板分开,因为我只想能够将成员添加到消息踏板中(就像 Facebook. ..) 并且所有行都包含上次访问的时间戳、user_id、message_Tread_id
      猜你喜欢
      • 2011-10-22
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      • 2013-01-10
      • 2010-12-25
      • 2011-04-19
      • 2016-05-25
      相关资源
      最近更新 更多