我正在用PHP开发一个Facebook类型的消息系统。我有一个user_message
表,其中包含sender_id
,receiver_id
,message
和flag
作为已读/未读。在此表中插入值后,我将其设为未读,当用户单击消息通知时,状态将更新为 read 。
单用户工作正常。虽然向多个用户发送消息,但我在表中以逗号分隔值存储receiver_id
。我的问题是如何为多个接收器设置标志?例如,如果我向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_id
和receiver_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。抱歉我的英文不好