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 :

Répertoire téléphonique


Sujet :

Schéma

  1. #1
    Membre à l'essai Avatar de debutant001
    Profil pro
    Eric
    Inscrit en
    Mai 2002
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Eric

    Informations forums :
    Inscription : Mai 2002
    Messages : 47
    Points : 24
    Points
    24
    Par défaut Répertoire téléphonique
    Bonjour à tous,

    En espérant être dans le bon forum...

    Je suis en train de me former sur la conception de bdd via la méthode Merise.
    Pour cela, je potasse ce bouquin et qq tutos, comme celui-ci par ex.
    Aussi pour mettre en application ce que j'ai appris, je voudrais réaliser un répertoire téléphonique. (projet classique certes, mais comme j'en ai besoin pourquoi ne pas commencer par ça ?)

    Avant de partir dans la réalisation du MCD, j'ai réalisé un dictionnaire des données et je souhaiterais qu'une personne d'expérimentée en SGBDR me dise si celui-ci est correct, judicieux, etc... (histoire d'avoir une bonne base de travail, et ainsi ne pas me diriger droit dans un mur)

    Je suis parti du "cahier des charges" suivant :

    • On connaît obligatoirement au moins un N° de téléphone (fixe ou portable) ainsi que les titres, prénoms ou pseudos (et si possible les catégories et noms de famille) de chacune des personnes inscrites dans cet annuaire.
    • Les numéros de téléphone seront présentés sous la forme : 01 23 45 67 89
    • Une personne peut avoir zéro, une ou plusieurs adresses postales qui seront alors identifiées comme « Adresse principale » ou « Adresse secondaire » ou « Adresse pro ».
    • Une personne peut avoir zéro, une ou plusieurs téléphones fixes qui seront alors identifiés comme « Téléphone perso » ou « Téléphone pro ».
    • Une personne peut avoir plusieurs téléphones portables qui seront alors identifiés comme « Téléphone perso » ou « Téléphone pro ».
    • Une personne peut avoir zéro, un ou plusieurs pseudos.
    • Une personne peut avoir zéro, une ou plusieurs adresses mails qui seront alors identifiées comme « Adresse mail perso » ou « Adresse mail pro ».
    • Une personne peut avoir zéro, un ou plusieurs sites web qui seront alors identifiés comme « Site web perso » ou « Site web pro ».
    • Une personne peut avoir zéro ou une date de naissance qui sera alors présentée sous la forme : JJ-MM-AAAA
    • On pourra éventuellement noter quelques observations à propos d'une personne. (255 caractères max)


    Voici le dictionnaire des données que j'ai établi :

    • Table tUser :

    Code mnémonique Désignation Type Taille Remarques
    use_i_id Identifiant numérique d'un inscrit N 3
    use_e_titre Civilité d'un inscrit E 3 possibilités : M. ou Mme ou Mlle
    use_s_nom Nom de famille d'un inscrit A 30
    use_s_prenom Prénom d'un inscrit A 30
    use_d_naissance Date de naissance d'un inscrit Date 10 Au format JJ-MM-AAAA

    • Table tCommentaire :

    Code mnémonique Désignation Type Taille Remarques
    com_i_id Identifiant numérique du commentaire à propos d'un inscrit N 1
    com_s_contenu Contenu du commentaire à propos d'un inscrit AN 255 255 caractères max

    • Table tCategorie :

    Code mnémonique Désignation Type Taille Remarques
    cat_i_id Identifiant numérique de la catégorie d'un inscrit N 2
    cat_e_libelle Libellé de la catégorie d'un inscrit E 6 possibilités : famille ou ami ou pro ou modèle ou photographe ou autre

    • Table tAdresse :

    Code mnémonique Désignation Type Taille Remarques
    adr_i_id Identifiant numérique de l'adresse postale d'un inscrit N 4
    adr_s_numero Numéro de la rue où habite un inscrit AN 3
    adr_s_rue Nom de la rue où habite un inscrit AN 30
    adr_s_ville Nom de la ville où habite un inscrit A 30
    adr_s_cp Code postal de la ville où habite un inscrit AN 5
    adr_s_pays Pays où habite un inscrit A 30
    adr_e_categorie Catégorie de l'adresse postale d'un inscrit E 3 possibilités : principale ou secondaire ou pro

    • Table tMail :

    Code mnémonique Désignation Type Taille Remarques
    mai_i_id Identifiant numérique de l'adresse mail d'un inscrit N 4
    mai_s_adresse Adresse mail d'un inscrit AN 30
    mai_e_categorie Catégorie de l'adresse mail d'un inscrit E 2 possibilités : pro ou perso

    • Table tSite :

    Code mnémonique Désignation Type Taille Remarques
    sit_i_id Identifiant numérique du site web d'un inscrit N 4
    sit_s_url URL du site web d'un inscrit AN 80
    sit_e_categorie Catégorie du site web d'un inscrit E 2 possibilités : pro ou perso

    • Table tFixe :

    Code mnémonique Désignation Type Taille Remarques
    fix_i_id Identifiant numérique du téléphone fixe d'un inscrit N 4
    fix_s_numero Numéro de téléphone fixe d'un inscrit AN 15
    fix_e_categorie Catégorie du numéro de téléphone fixe d'un inscrit E 2 possibilités : pro ou perso

    • Table tMobile :

    Code mnémonique Désignation Type Taille Remarques
    mob_i_id Identifiant numérique du téléphone mobile d'un inscrit N 4
    mob_s_numero Numéro de téléphone mobile d'un inscrit AN 15
    mob_e_categorie Catégorie du numéro de téléphone mobile d'un inscrit E 2 possibilités : pro ou perso

    • Table tPseudo :

    Code mnémonique Désignation Type Taille Remarques
    pse_i_id Identifiant numérique du pseudo d'un inscrit N 4
    pse_s_libelle Libellé du pseudo d'un inscrit AN 30

    Légende :

    xxx = clé primaire
    A = donnée alphabétique
    N = donnée numérique
    AN = donnée alphanumérique
    E = donnée énumérée

    Pour info, j'ai crée une table séparée dédiée uniquement aux commentaires d'après les remarques lues ici.

    Voilà,
    N'hésitez pas à critiquer et commenter mon travail (de novice )

    En vous remerciant par avance pour vos conseils,
    Cordialement
    Eric

  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 000
    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 000
    Points : 30 897
    Points
    30 897
    Billets dans le blog
    16
    Par défaut
    Bonsoir Éric,


    Votre approche est bonne. Bien souvent les intervenants « balancent » des MCD sans présenter leur sujet, et les règles de gestion des données : là au moins on peut vous donner 20/20 : vous pouvez vous lancer dans la réalisation d’un MCD.

    Quelques remarques :

    1) Il est courant (mais ça n’est une obligation) de mettre en œuvre une entité-type pour les données énumérées. En réalité, le SGBD qu’on va utiliser va influencer le choix. Si votre SGBD (quel est-il ?) permet de contrôler les valeurs (clause CHECK de l’instruction CREATE/ALTER TABLE), vous pouvez vous dispenser de mettre en œuvre l’entité-type évoquée (cas par exemple de « Catégorie du site web d'un inscrit »). Si le SGBD ne le permet pas (cas de MySQL), la prudence incite à mettre en oeuvre cette entité-type.

    2) Pour les identifiants, là encore on raisonne « au-delà de Merise ». Au stade relationnel, on utilise le type INTEGER, qu’il s’agisse des attributs use_i_id, com_i_id, etc. On n’est quand même plus en 1970, époque à laquelle on dimensionnait à l’octet près, car les capacités des mémoires et des disques étaient très réduites.

    3) Quand vous écrivez pour une date : « Au format JJ-MM-AAAA » ou « Les numéros de téléphone seront présentés sous la forme : 01 23 45 67 89 », il s’agit de présenter les données à l’utilisateur, mais le stockage peut être différent. Touetfois, considérez ma remarque comme mineure. Cela dit, vous ne considérez pas des numéros de téléphone hors Hexagone ?

    4) Numéro de la rue où habite un inscrit : vous êtes bien chiche en allouant 3 caractères. Comment faites-vous pour quelqu’un habitant au 130 ter ou 140 quater ?

    5) Je suppose que dans le MCD vous procéderez à un regroupement des entités-types tFixe et tMobile.

    6) On sera amené à reparler de l’identifiant com_i_id, lequel sera en fait la reprise de use_i_id. Comme disait Guillaume d’Ockham :

    « Pluralitas non est ponenda sine necessitate » (Autrement dit, ce qui ne sert à rien : exit !)
    (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
    Membre à l'essai Avatar de debutant001
    Profil pro
    Eric
    Inscrit en
    Mai 2002
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Eric

    Informations forums :
    Inscription : Mai 2002
    Messages : 47
    Points : 24
    Points
    24
    Par défaut
    Merci fsmrel pour votre réponse et toutes ces remarques très intéressantes. (qui m'ont fait réfléchir et donc amené à me poser d'autres questions !)

    A propos de ces dernières :

    1) initialement je pensais utiliser MySQL car c'est le seul SGBDR que je connais un peu.
    Sauf que suite à la lecture de ce post, je me pose sérieusement des questions.
    PostgreSQL m'aurait bien tenté (je connaîtrais ainsi deux SGDBR) mais en ce cas je devrais partir de zéro : est-ce judicieux pour un débutant seul dans son apprentissage ?
    D'autant que j'ai lu aussi sur DVP (mais où ? ) que pour un petit projet avec peu d'utilisateurs, PostgreSQL n'était peut-être pas recommandé (en terme de vitesse) par rapport à MySQL.
    Du coup, je ne sais vraiment plus quoi prendre !

    3) malgré que ça ne soit pas stipulé dans le "cahier des charges" j'ai anticipé une éventuelle demande, d'où les 15 octets réservés pour "fix_s_numero" et "mob_s_numero". Ça devrait suffire, non ?

    4) heu... je n'avais pas pensé à ce type d'éventualités ! Du coup je n'ai pas d'autre choix que d'ajouter un champ "adr_s_complement" en ce cas ?

    5) bonne question ! Initialement, j'ai séparé les deux car une personne peut posséder plusieurs téléphones (fixe et/ou mobile) dans la même catégorie : un téléphone fixe perso pour la résidence principale, un téléphone fixe perso pour la résidence secondaire, un téléphone mobile perso et enfin un téléphone mobile pro. J'ai pensé qu'on devait alors considérer un téléphone fixe et un téléphone mobile comme deux entités à part. Je me suis trompé ?

    6) Je comprends et comprends pas à la fois votre remarque : tout ce qui est superflu, dehors (pas de souci là-dessus) mais la clé primaire de la table tCommentaire est bien obligatoire, non ? Si on la supprime, comment attribuer tel ou tel commentaire à tel user ? On ne va pas mettre com_s_contenu comme clé primaire quand même, si ?

    Concernant ce dernier point, je comptais ajouter à ce message mon MCD mais en fonction de vos prochaines réponses, je vais devoir modifier mon dictionnaire des données avant.
    Ce qui m'amène à cette question concernant un MCD : doit-on nommer obligatoirement différemment toutes les relations, car à première vue je n'ai que des relations "Appartenir" (tel mobile appartient à telle catégorie, telle adresse appartient à telle catégorie", etc...) ou "Posséder" (tel user possède tel téléphone fixe, tel user possède telle adresse mail, etc...) ?

  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 000
    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 000
    Points : 30 897
    Points
    30 897
    Billets dans le blog
    16
    Par défaut
    Bonsoir Éric,


    Citation Envoyé par debutant001
    initialement je pensais utiliser MySQL car c'est le seul SGBDR que je connais un peu.
    Sauf que suite à la lecture de ce post, je me pose sérieusement des questions.
    Certes SQLpro met le paquet, mais on ne peut lui donner tort... Pour ma part ayant utilisé exclusivement DB2 for z/OS en production, en ce qui concerne les autres SGBDR, je ne peux donner qu’un avis d’utilisateur lambda suite aux coups de main que j’essaie de donner dans les forums DVP, avis portant sur le langage SQL plus que moteur. En l’occurrence, la richesse fonctionnelle n’est pas ce qui caractérise MySQL. Je peste quand je constate que je ne peux pas mettre en œuvre la jointure récursive (au moyen d’une CTE (Common Table Expression)), ou que je ne peux pas utiliser un trigger pour une vue pour résoudre un problème fonctionnel (ventilation dans les tables sous-jacentes des données d’un insert appliqué à la vue), etc. J’ai été amené à utiliser un peu PostgreSQL, et force est de reconnaître qu’il est fonctionnellement incomparablement plus riche et pas bien compliqué à installer et maîtriser, j’y suis arrivé sans difficulté particulière alors que je redoutais l’épreuve. Mais bien sûr, je ne prétendrais pas au titre d’expert PostgreSQL, loin s’en faut ! De votre côté vous pouvez vous lancer dans l’expérience, goûter et comparer. De toute façon vous ne seriez pas seul dans l’apprentissage, il y a les forums d’entraide !



    Citation Envoyé par debutant001
    D'autant que j'ai lu aussi sur DVP (mais où ?) que pour un petit projet avec peu d'utilisateurs, PostgreSQL n'était peut-être pas recommandé (en terme de vitesse) par rapport à MySQL
    La vitesse est un critère parmi d’autres. J’ai quand même comparé MySQL et PostgreSQL pour des traitements portant sur une base de données de 15 GB contenant des tables de plusieurs millions de lignes : avantage à PostgreSQL (mais il se trouvera toujours des contradicteurs arrivant à des conclusions inverses ). Bien faire et laisser dire, le tout est de partir sur la base d’un MCD correct et une fois dans la soute, procéder à des prototypages de performance (pertinence des index, campagnes d’EXPLAINS...)



    Citation Envoyé par debutant001
    malgré que ça ne soit pas stipulé dans le "cahier des charges" j'ai anticipé une éventuelle demande, d'où les 15 octets réservés pour "fix_s_numero" et "mob_s_numero". Ça devrait suffire, non ?
    Sans doute. Mais d’expérience, il ne faut pas être avare quant à la taille des champs. Calez-vous au moins sur la norme (qui bouge souvent, mais bon...), par exemple au format « +33 C CC CC CC CC » plus une marge en pensant à l’avenir... En 50 ans de métier, combien d’applications ai-je vu faire l’objet d'opérations de maintenance bien trop coûteuses pour de stupides histoires de champs trop petits (par exemple, pour rester dans le monde de la téléphonie, à l'occasion du passage à la numérotation à 8 chiffres puis 10 chiffres)...



    Citation Envoyé par debutant001
    je n'avais pas pensé à ce type d'éventualités ! Du coup je n'ai pas d'autre choix que d'ajouter un champ "adr_s_complement" en ce cas ?
    Il y a en gros deux écoles en matière de structuration des adresses :

    — Il y a ceux qui atomisent à mort, comme vous êtes en train de le faire et en finissent par devoir créer des tables des types de voie (rue, allée, avenue, etc., voire street, straße, j’en passe et des meilleures), des compléments d’adresse, c’est le doigt dans l’engrenage si l’on veut tout contrôler, ce qui est mission quasi impossible, avec des normes qui bougent tout le temps... A moins de travailler pour le Trésor public et autres « organismes » du même tonneau, modéliser réglementairement des informations comme la voie et le numéro dans la voie n’apporte guère.

    — Il y a ceux qui se cantonnent aux attributs : Ligne 1, Ligne 2, Ligne 3, Ligne 4, Ligne 5 d’adresse et dont je fais partie : l’essentiel est de ne pas de planter sur des données importantes comme le code postal, lequel mérite un minimum de contrôle de structure et fait l’objet d’un attribut en table. Cela dit, ne vous arrive-t-il pas de recevoir des courriers pourtant libellés de façon fantaisiste, quant au nom, au type de voie, etc. ?

    — Hors concours :

    Quand Stéphane Mallarmé écrivait à un ami, il remplaçait les 4 lignes d’adresse par un quatrain, ce qui gênait nullement le facteur, lequel déposait le courrier dans la bonne boîte à lettres (heureuse époque...)






    Citation Envoyé par debutant001
    Initialement, j'ai séparé les deux car une personne peut posséder plusieurs téléphones (fixe et/ou mobile) dans la même catégorie : un téléphone fixe perso pour la résidence principale, un téléphone fixe perso pour la résidence secondaire, un téléphone mobile perso et enfin un téléphone mobile pro. J'ai pensé qu'on devait alors considérer un téléphone fixe et un téléphone mobile comme deux entités à part. Je me suis trompé ?
    Du point de vue de la sémantique, vous n’avez pas tort, mais il faut approfondir la réflexion en considérant la spécialisation/généralisation des entités-types :

    Une entité-type « surtype » factorise les propriétés communes à des entités-types cousines qui deviennent « sous-types » et portent les propriétés spécifiques.

    Par exemple, les entreprises et les salariés de ces entreprises partagent pas mal de propriétés, mais certainement pas des données telles que le numéro SIREN des entreprises ou le numéro de sécurité sociale des salariés. On généralise en mettant en œuvre un surtype PERSONNE (données et associations communes) et les sous-types ENTREPRISE et SALARIE ((données et associations spécifiques).

    Dans le cas des téléphones fixes et mobiles, que voyez-vous comme propriétés non communes à modéliser ? Certes, il faut faire le distinguo entre fie et mobile, mais à part ca (et les 2 premiers chiffres du numéro) ?



    Citation Envoyé par debutant001
    Je comprends et comprends pas à la fois votre remarque : tout ce qui est superflu, dehors (pas de souci là-dessus) mais la clé primaire de la table tCommentaire est bien obligatoire, non ? Si on la supprime, comment attribuer tel ou tel commentaire à tel user ? On ne va pas mettre com_s_contenu comme clé primaire quand même, si ?
    Au niveau tabulaire, il est évident que la table tCommentaire a sa clé primaire, mais elle est héritée de celle la table tUser.

    Exemple SQL :

    
    CREATE TABLE tUser
    (
            UserId            INT                    NOT NULL
            ...               ...                    ...
        , CONSTRAINT User_PK PRIMARY KEY (UserId)  
    ) ;
    
    CREATE TABLE tCommentaire 
    (
            UserId            INT                    NOT NULL
          , Commentaire       ...                    NOT NULL
            ...               ...                    ...
        , CONSTRAINT Commentaire_PK PRIMARY KEY (UserId)
        , CONSTRAINT Commentaire_User_FK FOREIGN KEY (UserId)
             REFERENCES tUser (UserId) ON DELETE CASCADE 
    ) ;
    
    
    (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
    Membre à l'essai Avatar de debutant001
    Profil pro
    Eric
    Inscrit en
    Mai 2002
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Eric

    Informations forums :
    Inscription : Mai 2002
    Messages : 47
    Points : 24
    Points
    24
    Par défaut
    Ok pour utiliser PostgreSQL, ça ne me fera pas de mal de connaître un 2ème SGBDR de toute façon...

    Concernant la taille des champs contenant les numéros de tél, objectivement je pensais que 15 octets suffisaient largement mais vous avez raison de vouloir anticiper l'avenir, je vais donc passer à 20 octets. (là ça devrait suffire je pense )

    Idem pour la propriété "adr_s_numero" : en y réfléchissant, jamais une recherche ne se fera que sur le N° d'une rue ou uniquement sur l'intitulé d'une rue, donc c'est vrai : pourquoi ne pas inclure les deux dans la propriété "adr_s_rue" ?
    (sympa l'anecdote sur Stéphane Mallarmé)

    A propos de la gestion des numéros de tél, votre exemple est très parlant ! (je pensais que mettre plusieurs propriétés contenant des données énumérées, ici "tel_e_type" et "tel_e_categorie", n'était pas recommandé)
    Si j'ai bien compris, voici comment je pense maintenant gérer ces derniers :

    • Table tTelephone :

    Code mnémonique Désignation Type Taille Remarques
    tel_i_id Identifiant numérique du téléphone d'un inscrit N 4
    tel_s_numero Numéro de téléphone d'un inscrit AN 20
    tel_e_type Type du numéro de téléphone d'un inscrit E 2 possibilités : fixe ou mobile
    tel_e_categorie Catégorie du numéro de téléphone d'un inscrit E 2 possibilités : pro ou perso

    Enfin, concernant le dernier point, ce que vous vouliez me dire initialement c'était qu'il y avait forcément un lien entre "com_i_id" et "use_i_id" du fait que la cardinalité de l'association "Posséder" entre les entités "tUser" et "tCommentaire" est de type :
    tUser --(0,1)----(Posséder)----(1,1)--tCommentaire
    d'où l'ajout d'une clé étrangère "FK_tCommentaire_use_i_id" dans la table "tCommentaire", c'est bien ça ?
    Désolé je n'avais pas compris votre remarque. (en fait, c'est la citation de Guillaume d’Ockham qui m'a induit en erreur : j'ai cru qu'il y avait quelque chose d'inutile dans mon entité)

    Sinon, vous ne m'avez pas répondu à propos de l'obligation ou non de nommer différemment toutes les associations dans un MCD...

  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 000
    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 000
    Points : 30 897
    Points
    30 897
    Billets dans le blog
    16
    Par défaut
    Bonsoir Éric,


    Citation Envoyé par debutant001
    c'est vrai : pourquoi ne pas inclure les deux dans la propriété "adr_s_rue" ?
    C’est la bonne option. Plus généralement, l’essentiel est d’être à même de produire les 5 lignes d’adresse à partir des données contenues dans la base de données.



    Citation Envoyé par debutant001
    Si j'ai bien compris, voici comment je pense maintenant gérer ces derniers
    C’est bon. N’oubliez pas de sous-traiter à PostgreSQL le contrôle des valeurs prises pas le type et la catégorie de téléphone (CREATE TABLE, contrainte CHECK).



    Citation Envoyé par debutant001
    concernant le dernier point, ce que vous vouliez me dire initialement c'était qu'il y avait forcément un lien entre "com_i_id" et "use_i_id" du fait que la cardinalité de l'association "Posséder" entre les entités "tUser" et "tCommentaire" est de type :

    tUser --(0,1)----(Posséder)----(1,1)--tCommentaire
    Qu’il y ait un lien entre "com_i_id" et "use_i_id" (voir plus bas) est une conséquence de la présence dans votre dictionnaire d’attributs artificiels, les identifiants, alors qu’un dictionnaire ne devrait concerner que les attributs naturels, par exemple le nom, le prénom d’un inscrit (attributs dont certains possèdent la propriété d’unicité et sont donc des identifiants naturels, cas par exemple du numéro de téléphone d’un inscrit).

    Pour illustrer, par référence au tableau ci-dessous des éléments chimiques (source Wikipedia), lors de la constitution du dictionnaire des données, en plus des attributs naturels qui y figurent, quelle serait l’utilité d’y ajouter d’office un attribut ElementId qui en soit l’identifiant ? Du point de vue de l’information, objectivement aucune, j’ai envie de dire que ça tient du parasitisme. Qu’on le fasse au niveau du MCD, d’accord et c’est même nécessaire, parce qu’on en arrive au stade du traitement informatisé, mais en amont, c'est-à-dire pour l’utilisateur final de votre application (disons la maîtrise d’ouvrage) il n’y a évidemment pas de valeur ajoutée (au contraire...) à lui exposer des attributs artificiels et autres avatars purement techniques.





    Ajouter mécaniquement des identifiants artificiels peut avoir des effets secondaires conduisant à une modélisation sujette à correction (si l’on tient compte de ce qu’a écrit Ockham...)

    Je m’explique. Si l’on vous suit, au stade du MCD on aura la représentation suivante :

    tUser --0,1----(Posséder)----1,1--tCommentaire

    J’ai supprimé les parenthèses encadrant les cardinalités, car le métamodèle du MCD merisien ne les prend pas en considération (cf. l’ouvrage de référence La méthode Merise, Tome 1 : Principes et outils de Tardieu, Rochfeld, Colletti) et elles peuvent être cause d’ambiguïté lors de l’utilisation de certains AGL qui leur affectent un rôle particulier (cas de PowerAMC).

    Quoi qu’il en soit utilisons les services d’un AGL (ce qui est très fortement recommandé), par exemple DB-MAIN (gratuit, fiable et sérieux).


    MCD selon DB-MAIN (outre les identifiants, je n’ai fait figurer que quelques attributs).





    Citation Envoyé par debutant001
    Désolé je n'avais pas compris votre remarque. (en fait, c'est la citation de Guillaume d’Ockham qui m'a induit en erreur : j'ai cru qu'il y avait quelque chose d'inutile dans mon entité)
    Considérons le MLD déduit par DB-MAIN du MCD précédent.


    MLD





    Où id’ symbolise la clé étrangère branchant COMMENTAIRE sur USER, et « ref » est synonyme de « clé étrangère ».

    Code SQL correspondant :

    
    create table USER 
    (
         UserId                int                     not null,
         UserNom               varchar(48)             not null,
         constraint USER_PK primary key (UserId)
    );
    
    create table COMMENTAIRE 
    (
         CommentaireId         int                     not null,
         UserId                int                     not null,
         CommentaireContenu    varchar(255)            not null,
         constraint COMMENTAIRE_PK primary key (CommentaireId),
         constraint COMMENTAIRE_AK unique (UserId),
         constraint COMMENTAIRE_USER_FK foreign key (UserId)
             references USER (UserId) ON DELETE CASCADE 
    );
    
    
    Qu’il y ait un lien entre CommentaireId et UserId est incontestable, plus formellement les sous-ensembles d’attributs {CommentaireId} et {UserId} sont des clés candidates de la variable relationnelle (table en SQL) COMMENTAIRE et font donc l’objet des dépendances fonctionnelles :

    {UserId} —> {CommentaireId}

    {CommentaireId} —> {UserId}


    Considérons maintenant le MLD suivant :





    Traduction en SQL :

    
    create table USER 
    (
         UserId                int                     not null,
         UserNom               varchar(48)             not null,
         constraint USER_PK primary key (UserId)
    );
    
    create table COMMENTAIRE 
    (
         UserId                int                     not null,
         CommentaireContenu    varchar(255)            not null,
         constraint COMMENTAIRE_PK primary key (UserId),
         constraint COMMENTAIRE_USER_FK foreign key (UserId)
             references USER (UserId) ON DELETE CASCADE 
    );
    
    

    Cette fois-ci, l’attribut UserId fait l’objet à la fois de la clé primaire de la table COMMENTAIRE et de la clé étrangère référençant la clé primaire {UserId} de la table USER. L’attribut CommentaireId est devenu inessentiel, superflu, donc parasite, ce qui justifie son élimination au nom de la proposition d’Ockham.



    Citation Envoyé par debutant001
    vous ne m'avez pas répondu à propos de l'obligation ou non de nommer différemment toutes les associations dans un MCD...
    De fait, je n’y avais pas fait attention. Donner un nom pertinent à une association n’est pas un exercice facile. En plus faire en sorte que les noms soient systématiquement différents relève de la haute voltige, exercice fort à la mode à l’époque où les AGL de modélisation des MCD n’existaient pas ou peu (imaginez en plus ce que cela peut représenter si le MCD comporte 500 entités-types et plus...)

    Quand il s’agit de présenter un MCD à l’interlocuteur non informaticien, à savoir la maîtrise d’ouvrage qui en général préfère les bandes dessinées aux dossiers de conception austères, souvent obscurs et ambigus, donner un nom sémantiquement pertinent à chaque association est nécessaire. Mais que les noms des associations soient systématiquement différents, ça ne concerne pas cet interlocuteur, il n’est sensible qu’à la signification des associations.

    Quand il s’agit de construire un MCD au moyen d’un AGL, si celui-ci exige que les associations aient des noms différents, on doit évidemment s’y conformer (par exemple, un AGL comme PowerAMC permet que les associations aient le même nom dans la partie visible (le diagramme qu’on affiche), mais il l’interdit pour les noms sous le capot, là où ils noms donneront lieu le cas échéant au nom des tables).

    Pour ma part, je veille soigneusement au nom des associations qui donneront lieu à des tables (niveau SQL), mais pour les autres, je n’ai pas de temps à perdre, si par exemple le mot « appartenir » est pertinent, je l’utilise, et si c’est plus d’une fois, ça ne me dérange aucunement puisque ces noms d’associations ne feront pas l’objet de tables, elles disparaîtront en fumée (ou feront à la limite partie des noms des clés étrangères).
    (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
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 756
    Points : 52 531
    Points
    52 531
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Bonsoir Éric,


    Quand Stéphane Mallarmé écrivait à un ami, il remplaçait les 4 lignes d’adresse par un quatrain, ce qui gênait nullement le facteur, lequel déposait le courrier dans la bonne boîte à lettres (heureuse époque...)



    Il y a aussi l'amusante lettre envoyée par un ami à Emile Lemoine, ancien élève de l'Ecole Polytechnique... Comme il demeurait à Paris, 55 rue du Cherche-Midi, son ami lui envoya la lettre "rue du Cherche-une heure moins 5" ! Le facteur la déposa dans la bonne boite...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 756
    Points : 52 531
    Points
    52 531
    Billets dans le blog
    5
    Par défaut
    Sur l'atomisation de la date, tout dépend effectivement des traitements derrière.
    Si vous êtes un site web marchand il est extrêmement important d'atomiser au max, car cela facilitera la validation des adresses. Il existe des entreprise chargées de valider des adresses afin d'obtenir un taux de rejet de destination minimale. Sans cela, de nombreux sites web marchand des touts premiers temps d'Internet ont fait faillite, à cause du taux de retour des marchandises n'arrivant pas à trouver la destination finale (problème connu sous le nom du "dernier kilomètre")

    https://fr.wikipedia.org/wiki/Dernier_kilom%C3%A8tre

    Dans ce cas prévis, atomiser avec :
    • Libellé de la rue (François Mitterand... Charles de Gaulle)
    • Type de voie (impasse, venelle, sente... Place, Avenue, Boulevard)
    • Numero (144, 203-206, 1290, 147 bis...)



    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Membre à l'essai Avatar de debutant001
    Profil pro
    Eric
    Inscrit en
    Mai 2002
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Eric

    Informations forums :
    Inscription : Mai 2002
    Messages : 47
    Points : 24
    Points
    24
    Par défaut
    Merci à vous fsmrel d'avoir pris le temps pour me faire une telle réponse !

    Je pense avoir à peu près tout compris ce que vous m'avez expliqué (même si j'ai un peu mal à la tête depuis hier ) excepté une chose parmi les contraintes de la table "COMMENTAIRE" dans le 1er code SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
         constraint COMMENTAIRE_PK primary key (CommentaireId),
         constraint COMMENTAIRE_AK unique (UserId),
         constraint COMMENTAIRE_USER_AK foreign key (UserId)
             references USER (UserId) ON DELETE CASCADE
    La 1ère contrainte ok : création de la clé primaire "CommentaireId"
    La 3ème contrainte ok : création de la clé étrangère "COMMENTAIRE_USER_AK" (que veut dire le AK à ce propos ?) qui aura comme attribut "UserId" et faisant référence à l'attribut "UserId" de la table "USER".

    C'est la 2ème contrainte que je ne comprends pas : vous créez quelque chose (mais quoi ?) s'appelant "COMMENTAIRE_AK" (encore ce AK, K pour Key je suppose mais le A... c'est peut-être ça qui me manque pour comprendre ?) qui sera à priori unique et qui aura comme attribut "UserId" ?
    A quoi cela sert-il ?

    Désolé mais j'ai d'abord besoin de comprendre cette partie là pour pouvoir être sûr d'avoir à peu près bien compris l'exit du "CommentaireId". (il reste encore quelques zones d'ombres)

    Citation Envoyé par SQLpro Voir le message
    Comme il demeurait à Paris, 55 rue du Cherche-Midi, son ami lui envoya la lettre "rue du Cherche-une heure moins 5" ! Le facteur la déposa dans la bonne boite...
    Ben je dois pas avoir le même facteur parce qu'un des miens (ça change souvent apparemment) avec la bonne adresse et celle-ci étant parfaitement lisible (abonnement = étiquette préimprimée) il a été capable à plusieurs reprises de mettre mon magazine dans la boite d'un voisin, 3 maisons plus loin !

  10. #10
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 000
    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 000
    Points : 30 897
    Points
    30 897
    Billets dans le blog
    16
    Par défaut
    Bonsoir Éric,


    Citation Envoyé par debutant001
    La 3ème contrainte ok : création de la clé étrangère "COMMENTAIRE_USER_AK" (que veut dire le AK à ce propos ?)
    "AK" en l’occurrence est une coquille (suite à copié/collé) : remplacer par "FK" (abréviation de « Foreign Key »). J’ai corrigé le message en conséquence.



    Citation Envoyé par debutant001
    C'est la 2ème contrainte que je ne comprends pas : vous créez quelque chose (mais quoi ?) s'appelant "COMMENTAIRE_AK" (encore ce AK, K pour Key je suppose mais le A... c'est peut-être ça qui me manque pour comprendre ?) qui sera à priori unique et qui aura comme attribut "UserId" ?
    A quoi cela sert-il ?
    Reprenons l’instruction :

    
    create table COMMENTAIRE 
    (
         CommentaireId         int                     not null,
         UserId                int                     not null,
         CommentaireContenu    varchar(255)            not null,
         constraint COMMENTAIRE_PK primary key (CommentaireId),
         constraint COMMENTAIRE_AK unique (UserId),
         constraint COMMENTAIRE_USER_FK foreign key (UserId)
             references USER (UserId) ON DELETE CASCADE 
    );
    
    
    Dans le cadre de la théorie relationnelle, il existe un concept primordial, celui de clé candidate, dont un cas particulier est celui de clé primaire. Je vous renvoie au billet où j’aborde le sujet, ainsi qu’au paragraphe 3.2 de l’article où j’en traite plus à fond.

    Une table possède au moins une clé candidate (sinon c’est un sac, non manipulable au moyen de l’algèbre relationnelle), mais elle peut aussi en posséder plusieurs. Reportons-nous au tableau des éléments chimiques (message #6). Si l’on en fait une table, appelons-la ELEMENT, celle-ci doit être dotée d’un certain nombre de clés candidates :

    {NumeroAtomique}, {Nom}, {SymboleChimique}, etc., sinon on pourrait stocker dans la table ELEMENT des éléments distincts portant le même nom, le même symbole, etc. Par ailleurs comme ça n’est pas mon application qui maîtrise les valeurs de ces clés — celles-ci étant imposées par un système externe — il est prudent de mettre en œuvre une clé dont on ait la maîtrise totale, échappant au système externe. A cet effet, ajoutons un attribut ElementId, faisant lui aussi l’objet d’une clé candidate, plus précisément de la clé primaire {ElementId} de la table (notez l’emploi des accolades, car une clé est un ensemble au sens de la théorie des ensembles, en l’occurrence c’est un singleton, mais néanmoins un ensemble).

    Dans le cadre de la théorie relationnelle :

    
    VAR ELEMENT BASE RELATION 
    {
            ElementId                INTEGER
          , NumeroAtomique           INTEGER
          , Nom                      CHAR
          , SymboleChimique          CHAR
          , ...                      ...
    }
        KEY {ElementId}
        KEY {NumeroAtomique}
        KEY {Nom}
        KEY {SymboleChimique}
        ... ;
    
    
    Dans le contexte SQL :

    
    CREATE TABLE ELEMENT
    (
            ElementId                INT            NOT NULL
          , NumeroAtomique           INT            NOT NULL
          , Nom                      VARCHAR(24)    NOT NULL
          , SymboleChimique          VARCHAR(4)     NOT NULL
          , ...                      ...            ...
        , CONSTRAINT ELEMENT_PK PRIMARY KEY (ElementId)
        , CONSTRAINT ELEMENT_NUMERO_AK UNIQUE (NumeroAtomique)
        , CONSTRAINT ELEMENT_NOM_AK UNIQUE (Nom)
        , CONSTRAINT ELEMENT_SYMBOLE_AK UNIQUE (SymboleChimique)
        ... 
    ) ;
    
    
    Vous aurez noté que dans le cadre de la théorie relationnelle, il n’y a que des clés (sous-entendu candidates). A une époque, cette théorie prenait en compte le concept de clé primaire, mais il a été démontré que ce concept était inessentiel et a donc été éliminé de la théorie.

    Dans le contexte particulier du langage SQL, le concept est resté, car on ne pas imposer la réécriture de l’ensemble des instructions CREATE / ALTER TABLE à l’ensemble de la planète !

    {ElementId} est donc clé primaire de la table ELEMENT, et par contraste, {NumeroAtomique}, {Nom}, {SymboleChimique} sont des clés alternatives (alternate keys), d’où l’abréviation « AK » que j’utilise dans les noms des contraintes (pour savoir rapidement de quoi il en retourne quand le SGBD me renvoie une erreur « duplicate key... ») Cela dit, pour marquer le distinguo entre clé primaire et clé alternative, les responsables de la norme SQL ont préféré utiliser le terme « UNIQUE » plutôt que « ALTERNATE KEY » :

    CONSTRAINT ELEMENT_NOM_AK UNIQUE (Nom)

    Au lieu de

    CONSTRAINT ELEMENT_NOM_AK ALTERNATE KEY (Nom)


    Pour en revenir à votre interrogation, concernant "COMMENTAIRE_AK", il s’agit donc du nom que j’ai donné à une contrainte selon laquelle l’attribut UserId fait l’objet d’une clé candidate, en l’occurrence alternative {UserId}.

    Vous posez la question « A quoi cela sert-il ? »

    Vous avez proposé la représentation merisienne :

    tUser --(0,1)----(Posséder)----(1,1)--tCommentaire

    Ce qui traduit les règles de gestion des données suivantes :

    (RG1) Un utilisateur fait l’objet d’au plus un commentaire ;

    (RG2) Un commentaire concerne un et un seul utilisateur.

    Supposons que je ne déclare pas la contrainte COMMENTAIRE_AK. Rien n’interdit alors d’avoir le contenu suivant pour la table COMMENTAIRE :

    
    CommentaireId    UserId    CommentaireContenu
    
                1         1    commentaire 1
                2         5    commentaire 2
                3         1    commentaire 3
              ...       ...    ...
    
    C'est-à-dire que l’utilisateur 1 fait l’objet de plus d’un commentaire, en contradiction avec la règle (RG1).



    Citation Envoyé par debutant001
    Ben je dois pas avoir le même facteur
    Estimez-vous heureux de ne pas avoir eu le mien... On ne recevait plus de courrier et l’on a demandé à La Poste pour quelle raison. On a eu la réponse quelques jours plus tard : ils l’ont suivi discrètement et l’ont vu balancer le courrier dans une bouche d’égout : en effet, il faisait sa tournée à vélo et la pente menant à notre quartier était trop raide pour lui...
    (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.

  11. #11
    Membre à l'essai Avatar de debutant001
    Profil pro
    Eric
    Inscrit en
    Mai 2002
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Eric

    Informations forums :
    Inscription : Mai 2002
    Messages : 47
    Points : 24
    Points
    24
    Par défaut
    Super, j'ai pigé !
    (si, si, il comprends vite l'garçon mais... faut lui expliquer longtemps)

    Plus sérieusement, j'ai le même problème sur presque toutes mes tables alors ?

    Prenons par exemple la table tSite : j'ai renseigné (alors que j'aurais pas dû) dans mon dictionnaire des données la propriété "sit_i_id" comme étant une clé primaire.
    D'après le "cahier des charges", la cardinalité de l'association "Posséder" entre les entités "tUser" et "tSite" est de type :

    tUser --0,n----(Posséder)----1,1--tSite

    ce qui donne donc au niveau SQL : (j'ai utilisé l'AGL JMerise que j'avais déjà installé avant de créer cette discussion. J'aimerais cependant utiliser DB-MAIN comme vous me l'avez suggéré mais il semblerait - pour l'instant - que son installation sur Linux (Debian) ne soit pas si simple.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE tSite(
            sit_i_id        int (11) Auto_increment  NOT NULL ,
            sit_s_url       Varchar (80) NOT NULL ,
            sit_e_categorie Enum ("Perso","Pro") NOT NULL ,
            use_i_id        Int NOT NULL ,
            PRIMARY KEY (sit_i_id )
    )ENGINE=InnoDB;
    ALTER TABLE tSite ADD CONSTRAINT FK_tSite_use_i_id FOREIGN KEY (use_i_id) REFERENCES tUser(use_i_id);
    Mais cette clé primaire {sit_i_id} fait doublon avec la clé étrangère {FK_tSite_use_i_id} référençant la clé primaire {use_i_id} de la table tUser alors. (j'ai gardé la dénomination initiale dans un souci de cohérence du débat)
    Non ?

  12. #12
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 000
    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 000
    Points : 30 897
    Points
    30 897
    Billets dans le blog
    16
    Par défaut
    Bonsoir Éric,


    Citation Envoyé par debutant001
    cette clé primaire {sit_i_id} fait doublon avec la clé étrangère {FK_tSite_use_i_id} référençant la clé primaire {use_i_id} de la table tUser alors. (j'ai gardé la dénomination initiale dans un souci de cohérence du débat)
    Non ?
    Non !
    Supposons que les deux clés fassent double emploi. Dans ces conditions, l’attribut sit_i_id peut disparaître et le code SQL être remplacé par celui-ci :

    
    CREATE TABLE tSite(
            sit_s_url       Varchar (80) NOT NULL ,
            sit_e_categorie Enum ("Perso","Pro") NOT NULL ,
            use_i_id        Int NOT NULL ,
            PRIMARY KEY (use_i_id)
    )ENGINE=InnoDB;
    ALTER TABLE tSite ADD CONSTRAINT FK_tSite_use_i_id FOREIGN KEY (use_i_id) REFERENCES tUser(use_i_id);
    
    
    Et par rétro-conception, cela conduit à modifier le MCD, à savoir remplacer :

    tUser --0,n----(Posséder)----1,1—tSite

    Par :

    tUser --0,1----(Posséder)----1,1—tSite



    Concernant DB-MAIN, je n’utilise pas Linux mais Windows, je serais donc bien en peine de vous venir en aide...
    (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.

  13. #13
    Membre à l'essai Avatar de debutant001
    Profil pro
    Eric
    Inscrit en
    Mai 2002
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Eric

    Informations forums :
    Inscription : Mai 2002
    Messages : 47
    Points : 24
    Points
    24
    Par défaut
    Mais oui vous avez raison, c'est évident en plus : comme un inscrit peut avoir plusieurs sites, la clé étrangère {use_i_id} ne peut être aussi clé primaire de la table tSite car on ne pourrait alors plus différencier de façon unique un site appartenant à cet inscrit !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sit_s_url   sit_e_categorie   use_i_id
    
     url 1       cat 1             1
     url 2       cat 1             5
     url 3       cat 2             1
     ...         ...               ...
    (je n'ai pas trouvé comment retirer les N° de lignes)

    En fait, j'ai l'impression qu'on ne peut appliquer cette simplification que si, et seulement si, la cardinalité de l'association entre les deux tables est de type 0,1 - 1,1

    Ok, maintenant que je suis en train de remettre un peu tout ça au propre (cahier des charges règles de gestion et dictionnaire des données) j'ai de nouveau besoin de conseil : quelle convention de nommage utiliser pour mes attributs et autres ?
    Bien évidemment ça dépend des préférences de chacun mais il existe forcément une convention plus judicieuse que les autres.

    Par exemple, si je suis celle que vous utilisez fsmrel (ce n'est pas une critique) j'ai un souci de lisibilité dans la table tMail : la clé primaire se nommerait alors {MailId}
    Le nom de cette clé contient deux lettres L minuscules, deux i majuscules, un L et un i, etc ??? (je sais qu'il suffit de modifier la police de caractères pour connaître la réponse mais bon...)

  14. #14
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 000
    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 000
    Points : 30 897
    Points
    30 897
    Billets dans le blog
    16
    Par défaut
    Bonsoir Éric,


    Citation Envoyé par debutant001
    je n'ai pas trouvé comment retirer les N° de lignes
    Vous pouvez remplacer la balise [CODE] par la balise [PRE].


    Citation Envoyé par debutant001
    En fait, j'ai l'impression qu'on ne peut appliquer cette simplification que si, et seulement si, la cardinalité de l'association entre les deux tables est de type 0,1 - 1,1
    Oui et non. Par « si et seulement si », vous établissez une équivalence entre la simplification et la cardinalité 0,1 - 1,1. Mais dans le cas de la généralisation/spécialisation, il y a entre le surtype et le sous-type une relation 0,1 - 1,1, et pourtant il n’y a pas simplification, mais héritage par le sous-type de l’identifiant du surtype.

    Pour mémoire, dans le diagramme ci-dessous, il y a spécialisation de l’entité-type TIERS en CLIENT et FOURNISSEUR. L’entité-type TIERS joue le rôle de surtype, tandis que les entités-types CLIENT et FOURNISSEUR jouent celui de sous-type.





    De même, dans le cas de l’identification relative de type 0,1, 1,1, là encore une entité-type faible est identifiée relativement à une entité-type (plus) forte. Exemple (cf. message #6) :





    DB-MAIN n’a pas simplifié, il a appliqué la règle selon laquelle l’entité-type COMMENTAIRE étant identifiée relativement à l’entité-type USER, elle doit hériter de l’identifiant UserId de USER lors de la dérivation du MCD en MLD.


    En passant, avez-vous réfléchi à la bijection ? Voyez la discussion Viabilité d'une relation de cardinalités 1,1 - 1,1, notamment le message #8...


    Citation Envoyé par debutant001
    quelle convention de nommage utiliser pour mes attributs et autres ?
    Bien évidemment ça dépend des préférences de chacun mais il existe forcément une convention plus judicieuse que les autres.
    Ayant beaucoup bourlingué chez les clients de mon entreprise (une SSII), j’ai assisté à de nombreuses réunions concernant ce sujet, mais n’ai jamais pris position, car si j’ai été DBA (administrateur de bases de données), je n’ai jamais été administrateur des données (chargé notamment du dictionnaire des données de l’entreprise). Partout où je suis passé, les gens étaient très fiers de de leur convention de dénomination... Si vous intervenez sur un projet important (plus de 1000 entités-types), il est évident qu’on soigne particulièrement les conventions de dénomination. Ainsi les noms des entités-types sont généralement préfixés par un code correspondant au référentiel auquel elles appartiennent, et suffixées par un numéro. Exemple : PEP00002 (entité-type PERSONNE), PEI0014 (INDIVIDU), PEI0031 (titre de civilité des individus), etc. Quant au noms des attributs, je n’ai guère d’opinion, sinon qu’il faut éviter les accents, cédilles, espaces, etc. EN tant que DBA, j’ai tendance à écrire PersonneId, PersonneNom, ProduitId, ProduitNom plutôt que IdPersonne, NomPersonne, IdProduit, NomProduit, parce que, dans la soute, j’exploite le catalogue relationnel (la métabase du SGBD), et que les manipulations sont moins onéreuses en CPU et accès au disque quand je recherche tout les attributs ayant trait aux personnes, aux produits, etc. Mais les programmeurs (ou les ergonomes ?) seront sans doute de meilleur conseil quant aux normes de nommage qui fonctionnent bien...
    (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.

  15. #15
    Membre à l'essai Avatar de debutant001
    Profil pro
    Eric
    Inscrit en
    Mai 2002
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Eric

    Informations forums :
    Inscription : Mai 2002
    Messages : 47
    Points : 24
    Points
    24
    Par défaut
    Bonjour à tous,

    Je reviens vers vous et reprends cette conversation, après une semaine vraiment très (trop) chargée !

    Mais entre-temps, j'ai quand même bossé un peu : j'ai réussi à installer DB-Main et à potasser le petit tuto inclu "First steps".
    Voici donc le MCD que j'ai établi suivant nos différentes discussions :
    Nom : Répertoire Téléphonique MCD.jpg
Affichages : 3506
Taille : 69,1 Ko
    Est-ce que ce dernier est bon et surtout définitif, histoire de partir maintenant sur une base solide ? (et n'hésitez surtout pas à le commenter si nécessaire)

    Par contre, je m'interroge encore à propos de l'entité COMMENTAIRE : j'ai utilisé ici la propriété "CommentaireId" comme identifiant mais en fait, je ne sais pas si je dois déjà faire apparaître dans ce MCD la propriété "InscritId", qui va devenir clé primaire et étrangère de la table COMMENTAIRE dans le MLD ? (à quel moment on "bascule" en fait ?)

    Pour les autres entités, normalement tout devrait être ok, non ?

  16. #16
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 000
    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 000
    Points : 30 897
    Points
    30 897
    Billets dans le blog
    16
    Par défaut C'est bien !
    Bonsoir Éric,


    Bel effort. Pour un 1er essai, c’est plutôt bien.


    Je note que l’entité-type ADRESSE est dotée d’un attribut AdresseCategorie et fait référence à l’entité-type CATEGORIE via l’association APPARTENIR : quelle est l’utilité de l’attribut AdresseCategorie ? Ne fait-il pas double emploi ?



    Citation Envoyé par debutant001
    je m'interroge encore à propos de l'entité COMMENTAIRE : j'ai utilisé ici la propriété "CommentaireId" comme identifiant mais en fait, je ne sais pas si je dois déjà faire apparaître dans ce MCD la propriété "InscritId", qui va devenir clé primaire et étrangère de la table COMMENTAIRE dans le MLD ? (à quel moment on "bascule" en fait ?)
    Vous êtes confronté à un problème pour lequel DB-MAIN n’apporte pas de solution dédiée : celui de l’identification relative avec cardinalité 0,1 d’un côté et 1,1 de l’autre. Si PowerAMC et WinDesign offrent la solution, ici vous serez obligé :

    — Soit d’agir au niveau MLD, en supprimant l’attribut CommentaireId et en redéfinissant la clé primaire, laquelle doit être {InscritId} ;

    — Soit d’être pragmatique et ruser au plan sémantique, en considérant l’entité-type COMMENTAIRE comme spécialisation de l’entité-type INSCRIT : de même qu’il y a des papous qu’on spécialise en papous papas, il y a des inscrits qu’on peut spécialiser en inscrits à commentaire...

    Personnellement j’utilise cette 2e solution, car après tout elle n’est pas fausse et elle permet d’éviter de faire des retouches manuelles au stade MLD.

    Exemple. Situation initiale :




    Pour faire de l’entité-type COMMENTAIRE une spécialisation de l’entité-type INSCRIT : cliquer sur l’entité-type COMMENTAIRE pour provoquer l’affichage de la boîte de propriétés (property box) qui lui correspond :





    En cliquant sur le bouton associé à « supertypes », vous provoquez l’ouverture de la fenêtre « Multiple choice dialog » qui fournit la liste des noms des entités-types candidates à être surtypes de COMMENTAIRE. Bien sûr, en l’état du MCD, cette liste ne contient qu’un nom, à savoir "INSCRIT" :






    Dans la boîte de dialogue, on clique sur "INSCRIT" puis sur le bouton « <<Add first », ce qui provoque le transfert de "INSCRIT" à gauche :






    INSCRIT est devenu surtype de COMMENTAIRE. On clique sur « ok » et le MCD a subi la transformation attendue :





    Lors du passage au MLD, on retrouvera un schéma connu et qui convient :






    A propos des identifiants alternatifs :

    Certains attributs méritent de faire l’objet d’identifiants alternatifs. Par exemple, l’URL d’un site (à moins que deux inscrits puissent se partager un même site). En l’occurrence, pour déclarer {SiteUrl} comme tel, on sélectionne l’attribut SiteUrl , et on clique sur le bouton « ID » :






    Au résultat :





    Et maintenant: au MLD ! ("Transform" > "Relational Model").


    En passant, si vous trouvez que tel et tel messages ont pu vous rendre service, n’hésitez pas à leur associer un pouce (vert de préférence ^^) N’ayez pas non plus de scrupule à cliquer sur "fsmrel", puis « Voir le profil Pro », puis « Confirmer les compétences » si vous estimez que j’ai effectivement quelque compétence. Être reconnu ça fait toujours plaisir...
    (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.

  17. #17
    Membre à l'essai Avatar de debutant001
    Profil pro
    Eric
    Inscrit en
    Mai 2002
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Eric

    Informations forums :
    Inscription : Mai 2002
    Messages : 47
    Points : 24
    Points
    24
    Par défaut
    Merci fsmrel pour votre réponse.

    Citation Envoyé par fsmrel
    Je note que l’entité-type ADRESSE est dotée d’un attribut AdresseCategorie et fait référence à l’entité-type CATEGORIE via l’association APPARTENIR : quelle est l’utilité de l’attribut AdresseCategorie ? Ne fait-il pas double emploi ?
    Heu... comment dire... votre remarque m'a permis de réaliser que j'ai oublié une ligne importante dans les règles de gestion et que j'ai aussi fait une erreur en transcrivant (de mémoire) mon MCD de jMerise à DB-Main !

    Voici donc la màj des règles de gestion :

    • On connaît obligatoirement au moins un N° de téléphone (fixe ou portable) ainsi que les titres, prénoms ou pseudos (et si possible les catégories et noms de famille) de chacune des personnes inscrites dans cet annuaire.
    • Les numéros de téléphone seront présentés sous la forme : 01 23 45 67 89
    • Une personne devra être classée dans l'une des catégories suivantes : famille ou ami ou pro ou modèle ou photographe ou autre.
    • Une personne peut avoir zéro, une ou plusieurs adresses postales qui seront alors identifiées comme « Adresse principale » ou « Adresse secondaire » ou « Adresse pro ».
    • Une personne peut avoir zéro, une ou plusieurs téléphones fixes qui seront alors identifiés comme « Téléphone perso » ou « Téléphone pro ».
    • Une personne peut avoir plusieurs téléphones portables qui seront alors identifiés comme « Téléphone perso » ou « Téléphone pro ».
    • Une personne peut avoir zéro, un ou plusieurs pseudos.
    • Une personne peut avoir zéro, une ou plusieurs adresses mails qui seront alors identifiées comme « Adresse mail perso » ou « Adresse mail pro ».
    • Une personne peut avoir zéro, un ou plusieurs sites web qui seront alors identifiés comme « Site web perso » ou « Site web pro ».
    • Une personne peut avoir zéro ou une date de naissance qui sera alors présentée sous la forme : JJ-MM-AAAA
    • On pourra éventuellement noter quelques observations à propos d'une personne. (255 caractères max)


    et du MCD :

    Nom : Répertoire Téléphonique MCD.jpg
Affichages : 3919
Taille : 68,1 Ko

    Je pense que ça répond maintenant mieux à votre interrogation...

    Par contre, cela m'amène à me poser la question suivante : il y aurait sûrement un intérêt à regrouper les catégories des différentes entités ADRESSE, MAIL, SITE, et TELEPHONE dans la seule et même entité CATEGORIE.
    Mais alors comment restreindre les libellés "pro" ou "perso" aux seules entités MAIL, SITE et TELEPHONE, et les libellés "principale" ou "secondaire" ou "pro" à la seule entité ADRESSE, et enfin les libellés "famille" ou "ami" ou "pro" ou "modèle" ou "photographe" ou "autre" à la seule entité INSCRIT ?
    Et question subsidiaire, est-ce possible/judicieux de "regrouper/mélanger" les trois libellés "pro" (qu'on retrouve dans toutes les entités ayant une catégorie) en un seul libellé "pro" ? (je sais pas si mes propos sont très clairs)

    Citation Envoyé par fsmrel
    Certains attributs méritent de faire l’objet d’identifiants alternatifs. Par exemple, l’URL d’un site (à moins que deux inscrits puissent se partager un même site).
    Ne sachant pas ce qu'est exactement un identifiant alternatif et surtout quel est son but, j'ai cherché un peu sur le Net et (un hasard) je suis tombé sur ce billet
    Ce que je comprends de votre explication dans ce dernier et de votre remarque ci-dessus, c'est qu'un identifiant alternatif est nécessaire dans l'entité SITE si (dans les règles de gestion) deux inscrits ne peuvent pas partager la même URL d'un site, c'est bien ça ?

  18. #18
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 000
    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 000
    Points : 30 897
    Points
    30 897
    Billets dans le blog
    16
    Par défaut
    Bonsoir Éric,


    D’accord pour les règles de gestion des données, à ceci près que ce qui concerne l’aspect présentation des données ne figure pas en principe dans ces règles (format des dates ou des numéros de téléphone).


    Concernant les catégories. D’un point de vue théorique, vous pouvez considérer un inventaire à la Prévert, structuré sous la forme d’un ensemble, plus précisément d’une relation au sens de la théorie relationnelle, appelons-la CATEGORIE, que l’on peut représenter ainsi :


    
    CategorieId    CategorieLibelle
              1    pro
              2    perso
              3    principale
              4    secondaire
              5    ami
              6    photographe
              7    modèle
              8    famille
              9    autre
    
    

    C'est-à-dire que vous regroupez tous les libellés, quelles que soient les catégories spécialisées.
    A partir de là, vous pouvez définir des sous-ensembles de l’ensemble CATEGORIE, plus précisément des projections :

    
    CATEGORIE_INSCRIT
    
    CategorieId 
              1
              5
              6
              7
              8
              9
    
    
    CATEGORIE_ADRESSE
    
    CategorieId
              1
              3
              4
    
    
    CATEGORIE_DIVERS
    
    CategorieId 
              1
              2
    
    

    Et vous branchez les entités-types en conséquence :

    INSCRIT sur CATEGORIE_INSCRIT, ADRESSE sur CATEGORIE_ADRESSE, TELEPHONE, SITE et MAIL (ou COURRIEL ...) sur CATEGORIE_DIVERS.

    Pour leur part, au niveau MCD, CATEGORIE_INSCRIT, CATEGORIE_ADRESSE, CATEGORIE_DIVERS sont des sous-types de CATEGORIE, on procède ici par généralisation (une mise en facteur commun en quelque sorte) :




    Pour obtenir le libellé de la catégorie des inscrits, en descendant au niveau SQL, vous créez par exemple une vue (c'est-à-dire une table, virtuelle certes, mais néanmoins table du point de vue des requêtes), appelons-la CATEGORIE_INSCRIT_V :

    
    CREATE VIEW CATEGORIE_INSCRIT_V (CategorieId, CategorieLibelle) AS
        SELECT CATEGORIE.CategorieId, CATEGORIE.CategorieLibelle
        FROM   CATEGORIE_INSCRIT JOIN CATEGORIE ON CATEGORIE_INSCRIT.CategorieId = CATEGORIE.CategorieId
    
    
    Suite à quoi, par exemple pour obtenir la liste des catégories selon cette vue :

    
    SELECT CategorieId, CategorieLibelle
    FROM    CATEGORIE_INSCRIT_V ;
    
    
    =>

    
    CategorieId    CategorieLibelle
              1    pro
              3    principale
              4    secondaire
    
    
    Voilà en gros pour un aspect théorique des choses...


    Sinon, on modélise habituellement ainsi :







    Citation Envoyé par debutant001
    Un identifiant alternatif est nécessaire dans l'entité SITE si (dans les règles de gestion) deux inscrits ne peuvent pas partager la même URL d'un site, c'est bien ça ?
    Voui. Non seulement Fernand et Raoul ne peuvent pas se partager une même URL, mais en plus, l’identifiant alternatif empêche qu’un inscrit ait plus d’une fois la même URL : une valeur d’URL ne peut être présente qu’une seule fois, exactement comme une valeur de SiteId.


    A titre d'exercice, si vous reprenez le tableau des éléments chimiques, vous constaterez qu’il y a quelques identifiants alternatifs à prévoir...


    Titres des inscrits : il est d’usage de mettre en oeuvre une entité-type TITRE.



    Et merci pour les votes.
    (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.

  19. #19
    Membre à l'essai Avatar de debutant001
    Profil pro
    Eric
    Inscrit en
    Mai 2002
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Eric

    Informations forums :
    Inscription : Mai 2002
    Messages : 47
    Points : 24
    Points
    24
    Par défaut
    Ok, merci fsmrel.

    Voici donc une nouvelle version du MCD, espérant avoir compris (assimilé, pour l'instant pas tout ! => "J'ai la tête qui éclate. J'voudrais seulement dormir..." ) toutes ces nouvelles infos :

    Nom : Répertoire Téléphonique MCD.jpg
Affichages : 3173
Taille : 95,9 Ko

    (Sachant que l'on considère comme possible - mais rare - le fait que plusieurs inscrits puissent avoir le même téléphone et/ou le même mail et/ou le même pseudo. Par contre, je ne pense pas que l'ajout d'un identifiant alternatif soit nécessaire pour les entités ADRESSE, TITRE, et COMMENTAIRE... si ?)

    Citation Envoyé par fsmrel
    Titres des inscrits : il est d’usage de mettre en oeuvre une entité-type TITRE.
    Quel est l'intérêt de procéder ainsi ?

    Sinon, je vais peut-être plus vite que la musique (je ne sais pas si cette fois mon MCD est correct) mais voici le MLD associé :

    Nom : Répertoire Téléphonique MLD.jpg
Affichages : 3376
Taille : 123,6 Ko

    (désolé, j'ai pas réussi à trouver comment mieux arranger les liaisons entre les différentes tables)

    Après, je crois savoir qu'il y a des simplifications à faire sur les index (access keys) mais je n'ai pas vraiment bien compris quels sont ceux à enlever et ceux à laisser comme tel... (leur tuto n'a - pour moi - pas été assez clair à ce sujet)

    Citation Envoyé par fsmrel
    Et merci pour les votes.
    Avec plaisir !
    C'est la moindre des politesses... vu le temps que vous acceptez de prendre à chaque fois pour me répondre !!!

  20. #20
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 000
    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 000
    Points : 30 897
    Points
    30 897
    Billets dans le blog
    16
    Par défaut
    Bonsoir Éric,


    Citation Envoyé par debutant001
    J'ai la tête qui éclate
    Prise de tête ? Avec le temps, tout ça se mettra en place

    En tout cas on progresse...

    Une mise au point quand même concernant la généralisation/spécialisation : les sous-types CATEGORIE_INSCRIT, CATEGORIE_ADRESSE, CATEGORIE_DIVERS, héritent du surtype CATEGORIE, notamment de son identifiant et n’ont donc pas besoin d’avoir un autre identifiant. Revenons sur la représentation que j’avais proposée dans le message #16, concernant COMMENTAIRE :





    Au stade tabulaire, l’AGL a effectivement traduit l’héritage en faisant de {InscritId} la clé primaire de la table COMMENTAIRE (et étrangère bien sûr, en relation avec la table INSCRIT) :






    En vertu de la proposition d’Ockham (évoqué dans les messages #2 et #6), l’attribut Commentaireid étant totalement inutile, il doit disparaître de votre entité-type COMMENTAIRE.



    Citation Envoyé par debutant001
    je ne pense pas que l'ajout d'un identifiant alternatif soit nécessaire pour les entités ADRESSE, TITRE, et COMMENTAIRE... si ?)
    Le jeu n’en vaut pas la chandelle (notamment pour COMMENTAIRE !)

    Mais...

    Que deux inscrits puissent se partager un même numéro de téléphone, d’accord. Cependant rien n’empêche ici que Raoul ait deux fois le même numéro de téléphone... Pour éviter cela, il faut agir au niveau du diagramme relationnel et définir une clé alternative {InscritId, TelephoneNumero} :





    Pour réaliser cela, définir un des deux attributs de la clé alternative, par exemple TelephoneNumero, comme clé :






    =>






    Cliquer sur la ligne "id’ : TelephoneNumero" pour faire apparaître la fenêtre « Property box », puis cliquer sur le bouton qui va bien dans cette fenêtre, ce qui fait apparaître à son tour la fenêtre « Multiple choice dialog », et là on peut ajouter l’attribut InscritId comme participant à la clé alternative :






    Adresses de courriel et pseudos : même observation...



    Citation Envoyé par debutant001
    Citation Envoyé par fsmrel
    Titres des inscrits : il est d’usage de mettre en oeuvre une entité-type TITRE.
    Quel est l'intérêt de procéder ainsi ?
    Le même que pour les catégories : éviter d’écrire la même chose de 36 façons différentes dans la table INSCRIT : une fois « M. », une autre fois « Monsieur », encore une autre fois « Mr. », etc. On est dans la série dite des « tables de codes ». Vous me direz qu’avec PostgreSQL (contrairement à MySQL), on peut coder une contrainte (NOMM2E CHK01 ci-dessous) faisant qu’après tout la table TITRE n’est pas indispensable :

    
    CREATE TABLE INSCRIT
    (
            InscritId            INT           NOT NULL
          , InscritNom           VARCHAR(16)   NOT NULL
          , Titre                VARCHAR(16)   NOT NULL    
        , CONSTRAINT INSCRIT_PK PRIMARY KEY (InscritId) 
        , CONSTRAINT CHK01 CHECK (Titre IN ('M.', 'Mme', 'Mlle', 'Dr'))
    ) ;
    
    
    => Vous choisissez... En tout cas pour ma part je n’aime pas trop les énumérations, en cas de modification il est plus simple d’agir sur la table TITRE que d’en passer par des ALTER TABLE.



    Citation Envoyé par debutant001
    j'ai pas réussi à trouver comment mieux arranger les liaisons entre les différentes tables.
    Ne vous tracassez surtout pas avec ça, ce qui compte c’est le MCD et le code SQL...


    Citation Envoyé par debutant001
    je crois savoir qu'il y a des simplifications à faire sur les index (access keys) mais je n'ai pas vraiment bien compris quels sont ceux à enlever et ceux à laisser comme tel
    Là, on descend carrément dans la soute, on est dans le MPD (Modèle physique des données)... En général, avec les SGBDR il est exigé que les clés primaires et alternatives soient dotées d’un index (de type UNIQUE), car les éditeurs de ces SGBD ont ainsi l’assurance que l’unicité sera garantie sans qu’ils aient de leur côté à développer du code. Sinon, d’une façon générale, la mise en oeuvre d’un index n’est utile que pour booster les performances quand les requêtes se traîneraient autrement (grands balayages de tables). Comme DB-MAIN n’a pas connaissance de ces requêtes, on peut considérer qu’a priori les index appliqués aux clés étrangères sont à éliminer. En effet, si un index est bon en consultation (pour les accès très sélectifs), en revanche ils peuvent coûter la feau des pesses en mise à jour, je vous renvoie à ce sujet à une expérience caractéristique dans une banque méridionale (suppression des chèques).
    (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.

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/09/2012, 11h52
  2. Dictionnaire des données et le Reporting
    Par RahmaMB dans le forum Approche théorique du décisionnel
    Réponses: 1
    Dernier message: 28/07/2011, 12h11
  3. Réponses: 6
    Dernier message: 13/12/2010, 20h20
  4. Dictionnaire des données
    Par arsenik dans le forum PowerAMC
    Réponses: 3
    Dernier message: 23/06/2010, 23h05
  5. [DF] Dictionnaire des données et Dépendances fonctionnelles
    Par vivicente dans le forum Schéma
    Réponses: 4
    Dernier message: 09/09/2009, 17h16

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