【问题标题】:Database Design for storing Chat Messages between people用于存储人与人之间聊天消息的数据库设计
【发布时间】:2011-11-13 02:08:00
【问题描述】:

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

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

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

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

  1. 身份证
  2. to_id
  3. from_id
  4. 留言
  5. 时间戳
  6. 阅读

【问题讨论】:

  • 我不明白为什么人们对我的问题投反对票:(

标签: mysql database database-design database-schema


【解决方案1】:

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

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 如何知道消息来自用户 1 而不是来自用户 3 或 4?
  • 我更新了答案。因此,您只需在消息表中存储 user_id 是创建消息的用户的 ID。例如,如果 message->user_id = 1 并且在 messageUsers 中您删除了用户 1 阅读该消息的能力,那么用户 2 仍将看到该消息及其创建者。
  • 这也是假设您正在创建一个关系数据库...希望您是。
【解决方案2】:

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

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

Select * From Messages where to_id = MyID and deleted_by MyID

当你删除消息时检查deleted_by是否为空,如果是你用MyID更新deleted_by字段,如果不是(意味着对方也删除了它)你删除记录。

如果您希望线程而不是消息具有相同的功能(即管理对话而不是一次管理一条消息),您应该有另一个表(MessageThreads),其中包含 from_id、to_id 字段、deleted_by 以及一个 thread_id 字段。在 Messages 表中,您将 from_id to_id 和 deleted_by 替换为 thread_id。

【讨论】:

    【解决方案3】:

    将有两张桌子。 节点 节点用户

    在节点表中,

    • 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

    【讨论】:

    • 为什么要存储三遍消息?
    • 对不起。我忘了删除 node_user 表中的消息列。我会编辑。您不需要存储消息三次。仅在节点表中一次。使用 node_user 表来存储发送者和接收者。如果您稍后添加 CC 和 BCC 功能,它也将起作用。
    • 我已经修改了我的问题...以明确说明我的需求。猜测调用收件箱是不合适的。非常感谢
    • 更正了错误的表名“只删除node_user表中的第一条记录”。删除用户 A 到用户 B 的对话。用户 B 仍然可以访问对话
    • 我想甚至可以省略时间戳,而且我们需要第一个表的作者 ID
    猜你喜欢
    • 2023-03-05
    • 2011-09-10
    • 2023-03-24
    • 2016-12-04
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    相关资源
    最近更新 更多