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 :

Schéma pour un ''Réseau social'' [MLD]


Sujet :

Schéma

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Schéma pour un ''Réseau social''
    Bonjour à tous,

    J'aurai besoin d'informations par rapport à ce schéma MCD que j'essaye de réaliser. Il s'agit d'un schéma relatif à un petit site Web, qui fait partie d'un projet.

    Je n'arrive pas à définir les cardinalités et les entités par rapport à la table relations (qui définit en fait la relation entre deux users, c'est-à-dire s'ils sont amis ou non etc.) et je ne suis pas sûr de mes cardinalités pour les autres.

    Voilà, si vous avez des propositions ou des améliorations à me suggérer, ce serait vraiment appréciable ! =)

    Merci d'avance et à bientôt


  2. #2
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir,


    Citation Envoyé par devi22 Voir le message
    Je n'arrive pas à définir les cardinalités et les entités par rapport à la table relations (qui définit en fait la relation entre deux users, c'est-à-dire s'ils sont amis ou non etc.) et je ne suis pas sûr de mes cardinalités pour les autres.
    Vous utilisez Workbench, donc cantonnez-vous à sa notation, sans surcharger par des 0,N merisiens, car on ne sait plus ce qu’il faut lire.

    Il faudrait que vous précisiez les règles de gestion des données. Par exemple, celles qui gouvernent les associations entre les comptes et les groupes.

    Compte non tenu de la surcharge que vous avez apportée, selon votre diagramme (qui est un MLD plus qu’un MCD, mais peu importe), on a la règle suivante :
    A un compte est attaché au moins un groupe, et un groupe est attaché à au moins et au plus un compte (surjection).
    Règle qui se traduit ainsi :



    Si la règle était inversée, c'est-à-dire :
    A un groupe est attaché au moins un compte et un compte est attaché à au moins et au plus un groupe,
    alors le diagramme serait le suivant :



    Ou encore, si la règle était par exemple la suivante :
    A un groupe est attaché au moins un compte et un compte peut être attaché à plusieurs groupes,
    alors le diagramme serait le suivant :



    Concernant les relations entre comptes (compte = user ?) précisez les règles en français, que l’on sache de quoi il en retourne.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonsoir,

    Désolé pour la notation peu claire.
    Je venais juste de découvrir WorkBench voilà pourquoi je ne savais trop quoi mettre (leur système de trait+flèches est clair pour ceux qui ont le logiciel mais je doute qu'il en soit autant pour ceux qui ne le connaissent pas).

    Pour le cas des comptes / groupes, je la définirai comme ça : à un compte peut être attaché zéro ou plusieurs groupes et un groupe contient au moins un compte.
    Cela correspond à votre dernier schéma si je ne me trompe pas ?

    Petite parenthèse : en considérant qu'on utilise cette règle comment cela se traduit-il au niveau des tables MySQL ?

    Un compte représente bien un utilisateur. Un compte peut donc être en relation avec 0 ou plusieurs autres utilisateurs...

    J'espère que j'apporte suffisamment d'informations.

    Merci à vous

  4. #4
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir,


    Désolé pour la notation peu claire.
    Je venais juste de découvrir WorkBench voilà pourquoi je ne savais trop quoi mettre (leur système de trait+flèches est clair pour ceux qui ont le logiciel mais je doute qu'il en soit autant pour ceux qui ne le connaissent pas).
    Vous êtes tout excusé. Celui qui est habitué à la notation Merise peut être désorienté, mais la notation utilisée par Workbench est courante chez les Anglo-saxons et à l’usage elle s’avère très pratique (si vous connaissez UML, le sens de lecture des cardinalités est le même).


    Pour le cas des comptes / groupes, je la définirai comme ça : à un compte peut être attaché zéro ou plusieurs groupes et un groupe contient au moins un compte.
    Cela correspond à votre dernier schéma si je ne me trompe pas ?
    Vous ne vous trompez pas.


    en considérant qu'on utilise cette règle comment cela se traduit-il au niveau des tables MySQL ?
    Workbench crée le jeu d’instructions CREATE TABLE :

    File \ Export
    \ Forward Engineer SQL Create Script : ne retenez aucune option et fournissez le nom du fichier en sortie (un document Word n’est pas mal)
    \SQL Export filter : cochez Object of type MySQL Table
    \Finish

    Nota Bene.
    Vous observerez que dans le diagramme que je vous ai fourni, la clé primaire de GrpCpt est composée de la paire {GroupeId, CompteId}. Ces attributs font aussi partie des clés étrangères. Pour arriver à cela, j’ai utilisé l’option « Place a new 1:n identifying relationship » pour tirer un trait entre Groupe et GrpCpt d’une part, puis entre Compte et GrpCpt d’autre part.
    Le principe est le même concernant l’association réflexive Relation. Pour lever les ambiguïtés, chaque lien est accompagné d’un nom de rôle, « Inviter » d’une part, « Recevoir » d’autre part. Pour transformer les 1,N en 0,N : quand on édite l’association, décocher « Referencing table mandatory ».
    A noter que si Workbench crée une clé primaire ex nihilo, virez-la, elle fait double emploi.

    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonsoir,

    Merci beaucoup pour vos réponses avisées, elles m'aident à avancer et c'est vraiment gentil à vous de prendre du temps pour me répondre.

    En prenant compte de vos remarques, j'arrive à un schéma de ce type, pensez-vous qu'il est maintenant correct ?

    Bonne soirée


  6. #6
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir,


    Dans mon précédent message, j’avais écrit :
    « A noter que si Workbench crée une clé primaire ex nihilo, virez-la, elle fait double emploi, elle n’a aucune valeur ajoutée. »
    Cela concerne les tables associatives, telles que GrpCpt, Relation, Message.

    C’est le principe que j’avais adopté pour la table Relation (voyez le diagramme que j’ai proposé), qui a pour clé primaire la paire {CompteInviteId, CompteRecoitId}. A défaut, si l’on ne prenait garde (oubli de la définition d’une clé alternative), vous pourriez avoir des paires en double.

    Comme je l’avais précisé, il faut utiliser l’option « Place a new 1:n identifying relationship » de Workbench pour tirer les traits entre les tables à associer. Cela concerne vos tables Relations et Messages.

    Bon courage.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Merci de nouveau pour votre réponse pertinente.
    J'ai donc fais les modifications qui semblent adéquates, le schéma en pièce jointe vous paraît il correct ?

    Cependant, je ne comprends pas trop pour les clefs primaires : quand vous dites que la paire {CompteInviteId, CompteRecoitId} est une clef primaire, cela veut-il dire que sur PhpMyAdmin aussi, elles doivent être définies en clef primaire ?

    J'avais déjà commencé à coder en php et par exemple, pour la table messages, ma clef primaire allait sur "id_message" et je plaçais des INDEX sur les id_expediteur et id_receveur. Même chose pour la table relations.

    Est-ce la bonne marche à suivre ou quelque chose m'échappe ?

    Merci encore d'avance pour vos réponses averties.


  8. #8
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut Logique formelle et fer à souder
    Bonsoir,


    Il est peut-être de temps de voir à quoi correspond la notion de clé primaire.

    Je commencerai par citer Maurice Nivat, l’un des meilleurs spécialistes mondiaux en informatique théorique, qui définit l’informatique comme étant « la rencontre de la logique formelle et du fer à souder ».

    Cela dit, la notion de clé primaire est un cas particulier de la notion de clé candidate, dont voici la définition :

    Une clé candidate est un sous-ensemble d’attributs K de l’en-tête T* d’une table T et qui respecte les deux contraintes suivantes :
    Unicité. Deux lignes distinctes de T ne peuvent avoir même valeur de K.

    Irréductibilité. Il n’existe pas de sous-ensemble strict de K garantissant la règle d’unicité.
    Ce que j’appelle en-tête correspond à l’ensemble des noms des attributs de la table, tandis que l’ensemble des lignes de la table en constitue le corps.

    Quand j’utilise le terme « ensemble », je fais référence à la théorie des ensembles. Autrement dit, la notion de clé relève ici de la logique formelle.

    Prenons l’exemple de votre table Groupes. Elle a pour en-tête {id_grp, titre, sujet}. Les singletons {id_grp} et {titre} sont des clés candidates, sinon on pourrait avoir des doublons aussi bien pour {id_grp} que {titre}.

    Vous avez choisi {id_grp} pour être clé primaire, plutôt que {titre}. Cela veut dire que {id_grp} a l'immense qualité de la stabilité, parce les valeurs qu'elle prend sont non significatives, il s’agit le plus souvent d'entiers, et à chaque nouvelle ligne créée, on laisse le système incrémenter d’une unité.

    Au contraire, un titre a une signification pour l’utilisateur et est a priori instable, au gré des modifications apportées par cet utilisateur. Supposez maintenant que {titre} soit clé primaire : au nom de l’intégrité référentielle, c'est-à-dire de la cohésion de la base de données, la table GrpUser devrait comporter elle aussi un attribut titre, et toute modification dans la table Groupes devrait automatiquement être répercutée dans la table GrpUser. On est en train de dériver vers l’aspect performances, mais il faut y penser.

    Il est donc d’usage de choisir pour clé primaire celle qui parmi l’ensemble des clés candidates de la table offre cette stabilité si précieuse. Concernant la table Groupes, {id_grp} convient, tandis que {titre} est disqualifié et se trouve ravalé au rang de clé alternative.

    Le code SQL correspondant doit ressembler à ceci :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE Groupes
    (
        id_grp     INT
      , titre      TEXT
      , sujet      TEXT
      , Primary key (id_grp)
      , UNIQUE (titre)
    ) ;
    (le terme UNIQUE est synonyme de clé alternative.)

    La table Comptes présente les mêmes caractéristiques générales que la table Groupes.

    Passons à la table GrpUser : elle a pour seule clé candidate la paire {id_groupe, id_compte}. Comme elle présente les qualités voulues de stabilité, elle convient comme clé primaire. Sinon, il aurait fallu ajouter à la table un attribut artificiel id_truc, de telle sorte que l’on ait pour clé primaire {id_truc} et pour clé alternative {id_groupe, id_compte}.

    Le code SQL correspondant doit ressembler à ceci :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE GrpUser
    (
        id_groupe      INT
      , id_compte      INT
      , Primary key (id_groupe, id_compte)
      , Foreign Key (id_groupe) References Groupes (id_grp)
      , Foreign Key (id_compte) References Comptes (id_compte)
    ) ;
    où l’on voit notamment que le miroir de id_grp est id_groupe. La clause FOREIGN KEY permet de sous-traiter au SGBD la cohérence des liens entre les tables Groupes et GrpUser d’une part, Comptes et GrpUser d’autre part.

    Passons à la table Relations. Vous avez retenu comme clé primaire le triplet {id_relation, id_invite, id_recoit}. Le code SQL correspondant doit ressembler à quelque chose comme ceci :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE TABLE Relations
    (
        id_relation      INT
      , id_invite        INT
      , id_recoit        INT
      , etat             CHAR(10)
      , Primary key (id_relation, id_invite, id_recoit)
      , Foreign Key (id_invite) References Comptes (id_compte)
      , Foreign Key (id_recoit) References Comptes (id_compte)
    ) ;
    Maintenant, de deux choses l’une :
    1) Si la paire {id_invite, id_recoit} peut prendre plusieurs fois la même valeur (par exemple, Albert et Bernard peuvent être en relation plusieurs fois), le code est correct (et la clé primaire peut même être simplement constituée du singleton {id_relation} dans la mesure où le SGBD l’incrémente systématiquement).

    2) Si la paire {id_invite, id_recoit} ne peut prendre qu’une valeur (Albert et Bernard ne peuvent être en relation qu’une seule fois), alors la règle d’irréductibilité de la clé candidate est enfreinte et l’attribut id_relation doit être dégagé de la clé (et même disparaître de la table, puisqu'il ne sert à rien, et souvenez de mon 2e message : « A noter que si Workbench crée une clé primaire ex nihilo, virez-la, elle fait double emploi. »).
    Table Messages : même approche que pour la table Relations.


    quand vous dites que la paire {CompteInviteId, CompteRecoitId} est une clef primaire, cela veut-il dire que sur PhpMyAdmin aussi, elles doivent être définies en clef primaire ?
    J’ignore tout de ce que vous appelez « PhpMyAdmin » : manifestement on sort du cadre de la logique formelle pour dériver vers autre chose, à caractère sans doute technologique.


    je plaçais des INDEX sur les id_expediteur et id_receveur. Même chose pour la table relations.
    Est-ce la bonne marche à suivre ou quelque chose m'échappe ?
    Les index relèvent carrément du fer à souder. Jusqu’ici, on faisait abstraction du temps et de l’espace. Les index sont là pour permettre d’avoir les meilleurs temps de réponse possibles pour les requêtes. Mais Sahib, ceci est une autre histoire, car vous devrez dresser la liste des requêtes les plus fréquemment utilisées, les plus sensibles. Accessoirement, les SGBD ont tendance à exiger des index pour — ce sont des feignants — garantir les contraintes d’unicité (des clés).

    Bon 1er mai...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci encore pour vos explications !
    À bientôt

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Bénévole] Recherche Dévelloppeur pour un réseau social dans la création
    Par Antoine Debacque dans le forum Autres
    Réponses: 0
    Dernier message: 29/05/2015, 11h45
  2. [Bénévole] Recherche Dévelloppeur pour un réseau social dans la création
    Par Antoine Debacque dans le forum Autres
    Réponses: 0
    Dernier message: 05/05/2015, 14h39
  3. [Drupal] Drupal 7 pour un réseau social léger ?
    Par sebastiano dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 05/02/2014, 08h10
  4. Réponses: 75
    Dernier message: 09/11/2011, 08h00
  5. Choix d'un serveur pour développement d'un réseau social
    Par harris_macken dans le forum Hébergement
    Réponses: 1
    Dernier message: 28/03/2009, 08h25

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