如何在php消息系统中设置读取未读标志

时间:2015-04-21 05:54:20

标签: php

我正在用PHP开发一个Facebook类型的消息系统。我有一个user_message表,其中包含sender_idreceiver_idmessageflag作为已读/未读。在此表中插入值后,我将其设为未读,当用户单击消息通知时,状态将更新为 read

单用户工作正常。虽然向多个用户发送消息,但我在表中以逗号分隔值存储receiver_id。我的问题是如何为多个接收器设置标志?例如,如果我向3个用户发送一条消息,那么如何设置读取标志?任何帮助都会得到赞赏。

3 个答案:

答案 0 :(得分:3)

  

虽然向多个用户发送消息,但我将receiver_id存储为表中的逗号分隔值。

不要滥用字符串列来表示多个值。在大多数DBMS中索引以这种方式构建的列是不可能的,因此您无法有效地搜索它。这对于"消息接收者来说尤其重要。结构,因为这意味着无法有效地搜索特定用户收到的所有消息。这将使许多常见操作(例如检查发送给用户的新消息或查看用户的邮箱)在大型站点上非常慢。

相反,如果您希望将一条消息的单个表示形式发送给许多人,而不是每个消息的单独消息,请使用两个表对此进行建模,例如

CREATE TABLE message (
    id INTEGER PRIMARY KEY NOT NULL,
    sender_id INTEGER NOT NULL,
    message TEXT NOT NULL
);

CREATE TABLE message_recipient (
    message_id INTEGER NOT NULL,
    recipient_id INTEGER NOT NULL,
    PRIMARY KEY (message_id, recipient_id)
);

使用这样的表结构,您可以放置​​"读取" message_recipient对象上的标志,以便给定消息的每个收件人具有单独的读取状态。

答案 1 :(得分:1)

您可以在message表和receiver表之间建立一个仲裁表。例如 MessageRead 表。它有id(自动增量)message_idreceiver_id。如果id = 10的用户读取id = 5的消息,则需要执行以下查询:

INSERT INTO MessageRead(message_id, receiver_id) VALUES(5, 10)

为了获取读取id = 5的消息的用户数,您可以执行此查询:

SELECT COUNT(*) FROM MessageRead WHERE message_id = 5

并且,为了检查id = 10的用户是否读取了id = 5的消息,请执行以下查询:

SELECT COUNT(*) FROM MessageRead WHERE message_id = 5 AND receiver_id = 10

如果此查询的结果为1,则表示用户已阅读该消息,否则他尚未阅读该消息。

答案 2 :(得分:1)

1)您可以添加名为“users_reads”的字段,并在其中输入读取消息的用户ID,用逗号分隔。如何检查用户是否读取消息:

if (in_array($userId, explode(',', $row['users_reads']))) { ... }

2)您可以在数据库中添加新表'users_reads_messages',其中包含以下字段: - message_id - reader_id

3)您可以使用另一个reciever_id复制邮件,我的意思是您将单个用户ID放在此字段中,对于其他用户,您可以在表格中复制此邮件。

P.S。抱歉我的英文不好