7
votes

Stocker des messages de discussion dans une table MySQL

Au cours des deux dernières semaines, je travaille sur une application cliente Web basée sur le Web et j'ai une question concernant le stockage des messages de discussion dans une table MySQL. J'ai créé une table appelée conversations et pour l'instant il se compose de 5 champs;

user1id, user2ID, messages (moyentext), statut, horodatage.

Lorsque je teste la demande de discussion, tout fonctionne parfaitement, mais le problème est à chaque fois qu'un utilisateur envoie quelque chose, je suis ajouté à cette valeur dans mon champ "Messages" comme une nouvelle ligne. Et quand il s'agit de récupérer le message, mon code SQL lit le tout et le montrer à l'utilisateur correspondant. Donc, la quantité de données augmente linéairement par la quantité de texte ajoutée dans le champ Messages. Ma question est de ne pas choisir la dernière ligne d'un champ de texte ou peut-être une autre solution qui réduira la quantité de données transférées.


1 commentaires

Ajoutez-vous votre message à un champ existant dans la seule ligne d'une table ??? O_o


3 Réponses :


4
votes

Pourquoi ne pas avoir une structure de table comme ceci:

chats

  • chatid
  • user1ID
  • user2ID
  • DémargéDateTetime
  • EndedDateTetime

    chatContent

    • ChatContentiD
    • chatid
    • Message
    • DateTime
    • Statut

      De cette façon, vos données sont beaucoup plus faciles à rechercher et à organiser. Par exemple, que si vous vouliez obtenir un certain message parlé à X fois? ou vous voulez obtenir tous les messages de discussion avec le statut X?

      séparation des données dans 2 tables devrait être beaucoup plus agréable et NATURE.


3 commentaires

Merci beaucoup. J'essayais d'utiliser un nombre minimum de tables et de domaines, c'est pourquoi je l'ai fait comme ça, mais il semble que ce n'était pas une bonne solution


Cela peut être utile de mettre à jour votre schéma pour vous sauver des maux de tête dans la piste.


En fait, vous pouvez obtenir les mêmes résultats si vous combinez les tables en une. La table combinée aura un message_ID qui est PK et AI et contiendra également un champ de message_sent_timestamp et, puisque vous avez un AI, vous pourrez savoir quand a été envoyé le premier message et cela est bien sûr le "DémarkDateTime". La même chose va à "EndedDateTime" - La dernière ligne de Message_ID contiendra cette date. La question que vous devez vous demander est "y a-t-il un important pour une table de discussion? Si oui, qu'est-ce qui est si important dans une discussion que j'en ai besoin pour être une table?"



0
votes

envisagez de stocker un message par ligne dans la table:

ID, User1ID, User2ID, message, statut, horodatage

où l'identifiant est une colonne d'autocrampe.


0 commentaires

20
votes

Vous avez besoin d'un meilleur schéma de DB - plus relationnel. Cela vous donnera également d'autres améliorations également (chats protégés par mot de passe et chat multi-utilisateur pour nommer un couple)

Voici une ED pour votre DB. P>

 Entrez la description de l'image ici p>


5/6/2016 Modifier Ajout de DDL avec des types de champs et des noms améliorés (espérons-le) P>

CREATE TABLE user
(
    user_id CHAR(32),
    user_login VARCHAR(255),
    user_password CHAR(64),
    user_email VARCHAR(400),
    PRIMARY KEY (user_id)
);

CREATE TABLE message
(
    message_id CHAR(32),
    message_datetime DATETIME,
    message_text TEXT,
    message_chat_id CHAR(32),
    message_user_id CHAR(32),
    PRIMARY KEY (message_id)
);

CREATE TABLE user_chat
(
    user_chat_chat_id CHAR(32),
    user_chat_user_id CHAR(32),
    PRIMARY KEY (user_chat_chat_id,user_chat_user_id)
);

CREATE TABLE chat
(
    chat_id CHAR(32),
    chat_topic VARCHAR(32),
    chat_password CHAR(64),
    user_chat_user_id CHAR(32),
    PRIMARY KEY (chat_id)
);

CREATE INDEX user_login_idx ON user (user_login);
ALTER TABLE message ADD FOREIGN KEY message_chat_id_idxfk (message_chat_id) REFERENCES chat (chat_id);

ALTER TABLE message ADD FOREIGN KEY message_user_id_idxfk (message_user_id) REFERENCES user (user_id);

ALTER TABLE user_chat ADD FOREIGN KEY user_chat_user_id_idxfk (user_chat_user_id) REFERENCES user (user_id);

ALTER TABLE chat ADD FOREIGN KEY chat_id_idxfk (chat_id,user_chat_user_id) REFERENCES user_chat (user_chat_chat_id,user_chat_user_id);


4 commentaires

Il existe quelques façons différentes de faire la limitation des données transférées: 1. Limitez les données aux dernières minutes X max. OU 2, envoyez uniquement des données de message depuis la dernière dateTime que vous fournissez au script de rafraîchissement.


Merci d'avoir accepté ma réponse. Demandez plus de questions ici si vous avez besoin. :)


@Timg Peut-être que vous avez déjà un ensemble de requêtes pour ce schéma de chat? Ce sera très utile.


@Dmytromedvid - Fait. J'ai mis à jour légèrement le schéma avec ce que j'espère des améliorations. Le DDL devrait fonctionner correctement dans MySQL