将数组保存在数据库的一个字段中或将每个值保存在分隔的字段中?

时间:2014-09-04 18:33:30

标签: php mysql database message

我在消息系统上工作。在此消息系统管理员可以向单个用户,用户组或所有用户发送消息,用户只能看到消息。 知道我想在用户面板中找到未读消息。 我设计了两个这样的数据库表:
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 |

这两种方法中哪一项更好?


查找未读邮件的新方法......

在仔细思考这个问题之后,我决定通过组合方法1和方法2来使用新方法。实际上我向user表添加了一个新列,并将其命名为read_msg。系统会在此字段中为每个用户保存此message_id字符串中的读取1,5,9,12,98,125,...(此字段中的message_id引用msg_control表)以及何时我们要查找未读消息只需要将msg_control ID与此字段进行比较。
我们使用strpos来比较read_msgmessage_id,因为它比is_arrayreference)更快。

1 个答案:

答案 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被认为是一种很好的做法。这意味着单个字段中没有多个值。