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

PHP & Base de données Discussion :

Réseau social - Modélisation - Affichage de messages d'un mur


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Par défaut Réseau social - Modélisation - Affichage de messages d'un mur
    Bonjour,

    J'ai un sérieux problème de conception qui me pose souci depuis maintenant quelques jours et j'avoue que je m'arrache vraiment les cheveux. Je vais essayer de le décrire du mieux possible.

    Imaginons un réseau social du style Facebook sauf que les users "amis" d'un user 1 sont rangés dans des groupes (1:Mes amis, 2:Ma famille, ...). Un user peut donc avoir plusieurs murs (groupes). Prenons un exemple. Soit 3 users 1, 2 et 3.

    Le user 1 demande 2 et le range dans le groupe 1-Mes amis (dont il est owner)
    Le user 2 répond favorablement et range 1 dans le groupe 2-Mes amis (dont il est owner)

    Le user 1 demande 3 et le range dans le groupe 3-Ma famille (dont il est owner)
    Le user 3 répond favorablement et range 1 dans le groupe 4-Mes amis (dont il est owner)

    J'ai 3 tables :
    GROUPE(id_group, name_group et id_owner)
    1 Mes amis 1
    2 Mes amis 2
    3 Ma famille 1
    4 Mes amis 3

    MEMBRES_GROUPES(id_group, id_user)
    1 1
    1 2
    2 2
    2 1
    3 3
    3 1
    4 3
    4 1

    Lorsqu'un message est ajouté dans un mur,une ligne est ajoutée à la table MESSAGES(id_message, text, id_group).
    Par exemple, l'utilisateur laisse un message dans le groupe 1 --> 1 / texte message / 1

    Ma question est donc la suivante :
    Sachant que l'on a en paramètres d'entrée l'idUser laissant le message et l'idGroup dans lequel va le message, quelle requête permet d'afficher pour chaque user les messages selon ses groupes ?

    Merci pour votre aide. Je commence à trop fumer de la tête ...

  2. #2
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Tu vas un peu vite je trouve...
    J'ai fait ça, et je te promets que je reviens très vite avec une requête;

    user (id, prenom)
    1 Alain
    2 Béa
    3 Corinne
    4 Denis

    group (id, lib, code)
    1 amis A
    2 famille F
    3 connaissance C
    4 indésirables I
    5 pots de colle P

    group_groupowner (id, owner_id, groupe_code)
    1 1 A (alain a un groupe d'amis)
    2 1 I (alain a un groupe d'indésirables)
    3 2 F (Béa a un groupe famille)
    4 3 P (Corinne a un groupe de pots de colle)
    5 4 A (Denis a tous les groupes)
    6 4 F
    7 4 C
    8 4 I
    9 4 P

    group_groupuser (id, user_id, group_groupowner_id)
    100 4 1 (Denis est dans le groupe d'amis d'Alain)
    101 3 2 (Corinne est dans le groupe indésirables d'Alain)
    102 2 6 (Béa est dans le groupe Famille de Denis)
    103 1 4 (Alain est dans le groupe pots de colle de Corinne)


    message (id, titre, text, group_groupuser_id)
    1000 "mon pote" "Denis dit à alain : toi t es mon pote" 100
    1001 "mur du mépris" "Corine dit à alain : alors tu ne me désires pas MDRRRRRRRR" 101
    1002 "Comment va maman" "Béa dit à Denis : elle est sortie de l'hosto maman ?" 102
    1003 "Glu super glu" "alain dit à Corinne : De toute façon, tu me trouves pot de colle alors je ne t'aime pas. suis vexé !" 103
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  3. #3
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Ayé !
    Ceci devrait fonctionner...
    edit de 10H12 j'ai terminé. Tu remarqueras que tu n'as besoin que d'un seul paramètre, l'id de ton group_groupuser, qui contient par définition l'id de ton émetteur et de ton récepteur.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select user.prenom as from_prenom, owner.prenom as to_prenom, g.lib as groupe, m.titre, m.text, m.quand
    from message m
    inner join group_groupuser ggu on m.group_groupuser_id=ggu.id and ggu.id=?
    inner join user on ggu.user_id=user.id
    inner join group_groupowner ggo on ggu.group_groupowner_id=ggo.id
    inner join user owner on ggo.owner_id=owner.id
    inner join group g on ggo.groupe_code=g.code
    order by quand desc

    PS : tu devrais changer ton titre.
    ce n'est pas de l'algorithmique, (programmation).
    C'est de la modélisation (comment ranger les données en SGBD).

    Je remets ici les tables, car j'ai ajouté un "quand" au message

    user (id, prenom)
    1 Alain
    2 Béa
    3 Corinne
    4 Denis

    group (id, lib, code)
    1 amis A
    2 famille F
    3 connaissance C
    4 indésirables I
    5 pots de colle P

    group_groupowner (id, owner_id, group_code)
    1 1 A (alain a un groupe d'amis)
    2 1 I (alain a un groupe d'indésirables)
    3 2 F (Béa a un groupe famille)
    4 3 P (Corinne a un groupe de pots de colle)
    5 4 A (Denis a tous les groupes)
    6 4 F
    7 4 C
    8 4 I
    9 4 P

    group_groupuser (id, user_id, group_groupowner_id)
    100 4 1 (Denis est dans le groupe d'amis d'Alain)
    101 3 2 (Corinne est dans le groupe indésirables d'Alain)
    102 2 6 (Béa est dans le groupe Famille de Denis)
    103 1 4 (Alain est dans le groupe pots de colle de Corinne)


    message (id, titre, text, group_groupuser_id, quand)
    1000 "mon pote" "Denis dit à alain : toi t es mon pote" 100 2018-07-01 08:00:00
    1001 "mur du mépris" "Corine dit à alain : alors tu ne me désires pas MDRRRRRRRR" 101 2018-07-02 12:00:00
    1002 "Comment va maman" "Béa dit à Denis : elle est sortie de l'hosto maman ?" 102 2018-07-03 18:00:00
    1003 "Glu super glu" "alain dit à Corinne : De toute façon, tu me trouves pot de colle alors je ne t'aime pas. suis vexé !" 103 2018-07-04 22:00:00
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  4. #4
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Par défaut
    Hello Dendrite,

    Merci beaucoup pour ton retour. Je suis très impressionné !!
    Je vais implémenter ça et vérifier de ce pas pour voir si cela fonctionne.

    Si c'est le cas, tu n'imagines même pas l'énorme épine que tu m'ôtes du pied.

    Concernant ta remarque, tu as raison. Sur ce coup, j'ai eu un gros gros fail de modélisation.

  5. #5
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Par défaut
    Petite réflexion tout de même Dendrite.

    Selon ta modélisation, un groupe est partagé entre plusieurs utilisateurs.
    Par exemple,
    2 1 I (alain a un groupe d'indésirables)
    ...
    5 4 I (Denis a tous les groupes)

    Pour moi, le groupe d'indésirables d'alain ne doit pas être le même que le groupe d'indésirables de Denis.

  6. #6
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Pour moi, le groupe d'indésirables d'alain ne doit pas être le même que le groupe d'indésirables de Denis.
    Bien entendu.
    C'est pourquoi ils n'ont pas le même id (ici, 2 et 5).
    Très important, ton premier champ id sur toutes les tables doit toujours être integer, clé primaire et auto-increment.
    La table group est simplement une table de nomenclature, les tables suivantes sont des tables de liaison.
    C'est d'ailleurs un très bon exemple de poupées russes (d'imbrication). N'oublie pas de poser les clés d'unicité, les clés d'indexation, les clés étrangères... et si tu n'as aucune idée de quoi je parle, on verra ça plus tard.

    En tout cas, quand tu auras testé ta requête et que tout fonctionnera comme tu aimes, tu pourras la transformer en vue.
    Ca te fera des requêtes très intuitives dans ton script PHP.

    Code de création de la vue (à lancer une seule fois dans ta console SQL)

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create or replace view v_messages as
    select m.id as message_id, ggu.id as gg_user_id, ggo.id as gg_owner_id, user.id as from_id, user.prenom as from_prenom, owner.id as to_id, owner.prenom as to_prenom, g.lib as groupe, m.titre, m.text, m.quand
    from message m
    inner join group_groupuser ggu on m.group_groupuser_id=ggu.id
    inner join user on ggu.user_id=user.id
    inner join group_groupowner ggo on ggu.group_groupowner_id=ggo.id
    inner join user owner on ggo.owner_id=owner.id
    inner join group g on ggo.groupe_code=g.code

    Et dans ton script PHP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //tous les messages postés PAR Denis
    $sql='select * from v_messages where from_id=4 order by quand desc';
     
    //tous les messages postés POUR Corinne
    $sql='select * from v_messages where to_id=3 order by quand desc';
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

Discussions similaires

  1. Gérer les erreurs de réseau avec l'affichage de message
    Par Lucas Panny dans le forum Accès aux données
    Réponses: 2
    Dernier message: 19/05/2010, 10h09
  2. Réponses: 2
    Dernier message: 23/03/2006, 10h37
  3. [Réseau]Envoi et récéption des messages
    Par Battosaiii dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 11/12/2005, 14h37
  4. [Exception]Affichage de message dans une Execption
    Par harris_macken dans le forum Général Java
    Réponses: 8
    Dernier message: 29/05/2005, 17h34
  5. Réponses: 3
    Dernier message: 29/12/2003, 13h47

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