2011-11-12 119 views
14

我想构建一个消息/聊天系统。它可以按时间顺序存储两个人之间的对话。同样,如果用户A删除对话,用户B仍然应该访问对话,直到他希望删除它们。用于存储人与人之间的聊天消息的数据库设计

  1. 收件箱 - 用户从各个用户收到的所有消息都将显示来自该特定线程的最新消息。

  2. 对话屏幕 - 在用户A和用户B

这是数据库我已经想出的基本结构之间的对话的时间顺序。我应该在数据库中存储两次消息吗?

  1. ID
  2. to_id
  3. from_id
  4. 消息
  5. 时间戳
  6. 阅读
+0

我不明白为什么人们会给我一个投票的问题:( –

回答

7

我会用一个查找表,将储存谁的权利,如果用户删除自己的信息,他们实际上只是删除了该消息的关系不是以查看该消息

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.

+0

如果我删除让我们说用户1消息。用户2将如何知道该消息来自用户1,而不是用户3或4? –

+0

我更新了答案。所以你只需要在消息表中存储'user_id'就是创建消息的用户的ID。例如,如果message-> user_id = 1,并且在messageUsers中删除了用户1读取该消息的能力,则用户2仍然会看到该消息以及是谁创建的。 –

+0

这也假设你正在创建一个关系数据库...希望你是。 –

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
+0

为什么我需要存储消息三次? –

+0

对不起,我忘了删除消息列在node_user表中,我将编辑,你不需要存储消息三次,只需要在节点表中存储一次,使用node_user表存储发送者和接收者,如果你稍后添加CC和BCC功能,也可以工作。 –

+0

我修改了我的问题......以清楚地说明我的需求。猜测调用收件箱是不合适的。非常感谢 –

1

起初我认为,当一个人删除它,你可能只是转折的收件人或发件人为空,这将使你失去谁送的消息或向其发送的人。

您应该只添加一个字段deleted_by,其中将包含删除它的人的ID或将为null的字段。因此,从收件箱中选择记录,当你有这样的:

SELECT * FROM消息,其中to_id =本身份识别码和DELETED_BY <>身份识别码

当您删除您检查消息,如果DELETED_BY为空,如果是你用MyID更新deleted_by字段,如果不是(意味着另一方也删除它),则删除该记录。

如果您希望线程具有相同的功能而不是消息(即管理对话,而不是一次处理一个消息),则应该有另一个表(MessageThreads),其中有from_id,to_id字段,deleted_by带有一个thread_id字段。在Messages表中,您使用thread_id替代from_id to_id和deleted_by。

相关问题