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 :

Héritage et performances [MLD]


Sujet :

Schéma

  1. #1
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut Héritage : utilité et performances
    Bonjour,
    je débute un peu dans la modélisation de BDD et je viens de lire cet article sur l'héritage.

    Je veux créer une base où des personnes possèdent des listes de produits, ces produits ont des informations générales (comme un commentaire, un lien...) et spécifiques (nom d'artiste pour un CD, réalisateur pour un film...). L'héritage semble donc plutôt approprié mais j'ai un peu du mal à l'appréhender dans une base de données.

    En gros je pourrais soit faire une table différente pour chaque produit différent, où chaque produit est lié par une clé étrangère à une personne.
    Soit utiliser l'héritage, mais je vois assez mal comment il est implémenté en SQL.

    Si j'ai bien compris les tables doivent ensuite être jointes pour retrouver l'ensemble des informations à la fois de la table mère et la table fille. Est-ce que cela ne peut pas être dérangeant au niveau performances ? Comparé à une table où l'on récupère directement un tuple contenant tout ce qu'il faut.

    Merci d'avance de vos conseils.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Vouloir faire une table pour les CD, une autre pour les films... est une mauvaise idée si, comme tu sembles le dire, les CD et les films ont des attributs en commun et ne sont que des spécialisations de produits.

    En gros dans ton cas :
    Personne -0,n----Posséder----0,n- Produit -1,1----Typer----0,n- Type
    Film -1,1----Etre-------------------(0,1)------|
    CD -1,1-----Etre-------------------(0,1)------|

    Ce qui donne les tables :
    Personne (PER_Id, PER_Nom, ...)
    Type (TYP_Id, TYP_Libelle,...)
    Produit (PRD_Id, PRD_IdType, PRD_Lien, PRD_Commentaire...)
    Film (F_IdProduit, F_Titre, F_Annee...)
    CD (CD_IdProduit, CD_Année, ...)
    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 !

  3. #3
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Je ne comprends pas comment le lien est fait entre PRD_Id et F_IdProduit, par PRD_IdType ? mais à quel niveau ? Je veux dire en POO on utiliserait le polymorphisme, mais là je ne vois pas comment appliquer cette approche.
    Et où placerais tu le lien entre personne et produit ? dans Produit ?

    Et j'en reviens donc à ma question de base, j'imagine qu'ensuite il faudra des jointures à chaque requête, en quoi est-ce mieux qu'une table par type de produit ? Des valeurs de même types sont éparpillées peut être, mais pas du tout redondantes non ?

    Merci de votre patience ^^

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    F_IdProduit est à la fois clé primaire et clé étrangère faisant référence à PRD_Id. Idem pour CD_IdProduit.

    Donc oui bien sûr il faut faire des jointures. Mais pas d'affolement, les SGBD sont optimisés pour ça.

    Une BDD bien structurée, avec des identifiants (et donc des clés étrangères) de type entier non signé et correctement indexée fonctionne très bien, même avec plusieurs centaines de milliers de lignes par table, même avec des requêtes à plusieurs jointures.

    Après bien sûr il ne faut pas avoir en guise de serveur un vieux PC récupéré au grenier !
    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 !

  5. #5
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    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 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut Vues et mise à jour
    Bonsoir,

    A partir des jointures, vous pouvez produire des tables virtuelles (vues), disons ProduitFilm et ProduitCD. (Notez que l’attribut IdType de la table Produit fait alors double emploi).

    Du point de vue de la norme SQL, ces tables peuvent être mises à jour comme les tables de base. Simplement, si votre SBGD n’est pas à niveau et refuse de mettre à jour de telles vues, il suffit que, sous le capot, des triggers interceptent les instructions INSERT, UPDATE , DELETE et fassent le dispatching sur les tables sous-jacentes.

    Vous pouvez vous inspirer d'un message traitant de la mise à jour de vues de jointure, reprenant une discussion qui avait été malheureusement effacée.
    (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.

  6. #6
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Je comprends mieux comment appliquer l'héritage merci !

    Cependant je ne vois toujours pas l'intérêt de cette méthode, on gagne un peu de temps et on simplifie la création de la base d'accord (quoiqu'avec la gestion des vues, ça se vaut). Mais au niveau utilisation même si les performances restent acceptables, je ne vois pas en quoi c'est un avantage ?

  7. #7
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    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 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut Héritage ou pas héritage ?
    Citation Envoyé par YoniBlond Voir le message
    Je comprends mieux comment appliquer l'héritage merci !

    Cependant je ne vois toujours pas l'intérêt de cette méthode, on gagne un peu de temps et on simplifie la création de la base d'accord (quoiqu'avec la gestion des vues, ça se vaut). Mais au niveau utilisation même si les performances restent acceptables, je ne vois pas en quoi c'est un avantage ?
    Je ne sais pas ce que vous voulez dire par « gagner un peu de temps ». Quoi qu’il en soit, quand on modélise les données, on ne cherche pas à gagner du temps. S’il s’agit du temps passé à modéliser, l’argument est sans objet. Mieux vaut réfléchir un peu plus lors de la conception plutôt qu’avoir à rattraper le coup une fois la base de données en production. S’il s’agit de la performance des applications, CInephil vous a expliqué que la jointure (opération relationnelle par excellence) était l’objet de tous les soins de la part des SGBDR. Si elle n’avait pas été rendue performante, ça fait trente ans que ces SGBD seraient passés à trappe. De même, quand vous dites « même si les performances restent acceptables », il s’agit là d’une appréciation subjective le plus souvent démentie par une observation objective des performances de la base de données, sous réserve bien sûr ce que ces performances aient été optimisées à l'occasion d'un prototypage ad-hoc soigné.

    Maintenant, je récapépète : deux scénarios sont en compétition :
    1) Mise en œuvre d’une table unique Produit, dont un sous-ensemble E1 des attributs est commun à tous les types de produits, un sous-ensemble E2 de ces attributs est spécifique à une catégorie de produits (films) et un sous-ensemble E3 est spécifique à une autre catégorie de produits (CD).

    2) Mise en œuvre d’une table Produit dont les attributs sont ceux du sous-ensemble E1, accompagnée d’une table Film dont les attributs sont ceux du sous-ensemble E2 et d’une table CD dont les attributs sont ceux du sous-ensemble E3. Les tables Film et CD sont issues d’une spécialisation de l’entité-type Produit au niveau conceptuel.

    Je pense que vous avez compris l’intérêt des vues construite à partir de ces tables : indépendance vis-à-vis du modèle sous-jacent. Que vous persistiez dans votre vision mono-table ou que vous vous rangiez à l’avis de CinePhil, dans les deux cas vous mettez en œuvre une vue ProduitFilm pour que l’utilisateur (programme ou terminaliste) ait une vision « Film » des produits et une vue ProduitCD pour que ce même donc utilisateur ait une vision « CD ». Sous le capot, dans le premier cas, les vues correspondent à une projection/restriction (SELECT attr1, attr2, ... WHERE IdType = type) alors que dans le 2e cas, il s’agit d’une jointure naturelle entre les tables Produit et Film d’une part, Produit et CD d’autre part).

    D’un point de vue fonctionnel, grâce au vues, il n’y a donc pas de différence, tant mieux pour l’utilisateur final. Si l’on passe au niveau physique, la différence est pour le moins radicale, et seul un prototypage des performances permettra de comparer la rapidité d’exécution des requêtes (sans oublier que certaines d’entre elles peuvent ne concerner que la partie spécifique des produits, auquel cas le système n’aura pas besoin d’effecteur de jointure). Mais un problème préoccupant apparaît quand on utilise une seule table Produit dans laquelle sont mélangés films et CD : à moins d’utiliser des valeurs par défaut du type « sans objet » quand tels sous-ensembles d'attributs (à savoir E2 ou E3) ne sont pertinents que pour tel type de produit, les marques « NULL » vont envahir la table Produit et à chaque instant on risque l’accident, car la présence du bonhomme NULL peut nous faire prendre des vessies pour des lanternes. En plus, NULL ne permet pas aux optimiseurs des SGBDR de s’exprimer pleinement.

    Au niveau physique, il y a aussi le problème de la volumétrie, qui a une incidence en termes d’organisation et de coût financier. En ce sens, prenons l’exemple d’un organisme qui suit les entreprises et leurs salariés. Supposons que l’on ait un million d’entreprises (table Entreprise) pour dix millions d’individus (table Individu). Supposons que le nombre d’octets nécessaire soit le même pour constituer une ligne Entreprise ou une ligne Individu, disons 200 octets, dont une quarantaine correspondent aux attributs communs. A peu de choses près, la consommation en espace est de l’ordre de 4 gigaoctets si l’on n’utilise qu’une table et 2,2 gigaoctets, soit près de deux fois moins si l’on a trois tables. Est-ce intuitif ? L’écart peut devenir plus important quand le nombre d’octets spécifiques est plus important dans le cas des entreprises. Il faut aussi tenir compte de l’occupation des index, etc., etc.

    Vous me direz que 4 GO ou 2 GO, ça n’est pas grand-chose. Mai si on utilise plusieurs fois le même scénario dans la base de données, ça peut devenir préoccupant. Et puis les productions informatiques — qui courent après le temps — préfèrent gérer plusieurs petites tables qu’une grosse (parallélisation des tâches de service, telles que sauvegardes et réorganisations).En vrac, sont encore à prendre en compte certains effet secondaires, tels que les phénomènes de contention (verrouillage) plus fréquents avec une table unique.

    Mais bon, ce ne sont que des considérations d’ordre physique et vous préférerez en revenir au niveau sémantique. Vous observerez dans le MCD ci-dessous, que la version dans laquelle l’entité-type Personne est « repliée » (version « Sans héritage », souffre de certains défauts par rapport à la version dans laquelle Entreprise et Individu sont mis en évidence (version « Héritage »). Par exemple, comment prendre en compte le fait qu’une entreprise emploie au moins un individu ? Qu’un individu est nécessairement employé par une entreprise ? Qu’un individu a au moins un élément de paye ? Et au niveau tabulaire, ça devient de moins en moins jojo (par exemple, clés étrangères dont les colonnes sont marquées NULL) sans parler de la surcharge de programmation...



    A vous de voir.
    (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.

  8. #8
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Merci de cette réponse complète et précise ! Loin de moi l'idée de critiquer l'héritage, j'ai dû paraitre un peu rustre désolé. Je cherche juste à comprendre où se situent ces avantages car ils ne me paraissent pas évidents.

    Par contre vous mettez en opposition un modèle "une table pour tout" avec le modèle d'héritage. Mais ce n'est pas vraiment ce que je voulais comparer. Mon idée première avec mes connaissances limitées en BDD était de faire une table par produit différent, et non pas une table regroupant tous les attributs de tous les produits.
    J'ai dessiné rapidement ce que je veux dire :
    Nom : bdd.PNG
Affichages : 650
Taille : 8,8 Ko

    Je me rends compte que la différence va sûrement se faire au niveau de l'association d'un produit avec une personne étant donné que dans mon idée première chaque type de produit à une clé primaire différente (impossible donc de retrouver un certain produit sans connaitre son type). C'est probablement là que l'héritage devient intéressant.

    Je suppose que ce n'est pas un critère déterminant, mais cette base a pour but d'être utilisée par un site web, et pas directement par des utilisateurs. Enfin bien sûr plus la base est simple d'utilisation plus la programmation en sera facilitée.

    Merci de votre patience, j'arrête d'abuser de votre temps, mais j'aime comprendre le pourquoi du comment.

  9. #9
    Membre chevronné Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Points : 1 819
    Points
    1 819
    Par défaut
    C'est un bon sujet d'ORM'ant contre les SQL'iens .
    En vérité c'est l'inverse, mais le jeu de mots phonétiquement tenait moins bien la route.

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

Discussions similaires

  1. Héritage SQL et performances
    Par BigFoot69 dans le forum Décisions SGBD
    Réponses: 17
    Dernier message: 18/04/2014, 17h16
  2. problème de performance en héritage
    Par InfOCynO dans le forum Développement
    Réponses: 3
    Dernier message: 31/10/2012, 16h40
  3. Héritage et performances
    Par benlaug dans le forum Langage
    Réponses: 3
    Dernier message: 21/03/2011, 14h19
  4. Héritage, destructeurs et performances
    Par Aleph69 dans le forum Langage
    Réponses: 52
    Dernier message: 31/08/2010, 17h36
  5. Héritage entre Forms
    Par BarBal dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 17h44

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