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 :

Entité générique, pointant sur "ce qu'on veut" [MCD]


Sujet :

Schéma

  1. #1
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut Entité générique, pointant sur "ce qu'on veut"
    Bonjour,

    Je suis en train de concevoir un MCD, dans lequel une entité doit pouvoir pointer sur différentes autres entités.

    Dans mon cas, par exemple, il s'agit de commentaires dans une application web. On doit pouvoir poster des commentaires sur des utilisateurs, des annonces, des articles, des variétés (botaniques !), et ainsi de suite.

    Mon entité ressemblerait grosso modo à ceci :






    Le schéma général d'une liaison générique ressemble donc à ceci :



    Quels sont les avantages et inconvénients de ce schéma / usage ?


    Voici ce que j'imagine :

    Avantages



    • Ça réduit le nombre d'entités si le concept est le même (des commentaires, par exemple) ;
    • On peut plus facilement manipuler des objets hétérogènes ;
    • On peut agréger ces objets plus facilement également (ex : montrer dans un même fil les derniers commentaires de cet utilisateur, peu importe où ils ont été postés);

    Inconvénients


    • Il n'y a pas de contrôle dans le SGBD, donc celui-ci doit être fait dans le code ;
    • Cela permet de faire des branchements arbitraires sur des enregistrements. Réalisé de manière outrageuse, cela peut être très malpropre ;
    • Quels seraient les impacts en termes de performances ?

    Conclusion

    Est-ce qu'on peut utiliser ce type de schéma de conception sur une base de données relationnelles ?
    Sinon, que faut-il faire ?

    Merci d'avance.
    Hayiiiiiiiiiiiiii !

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,


    Avez-vous regardez du côté de l'héritage ?

    http://sqlpro.developpez.com/cours/m...tion/heritage/

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    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 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Le Barde Voir le message
    Inconvénients

    Il n'y a pas de contrôle dans le SGBD, donc celui-ci doit être fait dans le code ;
    Faux ! voir ci après
    Cela permet de faire des branchements arbitraires sur des enregistrements. Réalisé de manière outrageuse, cela peut être très malpropre
    Rien ne vous empêche de gérer ceci à coup de déclencheur :
    1) sur la table des commentaires lors de l'ajout et suppression des commantaires
    2) sur chacune des tables à commenter (en général pas toutes !)
    Quels seraient les impacts en termes de performances ?
    Plutôt bénéfiques

    Conclusion

    Est-ce qu'on peut utiliser ce type de schéma de conception sur une base de données relationnelles ?
    Sinon, que faut-il faire ?
    Vous pouvez aussi utiliser de l'XML, c'est très intéressant, à conditions :
    1) que votre SGBDR le supporte nativement (donc exit Access ou MySQL)
    2) qu'il soit indexable (donc exit PostGreSQL)

    Merci d'avance.
    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/ * * * * *

  4. #4
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    Bonjour,

    Apparemment le message précédent a complètement fichu la page html en vrac. Serait-il à reformater ?

    À part ceci, cela paraît encourageant ; je vais me renseigner sur les déclencheurs.
    Hayiiiiiiiiiiiiii !

  5. #5
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    Merci beaucoup pour votre réponse, c'est très éclairant, et je crois que je vais utiliser quelque chose comme cela !

    Bonne continuation.
    Hayiiiiiiiiiiiiii !

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

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

    Intéressant. A mon avis, c'est typiquement le cas où il faut travailler manuellement sur les tables après le MCD.

    Règles de gestion :
    • 1 entité1 peut possèder 0 ou plusieurs commentaires ;
    • 1 commentaires est lié à 0 ou 1 entité1 ;
    • 1 entité2 peut possèder 0 ou plusieurs commentaires ;
    • 1 commentaires est lié à 0 ou 1 entité2 ;
    • 1 entité3 peut possède 0 ou plusieurs commentaires ;
    • 1 commentaires est lié à 0 ou 1 entité3 ;
    • etc...



    MCD :

    Nom : Capture.JPG
Affichages : 496
Taille : 53,0 Ko

    ou, peut-être :

    Nom : Capture1.JPG
