【问题标题】:Save array in one field of database or save each value in separated field?将数组保存在数据库的一个字段中还是将每个值保存在单独的字段中?
【发布时间】:2014-09-04 18:33:29
【问题描述】:

我在一个消息系统上工作。在此消息系统中,管理员可以向单个用户、用户组或所有用户发送消息,并且用户只能看到消息。 知道我想在用户面板中查找未读消息。 我设计了两个这样的数据库表:
1- msg_messages :
| id | title | messages | date | status |

2- msg_control :
| id | message_id | from | toUser | toGroup | status |

知道我考虑了这两种保存看到消息的用户的方法。
方法1:创建一个带有读者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_array (reference) 快。

【问题讨论】:

  • 两者都可以,随着表变大,性能会更高,但不要在 php 中使用 strposin_array,如果您使用的是集合,您可能希望使用 MySQLs NOT FIND_IN_SET(1, readers)查找未读消息。

标签: php mysql database message


【解决方案1】:

我曾经实现了一个小型消息传递系统,并将它的结构如下(但它可能并不完美,并且有多种可能性):

标签对话

ID | Conv Title | ... master data

参与者

UserId | ConversationID | lastRead

消息头

ConversationID | messageID | ... use your "inbox"-schema here. You can remove the toUser/toGroup etc. fields as this is covered using the participants table.

使用消息的时间戳和用户的“上次阅读”时间戳进行对话,您可以确定哪些消息是新的/未读的,哪些不是。 使用第一个建议中的构造可能会变得非常低效。在我看来,存储数据原子被认为是一种很好的做法。这意味着单个字段中没有多个值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多