Aidez-nous à résoudre la situation suivante:
Il existe deux types d'API où l'historique des messages est stocké, c'est Zopim et Chat2Desc (importation dans Postman). Bien que ces deux-là, mais peuvent alors apparaître d'autres.
Et ma base de données avec la table users
:
Table users
id , email, phone, ...
Dans Zopim , les utilisateurs sont identifiés via email , et dans Chat2Desc via le téléphone . Pour moi, ces deux domaines sont importants, quel que soit le chat et combien ne le seraient pas.
Autrement dit, si je reçois un e-mail ou le téléphone d'un utilisateur dans des messages, je demande à ma base de données (table users
) D'identifier mon utilisateur.
Et en principe, même la structure des salles de chat n'est pas importante, je vais les choisir en quelque sorte, et voici comment les enregistrer correctement, à tel point que j'avais une structure pour tout le monde.
Et c'est ce que j'ai trouvé (quelque chose que je n'aime pas, en particulier la table chat_clients
):
Explication:
Table chats
(Données pour le chat):
client_id
- indique l'ID de la table chat_clients
duration
- la durée du chat (120 secondes)system_type
- stocke le nom du chat ( Zopim, Chat2Desc , ...)created_at
- date de création Tableau chat_clients
(Informations sur les utilisateurs qui ont participé au chat):
is_agent
- 0 | 1: 1 => mon utilisateur, 0 => pas monuser_id
- est l'ID utilisateur. Contient soit l'id de la table des utilisateurs, soit vide.assigned_data
- les initiales sous lesquelles les utilisateurs étaient dans le chatbean_module
- peu importe (informations sur mon utilisateur)unique_col
- Il y aura soit un e-mail (de Zopim) ou un téléphone (de Chat2Desc, ou je pense pour stocker l'identifiant de la table des utilisateurs). Garantira l'unicité des valeurs.Le groupe users_id + unique_col est unique (UNIQUE KEY user_id_unique_col_UQ (user_id, unique_col)
)
Tableau chat_messages:
text
- le texte du message.client_id
- indique l'ID de la table chat_clientschat_id
- indique l'ID des discussions de tablefile_id
- indique l'id de la table chat_filestransport
- la valeur sera pour Chat2Desc ( Viber, WhatsApp, ...), pour Zopim, donc ce n'est pas vide, ZopimTableau chat_files
Informations sur les fichiers transférés dans le chat. Les tableaux analogiques peuvent ne pas contenir d'informations supplémentaires.
À l'avenir, je vais sélectionner l'historique de la correspondance pour chaque utilisateur.
Q: Comment puis-je améliorer la structure des tableaux pour obtenir plus de flexibilité?
Merci d'avance.
Toutes les interfaces de discussion modernes, sans exception, implémentent un schéma hiérarchique et non chronologique pour le chat. Cela signifie que vous devez utiliser (la version qui sera bientôt publiée) MySQL 8, car les versions précédentes ne prennent pas en charge les CTE récursifs qui sont requis pour ce faire. Toute solution de contournement ne peut pas permettre une profondeur infinie, ce qui est généralement requis ou tout au moins agréable à avoir.
Plutôt que de dessiner un schéma ici, vous pouvez voir à quoi on ressemble à PostgreSQL ici, où j'ai répondu à une question similaire . Essentiellement, chaque message a id|parent_id
le parent_id
pointe vers id
sur la même table. Cela crée une hiérarchie . Nous appelons cette implémentation de la hiérarchie "auto-référentielle" ou "hiérarchie à table unique".
De plus, vous souhaiterez peut-être implémenter un tableau d'utilisateurs étiquetés ou similaires pour une meilleure indexation.
En fin de compte, si vous allez dans cette voie et que vous n'avez aucun travail préalable, vous devriez utiliser PostgreSQL - qui prend en charge les CTE récursifs maintenant et les tableaux sql pour un étiquetage facile.
Je ne dis pas que votre schéma doit ressembler à ceux-ci. Vous pouvez avoir des demandes supplémentaires, mais je ne voudrais pas commencer avec un ensemble de fonctionnalités inférieur et le mauvais outil.
Pour plus de clarté, cette critique est spécifique à votre chat_messages
table. La session de discussion se ferait en créant simplement une table séparée pour elle et en reliant tous les messages à une entrée de cette table. Par exemple,
CREATE TABLE chat_session (
chat_session_id int PRIMARY KEY
....
);
Autres 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
);
Ou semblable.
Base de données côté client
Très efficace pour minimiser les données stockées dans la base de données en conservant les données dans l'appareil comme WhatsApp et Viber. Pour l'application mobile, c'est le meilleur moyen de concevoir la base de données.
Base de données côté serveur
Les fournisseurs de chat Web pour la collaboration sur le marché comme Slack, Hipchat sont construits sur la base de données côté serveur. Pour la configuration basée sur les communautés en ligne, cela convient très bien.
Pour plus d'informations, voir ici .
Tout d'abord, la relation entre les tables chats
et chat_clients
Est dans le mauvais sens. Vous voulez plusieurs chat_clients
Par chats
, donc vous devez supprimer client_id
De la table chats
et ajouter chat_id
Au chat_clients
. Ce serait alors une clé étrangère pour chats(id)
.
De même, la relation entre chat_messages
Et chat_files
Est dans le mauvais sens - vous voulez (potentiellement) plusieurs fichiers par message. Supprimez donc chat_messages.file_id et ajoutez chat_files.chat_message_id, et faites-en une clé étrangère explicite.
Vous devez ajouter une colonne id (clé primaire) à la table users
et faire de chat_clients.user_id
Une clé étrangère.
À l'avenir, il se peut que vous ayez besoin de stocker plus d'informations, par exemple pour les utilisateurs. Vous pouvez ensuite ajouter des colonnes supplémentaires au fur et à mesure que les exigences deviennent plus claires (ce qui n'est généralement pas un problème, en particulier avec les bons outils tels que pt-online-schema-change ), ou vous pouvez anticiper ces exigences maintenant en l'ajout de colonnes plus générales que votre application doit ensuite "décoder" ou interpréter. Si vous utilisez MySQL 5.7+, vous pouvez même utiliser le type de données JSON et stocker les données JSON dans ces colonnes.