用于在人与人之间存储聊天消息的数据库

时间:2011-11-12 16:50:27

标签: mysql database database-design database-schema

我正在尝试构建一个消息/聊天系统。它可以按时间顺序存储两个人之间的对话。此外,如果用户A删除了对话,则用户B仍然应该访问该对话,直到他希望删除它们为止。

  1. 收件箱 - 用户从各个用户收到的所有邮件都将显示该特定帖子的最新消息。

  2. 对话屏幕 - 用户A与用户B之间会话的时间顺序

  3. 这是我提出的数据库的基本结构。我应该在数据库中存储两次消息吗?

    1. ID
    2. to_id
    3. from_id
    4. 消息
    5. 时间戳

3 个答案:

答案 0 :(得分:8)

我会使用查找表来存储有权查看该消息的消息

table->message                   |    table->messageUsers
id->0, message->'hi', user_id->1      user_id->1, message_id->0
                                      user_id->2, message_id->0

这样,如果用户删除他们的消息,他们实际上只是删除他们与消息的关系而不是消息本身。你只需从messageUsers表中删除它们。或将活动字段设置为1或0.

答案 1 :(得分:2)

起初我认为,当一个人删除它时,您可以将To或From转为null,但这会让您失去发送邮件的人或邮件的发送对象。

你应该只添加一个字段deleted_by,其中包含删除它的人的id或者为null。因此,当从收件箱中选择记录时,您会有以下内容:

选择*来自其中to_id = MyID和deleted_by<>的消息MYID

删除邮件时检查deleted_by是否为空,如果是,则更新带有MyID的deleted_by字段,如果不是(表示对方也删除了它),则删除记录。

如果你想为线程而不是消息提供相同的功能(即管理对话而不是一次管理一条消息),你应该有另一个表(MessageThreads),你在其中有from_id,to_id字段,deleted_by以及一个thread_id字段。在Messages表中,您使用thread_id替换from_id to_id和deleted_by。

答案 2 :(得分:1)

将有两张桌子。 节点 node_user

在节点表中,

  • NODE_ID
  • 标题
  • 消息
  • 时间戳

在node_user表中,

  • node_user_id(PK)
  • NODE_ID
  • parent_node_id(用于线程)
  • from_id
  • to_id
  • 时间戳

当用户A向用户B发送消息时,首先将消息存储在节点表中。然后,在node_user表中添加两条记录。当用户A删除该消息时,只删除node_user表中的第一条记录。 当用户B删除该消息时,您可以从两个节点和node_user表中删除记录。

线索消息,

  • 使用parent_node_id