我在消息系统上工作。在此消息系统管理员可以向单个用户,用户组或所有用户发送消息,用户只能看到消息。
知道我想在用户面板中找到未读消息。
我设计了两个这样的数据库表:
1- msg_messages:
| id | title | messages | date | status |
2- msg_control:
| id | message_id | from | toUser | toGroup | status |
知道我想到了这两种保存看到消息的用户的方法
方法1:使用reader id创建一个字符串如下所示:1,5,9,12,...
并使用Strpos
php函数或in_array
函数检查用户ID。
方法2:创建一个如下表所示的新表,并将读者ID保存在:
| id | message_id | readers_id | date |
这两种方法中哪一项更好?
user
表添加了一个新列,并将其命名为read_msg
。系统会在此字段中为每个用户保存此message_id
字符串中的读取1,5,9,12,98,125,...
(此字段中的message_id
引用msg_control
表)以及何时我们要查找未读消息只需要将msg_control
ID与此字段进行比较。 strpos
来比较read_msg
和message_id
,因为它比is_array
(reference)更快。
答案 0 :(得分:1)
我曾经实现过一个小型的消息传递系统,并将其结构如下(但它可能不完美,并且有多种可能性):
标签对话
ID | Conv Title | ... master data
参与者
UserId | ConversationID | lastRead
MessageHeaders
ConversationID | messageID | ... use your "inbox"-schema here. You can remove the toUser/toGroup etc. fields as this is covered using the participants table.
使用消息的时间戳和用户进行对话的"最后读取" -timestamp,您可以确定哪些消息是新的/未读的,哪些不是。 使用第一个建议中的结构可能会变得非常低效。在我看来,存储数据atomar被认为是一种很好的做法。这意味着单个字段中没有多个值。