IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Schéma Discussion :

Messagerie interne, MDP correct ? [MPD]


Sujet :

Schéma

  1. #1
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut Messagerie interne, MDP correct ?
    Bonjour ,

    Tout d'abord je tenais à vous remercier pour les précédentes réponses que vous m'avez apporté sur cette même section. Grâce à votre aide sur mon MCD précédent, le développement s'est déroulé à peu près sans encombre et sans mauvaise surprise, ce qui m'a fait gagné un temps précieux !

    Toutefois, j'aimerais avoir votre avis sur un système de messagerie interne.

    Voici les pré-requis :

    - Je dispose de deux types d'utilisateurs qui hérite d'une classe de base (au niveau de la base de donnée, cela se modélise par trois tables : une table "User" qui contient un champ "discriminant" qui, en fonction du type d'utilisateur, va faire une jointure pour récupérer les autres données associées au type d'utilisateur). Appelons les A et B.

    - Seul l'utilisateur de type A peut créer un fil de discussion vers un utilisateur B. A aucun moment l'utilisateur B ne peut créer une discussion avec A.

    - Une discussion contient plusieurs messages.

    - Les discussions peuvent avoir un statut tel que "lu", "non lu", "favoris" ou "supprimé", seulement ces statuts peuvent être différent chez les deux utilisateurs. De ce fait, si l'utilisateur A marque la discussion en favori, elle ne doit pas l'être chez l'utilisateur B pour la même discussion.


    Ceci étant dit, je suis arrivé au schéma de table suivant :

    Discussion : id (clé primaire), sujet
    UtilisateurDiscussion : utilisateur_id (clé primaire et clé étrangère), discussion_id (clé primaire et clé étrangère), dateDernierMessageLu, status
    Message : : id (clé primaire), utilisateur_id (index, clé étrangère), thread_id (index, clé étrangère), contenu, dateDeCreation.


    Concrètement, lorsqu'une discussion est créée, je créé une nouvelle discussion ainsi qu'un premier message (qui est forcément créé par un utilisateur de type A, mais après tout cela ne pose pas de soucis car les deux types d'utilisateurs partagent une table en commun), et je remplis également la table de jointure UtilisateurDiscussion (qui permet justement d'avoir la fonctionnalité d'indépendance au niveau du statut).

    Je voudrais savoir si cela est la meilleure manière de faire. En l'état, c'est très pratique. Si je souhaite par exemple afficher toutes les discussions auxquelles participent un utilisateur A ou B, je récupère la ligne correspondante dans la table UtilisateurDiscussion et je fais une jointure sur la table Discussion.

    Merci de vos avis :jap:.

  2. #2
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Bonjour Bakura,

    En préambule, bravo pour tes contributions !... je ne suis pas un fan des jeux vidéo, mais bon, tes articles ont dû te prendre pas mal de temps.

    Concernant le sujet du fil, vite fait, il me semble que l'association doit être faite au niveau "Message", et non au niveau "Discussion" ; via le message, de toutes manières, tu peux "remonter" à la discussion sans problème.

    Donc :
    UtilisateurDiscussion UtilisateurMessage : utilisateur_id (clé primaire et clé étrangère), discussion_id message_id (clé primaire et clé étrangère), status, dateDernierMessageLu, dateStatut (vide, si non lu).

    Juste une remarque, sur le fond, un champ calculé ne devrait jamais être stocké. Donc :
    Citation Envoyé par Bakura
    UtilisateurDiscussion : utilisateur_id (clé primaire et clé étrangère), discussion_id (clé primaire et clé étrangère), dateDernierMessageLu, status
    ==> dateDernierMessageLu est un champ "calculé" retrouvable en temps réel : le stockage de l'information n'est donc pas nécessaire. Mais le problème ne se pose pas si tu es d'accord sur l'association UtilisateurMessage plutôt que sur celle UtilisateurDiscussion.

    J'ajouterais :
    Discussion : id (clé primaire), sujet, #id_user_creation

    Ce qui donnerait :
    Utilisateur ---(0,n)---[a créé les discussions]---(1,1) Discussion ;
    Discussion ---(1,n)---[contient les messages]---(1,1) Message ;
    Utilisateur ---(0,n)---[participe aux messages]---(1,n) Message ;
    donc :
    Utilisateur ---(0,n)---[participe aux messages]---(1,1) UtilisateurMessage ;
    Message ---(1,n)---[concerne les utilisateurs]---(1,1) Utilisateur.
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  3. #3
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Salut,


    En préambule, bravo pour tes contributions !... je ne suis pas un fan des jeux vidéo, mais bon, tes articles ont dû te prendre pas mal de temps.
    Merci. Mais ces tutoriaux ont quelques années maintenant, ils sont un peu dépassés :o... La programmation de jeux vidéo ne m'intéresse plus autant qu'avant.



    Concernant ta réponse, je suis pas convaincu. Ta table UtilisateurMessage, cela signifie que pour chaque message je dois rentrer une entrée dans la table. Alors qu'actuellement, je créé deux entrées dans ma table UtilisateurDiscussion PAR discussion.

    En fait, le système fonctionne vraiment par "discussion", et non par message, un peu comme sur GMail. On ne peut donc pas voir un message sans voir la discussion. Ce qui signifie qu'à l'heure actuelle, si par exemple l'utilisateur A a créé une discussion avec l'utilisateur B, et que je souhaite afficher dans la messagerie de l'utilisateur B toutes les discussions auquel il participe, il me suffit de récupérer toutes les entrées de la table UtilisateurDiscussion. Là avec Message, j'aurais une liste de messages, ce qui ne m'avance pas à grand chose puisque je souhaite afficher les sujets des discussion.

    Quant à la dateDernierMessageLu, cela me permet de faire une comparaison rapide. Je compare la dateDerneirMessageLu avec la date du dernier message effectivement dans la discussion. Si celle-ci est inférieur à cette date, alors ça veut dire que l'utilisateur n'a pas ouvert cette discussion et n'a donc pas lu tous les messages. En l'ouvrant, dateDernierMessageLu prendra la valeur de la date du dernier message posté dans la discussion.

    Je ne sais pas si je suis clair, ou alors j'ai mal compris ta proposition.

  4. #4
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    C'est peut-être moi qui ai mal compris.

    La relation :
    Discussion ---(1,n)---[contient les messages]---(1,1) Message
    est-elle correcte ?
    Cela veut que l'on ne peut créer un message qu'en entrant, d'abord, par la discussion (un peu comme sur ce forum, à part que les messages ne sont pas personnalisés au couple utilisateur_A/utilisateur_B).

    Ou alors serait-ce un tchat par sujet (discussion) où, seuls les utilisateurs du couple utilisateur_A/utilisateur_B parlent entre eux ?

    D'autre part,
    Citation Envoyé par Bakura
    .../... cela signifie que pour chaque message je dois rentrer une entrée dans la table .../...
    ==> vu la structure de ta table Message, tu le fais déjà, non ?
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  5. #5
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    C'est exactement comme sur ce forum, on ne peut visualiser un message sans rentrer dans une discussion. Sauf que dans mon système il n'y a que deux intervenants possibles et que c'est uniquement un type d'utilisateur (le type A) qui peut ouvrir des discussions avec uniquement l'autre type d'utilisateur (le type B).


    ==> vu la structure de ta table Message, tu le fais déjà, non ?
    Oui. Mais avec ta table UtilisateurMessage, ça veut dire que chaque Message entré implique : une nouvelle ligne dans la table Message et deux nouvelles lignes pour la table UtilisateurMessage.

    La en fait ce qu'il se passe, c'est que lorsqu'une discussion est créée, je créée une entrée dans Discussion, une entrée dans Message (avec le contenue du premier message, une discussion sans Message n'a pas de sens), et deux entrées dans UtilisateurDiscussion (pour les deux protagonistes).

    En fait, j'ai également un soucis pour récupérer de manière simple le nom de l'autre utilisateur qui intervient dans la discussion.

    Par exemple, dans l'onglet Messagerie de l'utilisateur B, disons que je récupère toutes les discussions ou il a participé, c'est simple. Par contre, pour chaque discussion, j'aimerais afficher son nom à lui (ça c'est facile), mais également le nom de l'autre utilisateur de la discussion. C'est pas forcément compliqué mais ça implique pas mal de requêtes ...

    Bref. Pour l'instant mon système est le plus simple, mais je suis pas à 100% satisfait .

    Et effectivement comme ut le dis, stocké la date du dernier message lu dans la table UtilisateurDiscussion c'est pas le meilleur moyen mais c'est le seul que je vois qui soit simple à mettre ne place.

  6. #6
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Tu parles souvent de concevoir ta base de données pour simplifier tes processus... ce n'est pas la bonne méthode.

    Il faut partir d'un modèle de données "béton" (MCD) pour attaquer les processus (la programmation). Sinon, tes éventuelles erreurs de conception devront être résolues par du code, ce qui, en terme de conception et de maintenance, n'est vraiment pas l'idéal.

    Juste une précision : quand un utilisateur crée une discussion (utilisateur de type A, donc), doit-il indiquer, de suite, qu'il veut discuter avec tel utilisateur (de type A ou B, donc) ?
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  7. #7
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Citation Envoyé par Richard_35 Voir le message
    Tu parles souvent de concevoir ta base de données pour simplifier tes processus... ce n'est pas la bonne méthode.

    Il faut partir d'un modèle de données "béton" (MCD) pour attaquer les processus (la programmation). Sinon, tes éventuelles erreurs de conception devront être résolues par du code, ce qui, en terme de conception et de maintenance, n'est vraiment pas l'idéal.
    Oui oui je sais bien. Comme je l'avais dit sur un autre topic, je crois que les MCD et compagnie c'est la seule et unique chose qui m'a vraiment servi parmi tout ce que j'ai appris pendant ces trois premières années en école d'igné .

    Honnêtement j'avais bien planifié mon MCD dès le début et ça m'a fait gagné un temps précieux et surtout mes bases de données sont vraiment bien conçues (avant, je ne savais même pas qu'on pouvait faire des tables de jointures ni ce qu'était des clés étrangères ). Le seul problème c'était ce truc de messagerie (même si ma solution actuelle marche très bien).

    Juste une précision : quand un utilisateur crée une discussion (utilisateur de type A, donc), doit-il indiquer, de suite, qu'il veut discuter avec tel utilisateur (de type A ou B, donc) ?
    Oui, toujours. En fait, l'utilisateur A reçoit des candidatures de l'utilisateur B, et s'il souhaite avoir des informations complémentaires sur le profil de B, il peut lui envoyer un message privé (en fait, ouvrir une discussion avec l'utilisateur B avec un premier message).

  8. #8
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Bonjour Bakura,

    Citation Envoyé par Bakura
    Oui, toujours. En fait, l'utilisateur A reçoit des candidatures de l'utilisateur B, et s'il souhaite avoir des informations complémentaires sur le profil de B, il peut lui envoyer un message privé (en fait, ouvrir une discussion avec l'utilisateur B avec un premier message).
    ==> c'est le processus qui créé, automatiquement, la discussion et le premier message.
    Citation Envoyé par Bakura
    ouvrir une discussion avec l'utilisateur B avec un premier message)
    ==> donc, nous sommes d'accord. La relation
    Discussion ---(1,n)---[contient les messages]---(1,1) Message
    est correcte.

    Il semble, donc, que ce soit l'entité Discussion qui comporte les attributs "Utilisateur ayant créé la discussion (type A)" et "Utilisateur interlocuteur de la discussion (type B)". L'entité Message comportant l'attribut "Utilisateur créateur du message".

    A ce propos, un utilisateur de type A ne doit pas pouvoir créer une discussion avec un autre utilisateur de type A, non ?
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  9. #9
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Citation Envoyé par Richard_35 Voir le message
    Il semble, donc, que ce soit l'entité Discussion qui comporte les attributs "Utilisateur ayant créé la discussion (type A)" et "Utilisateur interlocuteur de la discussion (type B)". L'entité Message comportant l'attribut "Utilisateur créateur du message".
    Hmmm effectivement, insérer l'attribut "créateur", "receveur" dans Discussion simplifierait les choses. Mais je suis quand même obligé d'avoir l'entité "DiscussionUtilisateur" pour pouvoir faire en sorte que la discussion évolue de manière indépendante suivant les deux interlocuteurs (supprimé, favoris, lue, non lue...), vrai ?

    A ce propos, un utilisateur de type A ne doit pas pouvoir créer une discussion avec un autre utilisateur de type A, non ?
    Toutafay !

  10. #10
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Citation Envoyé par Bakura
    Mais je suis quand même obligé d'avoir l'entité "DiscussionUtilisateur" pour pouvoir faire en sorte que la discussion évolue de manière indépendante suivant les deux interlocuteurs (supprimé, favoris, lue, non lue...), vrai ?
    ==> eh bien, non. Il me semble que les valeurs que tu indiques ne sont pas "au même niveau". Il faudrait, d'ailleurs, en établir la liste exhaustive. A partir de ton exemple :
    • supprimé
      ==> niveau discussion et niveau message, non ?
      ==> un message peut être supprimé, mais pas la discussion. En revanche, une discussion supprimée implique que tous ses messages soient supprimés.

    • favoris
      ==> niveau discussion, non ?
      ==> à noter, qu'il ne s'agit pas du même type de valeur : "favori" ET "non lu" devrait être possible.

    • lue/non lue
      ==> niveau message, non ?
      ==> à l'intérieur d'une discussion, un certain nombre de message peuvent être non lus (les derniers) et d'autres lus (les autres). Une discussion "lue" serait une discussion dans laquelle au moins un message serait lu (à affiner).
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  11. #11
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Merci du temps que tu passes en tout cas .

    Alors non, je ne vais pas "aussi" loin, et tout ce fait par discussion.

    Suppression : on ne peut pas supprimer un message, mais juste une discussion. En fait, pour certaines raisons, on ne supprime pas vraiment en base les discussions (on les garde, même si des deux côtés les utilisateurs l'ont supprimée), donc je ne dois fonctionner que par "flag".

    Donc suppression : on peut supprimer une discussion, ce qui fait qu'on ne pourra plus y accéder et, par conséquent, on ne pourra plus accéder aux messages de la discussion.


    Favoris : niveau discussion. Je suis d'accord, favori et non lu devrait être possible (et doit être possible même). J'ai pensé à un champ "statut" et jouer avec les opérations sur les bits et les masques pour encoder les différents états dans une seule et même variable (oui, désolé encore de penser davantage niveau code que modélisation ).

    Lue/non lue : non, niveau discussion. En fait, quand un nouveau message arrive, la discussion est marquée non lue (via la comparaison sur la date). Si on ouvre la discussion, hop la discussion est marquée comme lue automatiquement.

  12. #12
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    OK, ça s'éclaire... sauf pour le lu/non lu.

    Citation Envoyé par Bakura
    Lue/non lue : non, niveau discussion. En fait, quand un nouveau message arrive, la discussion est marquée non lue (via la comparaison sur la date). Si on ouvre la discussion, hop la discussion est marquée comme lue automatiquement.
    ==> donc :
    - un utilisateur A, ouvre une discussion avec un utilisateur B en créant le premier message ;
    - ce même utilisateur A ouvre cette même discussion ;
    ==> la discussion est considérée comme "lue" alors que l'utilisateur B ne l'a même pas ouverte !...
    A mon sens, s'il existe au moins un message non lu dans la discussion, alors il faut indiquer la discussion comme non lue (comme le fait ce forum pour les abonnements) : une simple requête (dynamique, donc) suffit.


    1ère suggestion :

    Utilisateur (id_utilisateur, nom, type (A/B), ...) ;
    Discussion (id_discussion, #id_utilisateurA, #id_utilisateurB, favoriA (O/N), favoriB (O/N), supprimée (O/N), sujet, ...) ;
    Message (id_message, #id_discussion, #id_utilisateur, contenu, lu (O/N) ...).
    ==> pas très académique...


    2nd suggestion :

    Utilisateur (id_utilisateur, nom, type (A/B), ...) ;
    Discussion (id_discussion, sujet, supprimée (O/N), ...) ;
    DiscussionUtilisateur (#id_discussion, #id_utilisateur, favori (O/N), ...) ;
    Message (id_message, #id_discussion, #id_utilisateur, contenu, lu (O/N), ...) ;
    ==> un peu plus académique (quoique...).
    ==> à noter les relations :
    Utilisateur ---(0,n)---[participe]---(2,2)--- DiscussionUtilisateur ;
    Discussion ---(1,1)---[concerne]---(2,2)--- DiscussionUtilisateur.

    Si je ne m'abuse...
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  13. #13
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Citation Envoyé par Richard_35 Voir le message
    OK, ça s'éclaire... sauf pour le lu/non lu.

    ==> donc :
    - un utilisateur A, ouvre une discussion avec un utilisateur B en créant le premier message ;
    - ce même utilisateur A ouvre cette même discussion ;
    ==> la discussion est considérée comme "lue" alors que l'utilisateur B ne l'a même pas ouverte !...
    A mon sens, s'il existe au moins un message non lu dans la discussion, alors il faut indiquer la discussion comme non lue (comme le fait ce forum pour les abonnements) : une simple requête (dynamique, donc) suffit.
    Non non ! Quand A ouvre la discussion avec le premier message, la discussion est marquée comme lue pour l'utilisateur A mais pas pour l'utilisateur B (en gros, je créée deux entrées dans la table UtilisateurDiscussion avec comme date de dernier message lu pour A la date du message posté, ce qui a pour effet de rendre la discussion "lue", et la ligne pour l'utilisateur B, je mets une date "nulle" (0000-00-00)). Du coup, pour B la discussion est marquée comme non lue car la date est inférieure à la date du dernier message postée.

    Concernant ta deuxième suggestion :

    Je ne peux pas mettre "supprimée (O/N)" dans Discussion, car cela voudrait dire que l'utilisateur A pourrait supprimer la discussion ce qui aurait pour effet de la supprimé chez B également, ce dont je ne veux pas. B doit pouvoir voir la discussion MÊME SI l'utilisateur A l'a "supprimé" (en fait, elle n'est pas vraiment supprimée, juste "marquée" comme supprimée).

    Je ne peux pas mettre non plus lu (O/N) au niveau du message, puisque je ne travaille pas au niveau du "message" mais de la discussion (c'est une discussion tout entière qui est lue ou pas lue).

    Je crois que je t'ai un peu paumé avec mes explications... Faudrait peut-être que je te montre comment ça se passe actuellement lorsque je créé une discussion, ajoute un message...


    EDIT :

    Bon, donc voilà actuellement l'état de mes tables (je vais parler en termes de table, ce sera plus simple) :

    Discussion(id PK, sujet)
    UtilisateurDiscussion(user_id PK FK, discussion_id PK FK, statut, dateDernierMessageLu)
    Message(id PK, auteur_id FK, discussion_id FK, contenu, date)


    Dans la table UtilisateurDiscussion, "statut" me prendre comme valeur "favori", "supprimé" ou "rien". C'est surement dateDernierMessageLu qui t'a induit en erreur, mais lit la suite tu vas comprendre .


    Maintenant imaginons que l'utilisateur A d'identifiant 1 créé une nouvelle discussion pour l'utilisateur B d'identifiant 2 :

    Discussion :
    Ligne 1 : (1, "Une superbe discussion").

    Message :
    Ligne 1 : (1, 1, 1, "Un message de la première discussion", 2011-09-16 16:46).

    UtilisateurDiscussion :
    Ligne 1 : (1, 1, "rien", 2011-09-16 16:46).
    Ligne 2 : (2, 1, "rien", 0000-00-00 00:00).



    Quand l'utilisateur B va ouvrir la discussion, la ligne 2 d'UtilisateurDiscussion va être mise à jour avec la date du dernier message de la discussion.

    Ligne 2 : (2, 1, "rien", 2011-09-16 16:46).

    Est-ce que c'est un peu plus clair ?

  14. #14
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut Je n'ai pas vu ta modification...
    Citation Envoyé par Bakura
    Non non ! Quand A ouvre la discussion avec le premier message, la discussion est marquée comme lue pour l'utilisateur A mais pas pour l'utilisateur B .../...
    ==>
    Implication 1ère suggestion :
    Discussion (id_discussion, #id_utilisateurA, #id_utilisateurB, favoriA (O/N), favoriB (O/N), LueA (O/N), LueB (O/N), supprimée (O/N), sujet, ...).
    Implication 2nd suggestion :
    DiscussionUtilisateur (#id_discussion, #id_utilisateur, favori (O/N), Lue (O/N) ...).


    Citation Envoyé par Bakura
    Je ne peux pas mettre "supprimée (O/N)" dans Discussion, car cela voudrait dire que l'utilisateur A pourrait supprimer la discussion ce qui aurait pour effet de la supprimé chez B également, ce dont je ne veux pas. B doit pouvoir voir la discussion MÊME SI l'utilisateur A l'a "supprimé" (en fait, elle n'est pas vraiment supprimée, juste "marquée" comme supprimée).
    ==> non. C'est le processus qui permettra de "voir" la discussion "supprimée" à A et/ou B.


    Citation Envoyé par Bakura
    Je ne peux pas mettre non plus lu (O/N) au niveau du message, puisque je ne travaille pas au niveau du "message" mais de la discussion (c'est une discussion tout entière qui est lue ou pas lue).
    ==> vu dans le premier point.
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  15. #15
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Bon je potasse tes réponses ce soir.

    (Au passage j'avais édité mon message précédent, je sais pas si t'as vu )

  16. #16
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Non, je n'avais pas vu ce qui apparaît après "EDIT :".

    Je ne suis toujours pas convaincu, pour l'histoire du lu/non lu... mais bon, c'est toi qui décides.

    En tout état de cause, cela ne fonctionnera pas comme sur ce forum : quand tu es dans un forum (par exemple "Forum des professionnels en informatique > Général Développement > Conception > Modélisation > Schéma", et que tu es abonné à une des discussions de ce forum (par exemple "[MPD] Messagerie interne, MDP correct"), le sujet de cette discussion apparaît en gras si tu n'as pas lu au moins un message. Il s'agit de l'interprétation du flag "lu/non lu" qui est stocké pour le couple "utilisateur/message" et non pas sur le couple "utilisateur/discussion".
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  17. #17
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Donc je récapitule si je prends tes derniers messages :

    Utilisateur (id_utilisateur, nom, type (A/B), ...) ;
    Discussion (id_discussion, sujet, supprimée (O/N), ...) ;
    DiscussionUtilisateur (#id_discussion, #id_utilisateur, favori (O/N), Lue (O/N) ...).
    Message (id_message, #id_discussion, #id_utilisateur, contenu,...) ;

    ==> à noter les relations :
    Utilisateur ---(0,n)---[participe]---(2,2)--- DiscussionUtilisateur ;
    Discussion ---(1,1)---[concerne]---(2,2)--- DiscussionUtilisateur.




    En gros, on retombe bien sur la solution initiale que j'ai décrite dans mon premier message, si ce n'est que tu stockes plutôt qu'une date un "lue/non lue" directement dans discussion utilisateur... ce qui n'est pas bête du tout ! Je sais pas pourquoi je suis allé me compliqué à comparer des dates...

    non. C'est le processus qui permettra de "voir" la discussion "supprimée" à A et/ou B.
    C'est-à-dire le processus ? Si A supprime la discussion n°1 (donc si j'en crois ton modèle, la colonne "supprimée" de discussion prendra la valeur O). Donc effectivement, quand A affichera sa messagerie avec toutes les discussions auxquelles il participe, il ne verra plus cette discussion puisqu'elle sera marqué comme "supprimée". En revanche, B ne la verra plus non plus car elle est aussi marquée "supprimée" chez lui, or je veux qu'il la voie.

    Désolé, je pense qu'on a une petite incompréhension mais ça vient sûrement de moi .


    Il s'agit de l'interprétation du flag "lu/non lu" qui est stocké pour le couple "utilisateur/message" et non pas sur le couple "utilisateur/discussion".
    En fait, maintenant que j'y pense, le fait de mettre un statut lu/non lu par message me permettrait par exemple, si par exemple l'utilisateur A envoie plusieurs messages à la suite à B, d'aller au dernier message NON LU de B, et non à la fin de la discussion...

    Bon tu m'as un peu perdu . J'essaye de refaire un modèle demain et je viens poster le résultat ici .

  18. #18
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Je commence par la fin car ma réponse a une incidence sur le début...

    Citation Envoyé par Bakura
    En fait, maintenant que j'y pense, le fait de mettre un statut lu/non lu par message me permettrait par exemple, si par exemple l'utilisateur A envoie plusieurs messages à la suite à B, d'aller au dernier message NON LU de B, et non à la fin de la discussion...
    ==> eh bien oui.
    Il s'agit d'un attribut et il est très important de mettre les attributs au niveau des entités concernées, et non à un autre niveau qu'une interprétation collerait au bon niveau (je ne sais pas si je suis bien clair, sur ce coup là...).
    Tu n'y coupes pas, c'est un message qui est lu/non lu ; une discussion, on y rentre dedans ou pas.


    Citation Envoyé par Bakura
    C'est-à-dire le processus ? Si A supprime la discussion n°1 (donc si j'en crois ton modèle, la colonne "supprimée" de discussion prendra la valeur O). Donc effectivement, quand A affichera sa messagerie avec toutes les discussions auxquelles il participe, il ne verra plus cette discussion puisqu'elle sera marqué comme "supprimée". En revanche, B ne la verra plus non plus car elle est aussi marquée "supprimée" chez lui, or je veux qu'il la voie.
    ==> par "processus", j'entends "programme de l'application".
    De même que la précédente remarque, c'est la discussion qui est supprimée, tu n'y coupes pas. L'attribut "supprimé" doit donc être au niveau de la discussion. Si tu veux que les deux utilisateurs voient au moins une fois la discussion supprimée, il faut ajouter un flag "suppression vue" au niveau du couple "discussion/utilisateur".
    L'application pourrait aussi prévoir de faire apparaître les discussions supprimées, pour information.

    Nous sommes bien d'accord que tu ne veux pas de suppression de message (pas comme sur ce forum, qui permet de supprimer "logiquement" un message).
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  19. #19
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Ok, je te remercie en tout cas ^^.

    Je ne met pas résolu pour le moment, je reviendrai sûrement te voir une fois que j'aurai essayé de refaire le modèle.

  20. #20
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Bon, promis c'est la dernière fois que je t'embête

    Pour revenir à ta solution 2, j'ai quand même un cas qui me perturbe. Comment en l'état tu fais l'opération suivante : pour un utilisateur A, récupérer toutes les discussions dans lesquelles l'utilisateur A intervient, et récupérer l'identité de l'utilisateur B de chaque discussion (l'interlocuteur donc).

    Dans ton modèle que je réécris plus bas, je n'ai aucun moyen de faire ça, autre que : récupérer toutes les discussions de l'utilisateur A dans la table DiscussionUtilitateur, puis faire une jointure pour récupérer la discussion, puis faire une jointure pour récupérer les messages, et itérer à travers les messages afin de vérifier les identifiants jusqu'à en trouver un qui correspond à un identifiant différnet que le sien (qui correspond donc à l'autre utilisateur), et enfin faire une autre requête pour récupérer l'utilisateur en question. Or j'ai besoin de cette requête dans la "page d'accueil" de la messagerie qui ne m'affiche aucun message (du coup, toutes ces requêtes pour récupérer un nom...).

    Utilisateur (id_utilisateur, nom, type (A/B), ...) ;
    Discussion (id_discussion, sujet, supprimée (O/N), ...) ;
    DiscussionUtilisateur (#id_discussion, #id_utilisateur, favori (O/N), Lue (O/N) ...).
    Message (id_message, #id_discussion, #id_utilisateur, contenu,...) ;



    Du coup c'est ta solution "non académique" qui fonctionne bien, mais j'avoue que je trouve pas ça très beau le coup de stocker tout en double dans chaque table (un pour l'utilisateur A et un pour l'utilisateur B).



    Désolé, je comprends même pas pourquoi je bloque sur ça alors que les autres entités et relations de mon programme sont bien plus complexes... :/

    Et désolé de prendre sur ton temps, je dois paraître un peu relou là .

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [MySQL] Messagerie interne avec suivi des réponses
    Par morgan47 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/11/2008, 14h02
  2. [MySQL] Créer une messagerie interne
    Par yanng dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 22/05/2008, 11h34
  3. Petit éditeur pour messagerie interne
    Par Attilius dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 11/07/2006, 18h31
  4. messagerie interne
    Par Drudwyn dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 02/02/2006, 12h27
  5. Messagerie interne (SQL) + quotas
    Par hush dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 03/11/2005, 15h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo