如何创建灵活的表模式来存储来自不同聊天的消息?

Van*_*yan 8 mysql database-design disk-structures

请帮助解决以下情况:

存储消息历史记录的 API 有两种,它们是ZopimChat2Desc导入到 Postman 中)。而这两个却可以接着其他的出现。

我的数据库与users表:

Table users
id , email, phone, ...
Run Code Online (Sandbox Code Playgroud)

Zopim 中,用户通过电子邮件进行识别,在Chat2Desc 中通过电话进行识别。对我来说,这两个领域很重要,无论聊天是什么,有多少不是。

也就是说,如果我在消息中收到电子邮件或用户的电话,我会向我的数据库 ( table users)发出请求以识别我的用户。

而且原则上,即使聊天室的结构也不重要。我会以某种方式选择它们。以下是如何正确保存它们的方法,以至于我为每个人提供了一个结构。

这就是我想出的(我不喜欢的东西,尤其是chat_clients桌子): 在此处输入图片说明

解释:

chats(聊天数据):

  1. client_id -表示的IDchat_clients
  2. duration - 聊天时长(120 秒)
  3. system_type- 存储聊天的名称(Zopim、Chat2Desc等)
  4. created_at - 创立日期

表格 chat_clients(聊天中的用户信息):

  1. is_agent - 0 | 1: 1 => 我的用户,0 => 不是我的
  2. user_id - 是用户 ID。包含用户表中的 id 或为空。
  3. assigned_data - 用户在聊天中使用的首字母缩写
  4. bean_module - 没关系(关于我的用户的信息)
  5. unique_col - 将有电子邮件(来自 Zopim)或电话(来自 Chat2Desc,或者我认为存储用户表的 ID)。将保证值的唯一性。

users_id + unique_col 串是唯一的 ( UNIQUE KEY user_id_unique_col_UQ (user_id, unique_col))

表 chat_messages:

  1. text - 消息的文本。
  2. client_id - 表示 chat_clients 表的 id
  3. chat_id - 表示表聊天的ID
  4. file_id - 表示 chat_files 表的 id
  5. transport - 该值将用于 Chat2Desc(Viber、WhatsApp、 ...)、用于 Zopim,因此它不是空的,Zopim

Tablechat_files有关聊天中传输文件的信息。类比表可能不存储附加信息。

将来,我将为每个用户选择通信历史。

问:如何改进表的结构以获得更大的灵活性?

先感谢您。

Eva*_*oll 11

所有现代聊天界面,无一例外,都为聊天实现了分层和无时间顺序的模式。这意味着您必须使用(即将发布的)MySQL 8,因为之前的版本不支持执行此操作所需的递归 CTE。任何解决方法都不能允许无限深度,这通常是必需的,或者至少是很好的。

您可以在此处查看 PostgreSQL 中的架构,而不是在此处绘制模式,我在此处回答了一个类似的问题。从本质上讲,每个消息具有id|parent_idparent_id指向id在同一个表。这会创建一个。我们称这种层次结构的实现为“自引用”或“单表层次结构”。

此外,您可能希望实现一组标记的用户等,以便更好地索引。

最终,如果您要沿着这条路线走下去并且您没有以前的工作,那么您应该使用 PostgreSQL——它现在支持递归 CTE,以及用于轻松标记的 sql-array。

我并不是说您的架构必须看起来像那些。您可能有其他要求,但我不想从劣质的功能集和错误的工具开始。

为清楚起见,此批评是针对您的chat_messages表的。聊天会话只需为其创建一个单独的表,并将所有消息链接到该表中的一个条目即可完成。例如,

CREATE TABLE chat_session (
  chat_session_id  int  PRIMARY KEY
  ....
);
Run Code Online (Sandbox Code Playgroud)

其他表..

CREATE TABLE chat_message (
  ts                             timestamp with time zone,
  chat_message_id                int PRIMARY KEY,
  chat_message_parent_id         int REFERENCES chat_message,
  chat_message_author_user_id    int REFERENCES user,
  chat_message_author_client_id  int REFERENCES client
);
Run Code Online (Sandbox Code Playgroud)

或者之类的。