snippetsqlModerate
How to create a flexible table schema for storing messages from different chats?
Viewed 0 times
chatscreatetableflexibledifferentmessagesforhowfromstoring
Problem
Help please solve the following situation:
There are two kinds of API where message history is stored, it's Zopim and Chat2Desc (import into Postman). While these two but can then others appear.
And my database with the
In Zopim, users are identified via email, and in Chat2Desc through the phone. For me, these two fields are important, whatever the chat was and how many would not be.
That is, if I receive an email or a user's phone in messages, I make a request to my database (
And in principle, even the structure of chat rooms is not important.I'll somehow choose them.And here's how to properly save them, so much so that I had one structure for everyone.
And that's what I came up with (Something I don't like, especially the
Explanation:
Table
Table
The users_id + unique_col bunch is unique (
Table chat_messages:
There are two kinds of API where message history is stored, it's Zopim and Chat2Desc (import into Postman). While these two but can then others appear.
And my database with the
users table:Table users
id , email, phone, ...In Zopim, users are identified via email, and in Chat2Desc through the phone. For me, these two fields are important, whatever the chat was and how many would not be.
That is, if I receive an email or a user's phone in messages, I make a request to my database (
table users) to identify my user.And in principle, even the structure of chat rooms is not important.I'll somehow choose them.And here's how to properly save them, so much so that I had one structure for everyone.
And that's what I came up with (Something I don't like, especially the
chat_clients table):Explanation:
Table
chats (Data for chat):client_id- indicates the id of thechat_clientstable
duration- the duration of the chat (120 seconds)
system_type- stores the name of the chat (Zopim, Chat2Desc, ...)
created_at- creation date
Table
chat_clients (information about users who were in the chat):is_agent- 0 | 1: 1 => my user, 0 => not my
user_id- is the user id. Contains either id from the users table or empty.
assigned_data- those initials under which users were in the chat
bean_module- it does not matter (information about my user)
unique_col- There will either be a email (from Zopim) or a phone (from Chat2Desc, Or I think to store the id of the users table). Will guarantee the uniqueness of the values.
The users_id + unique_col bunch is unique (
UNIQUE KEY user_id_unique_col_UQ (user_id, unique_col))Table chat_messages:
text- the text of the message.
client_id- indicates the id of the chat_clients table
chat_id- indicates the id of the table chats
file_id- indicates the id of the chat_files
Solution
All modern chatting interfaces, without exception, implement a hierarchical and a not-chronological schema for chat. That means you have to use (the soon to be released) MySQL 8, as prior versions do not support recursive CTEs which are required to do this. Any workaround can't permit infinite depth, which is usually required or at the very least nice to have.
Rather than drawing up a schema here, you can see what one looks like in PostgreSQL here, where I answered a similar question. Essentially, each message has
Moreover, you may wish to implement an array of tagged users or the like for better indexing.
Ultimately, if you're going to go down this route and you have no prior work, you should be using PostgreSQL -- which supports Recursive CTE's now, and sql-array's for easy tagging.
I'm not saying your schema has to look like those. You may have additional demands, but I wouldn't want to start off with an inferior feature set and the wrong tool.
For clarity this critique is specific to your
Other tables..
Or the like.
Rather than drawing up a schema here, you can see what one looks like in PostgreSQL here, where I answered a similar question. Essentially, each message has
id|parent_id the parent_id points to the id on the same table. This creates a hierarchy. We call this implementation of hierarchy "self-referential", or "single-table hierarchy."Moreover, you may wish to implement an array of tagged users or the like for better indexing.
Ultimately, if you're going to go down this route and you have no prior work, you should be using PostgreSQL -- which supports Recursive CTE's now, and sql-array's for easy tagging.
I'm not saying your schema has to look like those. You may have additional demands, but I wouldn't want to start off with an inferior feature set and the wrong tool.
For clarity this critique is specific to your
chat_messages table. The chat sessioning would be done by just creating a seperate table for it, and linking all messages to an entry in that table. For instance,CREATE TABLE chat_session (
chat_session_id int PRIMARY KEY
....
);Other tables..
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
);Or the like.
Code Snippets
CREATE TABLE chat_session (
chat_session_id int PRIMARY KEY
....
);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
);Context
StackExchange Database Administrators Q#192172, answer score: 12
Revisions (0)
No revisions yet.