Affichages : 476
Taille : 46,3 Ko


    En final, il me semble que les tables devraient être les suivantes :
    • Entite1(IdEntite1, ...) ;
    • Entite2(IdEntite2, ...) ;
    • Entite3(IdEntite3, ...) ;
    • Commentaire(IdCommentaire, EntiteConcernee, #IdEntiteConcernee, ...) ==> EntiteConcernee=nom de l'entité concernée en chaîne de caractères.

    A chaque création de commentaire, l'application devra stocker le nom de l'entité "en clair" dans EntiteConcernee, et l'Id correspondant dans IdEntiteConcernee.
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Revenons au besoin de départ :
    On doit pouvoir poster des commentaires sur des utilisateurs, des annonces, des articles, des variétés (botaniques !), et ainsi de suite.
    Autrement dit, on a la règle de gestion suivante, par exemple pour les commentaires sur les articles :
    Un commentaire peut concerner un article et un article peut être concerné par plusieurs commentaires.

    Ce qui donne le MCD suivant :
    Commentaire -0,1----concerner----0,n- Article

    On en déduit les tables suivantes :
    te_commentaire_cmt (cmt_id, cmt_texte...)
    te_article_art (art_id, art_titre...)
    tj_cmt_concerner_art_cca (cca_id_commentaire, cca_id_article...)

    Étendons aux autres objets des commentaires donnés dans le besoin exprimé :
    te_utilisateur_uti (uti_id, uti_login...)
    tj_cmt_concerner_uti_ccu (ccu_id_commentaire, ccu_id_utilisateur...)

    te_annonce_anc (anc_id, anc_texte...)
    tj_cmt_concerner_anc_ccan (ccan_id_commentaire, ccan_id_annonce...)

    te_variete_vrt (vrt_id, vrt_nom...)
    tj_cmt_concerner_vrt_ccv (ccv_id_commentaire, ccv_id_variete...)

    Si on décide qu'un commentaire peut concerner un truc qui n'est pas encore modélisé, il suffit d'ajouter la table du truc et la table de jointure avec celle des commentaires. Le modèle est ainsi extensible à l'infini et sans douleur.

    Avec ce modèle, un commentaire peut porter à la fois sur un article, un utilisateur, une variété... façon tags des CMS.
    Si un commentaire ne doit concerner qu'une seule chose (article OU utilisateur OU...), alors il faut des triggers pour s'assurer que le commentaire n'est pas déjà référencé dans une table de jointure et supprimer éventuellement cette référence avant de créer la nouvelle dans une autre table de jointure.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

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

    La question centrale est bien : 1 commentaire ne doit-il concerner que 1 et 1 seule entité ? (ce qui semble être le cas dans le premier post de Le Barde)

    • Si oui, alors la clé primaire de cette entité devrait être stockée dans la table Commentaire, avec quelque chose qui permet de savoir de quelle entité il s'agit (pourquoi pas le nom de la table en dynamique) ;

    • Si non, alors, effectivement :
      • comme tu le proposes, créer autant de tables de liaison que d'entités concernées qui doivent stocker le couple IdCommentaire, IdRecordEntiteConcernee, le nom de la table de liaison indiquant, dans ce cas, de quelle entité il s'agit ;
        ou
      • créer une table de liaison qui doit stocker le triplet IdCommentaire, IdRecordEntiteConcernee, NomEntiteConcernee.



    La balle est dans le camp de Le Barde...
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Je vois deux inconvénients à ton système :

    1) Le nom de l'entité en clair dans une colonne va occuper de la place.
    Il vaudrait mieux une table des entités et une clé étrangère vers celle-ci.

    2) La référence à l'article ou à l'utilisateur ou... ne sera pas une vraie clé étrangère, d'où le risque de pointer vers un truc qui n'existe plus.

    C'est pourquoi je préconise plutôt un contrôle de l'unicité de la référence via une procédure de modification de la référence du commentaire qui supprimera d'abord toute autre référence de ce commerntaire.

    En gros...
    1) À la création d'un commentaire, l'utilisateur choisit à quoi il se rapporte (un seul truc).
    => INSERT dans la table des commentaires.
    => INSERT dans la table de jointure appropriée

    2) À la modification d'un commentaire sans changer ce à quoi il se rapporte.
    => UPDATE de la table des commentaires.

    3) À la modification d'un commentaire avec changement de ce à quoi il se rapporte.
    => UPDATE de la table des commentaires.
    => Procédure de modification de la référence qui :
    a) DELETE FROM la table de jointure de la référence existante.
    b) INSERT dans la table de jointure appropriée à la nouvelle référence.

    Ça me semble être la solution la plus sûre, d'autant plus que la procédure peut locker la table le temps de son exécution au cas où un autre utilisateur ferait le même genre de modif.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Citation Envoyé par CinePhil
    1) Le nom de l'entité en clair dans une colonne va occuper de la place.
    Il vaudrait mieux une table des entités et une clé étrangère vers celle-ci.
    ==> excellente idée !

    Le reste tient la route : la balle est dans le camp de Le Barde...
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

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

Discussions similaires

  1. initialiser une struc pointant sur une struct
    Par gronaze dans le forum C
    Réponses: 5
    Dernier message: 30/03/2006, 17h07
  2. UPDATE en ajoutant un 0 sur un champ de type "char"
    Par doum2 dans le forum Requêtes
    Réponses: 1
    Dernier message: 08/03/2006, 15h22
  3. TABLE pointant sur elle-même, requete de selection recursive
    Par Mike@Nestor dans le forum Langage SQL
    Réponses: 1
    Dernier message: 27/07/2005, 15h50
  4. Liste déroulante pointant sur une page
    Par krfa1 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 18/03/2005, 10h26
  5. Transtyper element d'1 variable pointant sur TList?
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 25/02/2003, 23h53

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