【问题标题】:Chat schema with one side deletion带有一侧删除的聊天模式
【发布时间】:2021-02-04 19:25:53
【问题描述】:

我正在努力使用允许从关系数据库 (PostgreSQL) 中对话的一侧删除的聊天模式。

这是我最好的方法:my schema

我发现的所有模式都是关于双方删除的,这不是我需要的。 我希望能够从对话的一侧删除,如果对话重新开始,用户 1 仍然拥有所有消息,而用户 2 只有那些在删除后发送的消息。 所以我的想法是建立多对多的关系表(deleted_messages),将消息与用户相关联,并在用户删除与该对话中的那些消息的对话时填充该表。

但是,我不确定这种方法是否是最好的方法,因为我的数据库需要查看是否没有针对检索到的每条消息删除消息。随着 deleted_messages 表的增长,这将变得越来越混乱,我担心性能。

我的问题有什么更好的解决方案,还是这种方法好? 感谢您的关注。

【问题讨论】:

    标签: sql database postgresql schema chat


    【解决方案1】:

    正如您提到的“如果对话重新开始,用户 1 仍然拥有所有消息,而用户 2 只有那些在删除后发送的消息”。这有两种情况:

    1. 如果用户删除了特定消息,那么您应该使用已有的架构。

    2. 如果用户删除了作为时间点参考的聊天记录,那么您应该创建单独的表格,如下所示。随着数据的增长,在单个用户的已删除消息中为每条消息创建一条记录将导致严重的性能问题。 创建下表并在获取数据时根据时间戳过滤数据。

      创建表deleted_chat_history ( 用户 ID 整数, chatRoomId int, [时间戳] 时间戳, 外键(userId)引用用户, 外键 (chatRoomId) 引用 chat_room )

    【讨论】:

    • 我根本不会创建另一个表,而是添加一列指示消息已被删除(称为逻辑删除),然后创建一个视图来消除这些消息。消息的实际删除将在标准消息归档处理期间完成。优点是维护较少,因为您只有 1 张桌子,并且如果需要,可以轻松翻转,
    • @Blayer 在这种情况下,您不能像 is_deleted 这样的标志,因为此消息不会被所有人删除。请记住,一个图表室可以有多个用户,例如 10 个用户,其中 3 个用户在不同时间点删除了消息历史记录,这与您的建议不符。
    • @Blayer 另外,更新假设 100000 行假设聊天历史中的对话将 is_deleted flat 设置为 1/true 会比仅插入 1 行并使用连接进行选择更关注性能。这种可逆过程也更容易,因为您不必为 1000 条消息切换标志,您只需从新表中删除一行。
    • 在这种情况下,您有一个 m:m,因此您可以标记分辨率表。
    • @Belayer 分辨率表是什么意思?你能从上面提到的架构链接中命名它吗?
    猜你喜欢
    • 2016-04-21
    • 1970-01-01
    • 2021-11-27
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多