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

  1. #1
    Nouveau Candidat au Club
    Bonne stratégie pour améliorer les performances d'une requête
    Dans le schéma ci dessus on me demande quelle serait une bonne stratégie pour améliorer
    les performances des requêtes se basant sur la colonne"name" de la table PRODUCT_CATEGORY?
    on me propose des solutions et je dois en choisir une(la bonne) parmi ces 5 solutions:

    Solution 1:créer un index sur la colonne"name"
    Solution2:etendre la clé primaire pour inclure la colonne"name"
    en plus de la colonne"product_category_id"

    Solution3:créer une clé étrangère sur la colonne "name"
    Solution4:Changer la clé primaire de "product_category_id" vers "name"
    Solution5:Déclarer que la colonne"name" ne peut pas contenir de doublons

    Moi, j'ai choisi la solution 3 qui est de créer une clé étrangère sur la colonne"name",
    ai je raison ou tort?

    Voici le schéma:


  2. #2
    Membre éclairé
    Bonjour,

    Tu ne peux pas créer un clé étrangère sur name puisqu'elle n'est pas la clé primaire. Pour éventuellement améliorer les perfs d'un requête qui fait une recherche sur name, il faut créer un index sur name.

  3. #3
    Nouveau Candidat au Club
    re
    Je ne comprends pas ce que vous dites,pourquoi il faut qu'elle soit une clé primaire d'abord
    avant que je puisse la créer en clé étrangère?

    Pour créer une clé étrangère, il faut juste créer une contrainte avec "constraint"
    et ensuite le mot clé"foreign key" et la table et la table referencée.

  4. #4
    Expert éminent sénior
    Et dans ton cas quelle est la table référencée ?
    Que dit ton cours concernant les clés étrangères ?

    Tatayo.

  5. #5
    Nouveau Candidat au Club
    RE
    Dans mon cas il n'y a pas de table référencée oui,en fait
    la colonne (name )de ma table PRODUCT_CATEGORY doit
    faire référence à la colonne(name) d'une autre table,c'est ça
    la définition de la clé étrangère,mais rien ne me dit que la colonne
    (name) doit être absolument la clé primaire de cette table référencée,
    est ce que c'est une condition nécessaire?
    c'est ça que je veux comprendre

  6. #6
    Modérateur

    Une clef étrangère doit référencer une colonne portant une contrainte d'unicité, ce qui inclut de facto les clefs primaires.

  7. #7
    Nouveau Candidat au Club
    Re
    D'accord merci

  8. #8
    Expert éminent
    Bonjour,

    Solution 1:créer un index sur la colonne"name"
    c'est probablement la solution demandée (même si la question n'est pas très claire)


    Solution5: déclarer que la colonne "name" ne peut pas contenir de doublons
    Ca va créer un index aussi, et ça a probablement du sens (nom unique) mais ça ne répond pas directement à la question

    Solution3:créer une clé étrangère sur la colonne "name"
    Même si sur certains SGBD une clé étrangère crée un index par défaut, ce n'est pas le cas d'Oracle. Et de toute façon ça ne répondrais pas à la question.
    Franck Pachot - dbi services - Consulting et Formation en Suisse et remote - fpa@dbi-services.com
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  9. #9
    Rédacteur

    Citation Envoyé par master MI Voir le message
    Je ne comprends pas ce que vous dites,pourquoi il faut qu'elle soit une clé primaire d'abord
    avant que je puisse la créer en clé étrangère?

    Pour créer une clé étrangère, il faut juste créer une contrainte avec "constraint"
    et ensuite le mot clé"foreign key" et la table et la table referencée.
    Lorsque vous créez une contrainte de clef étrangères, le mot clé REFERENCES indique que la valeur de la clé étrangères doit correspondre à une et une seule valeur de référence. C'est pourquoi créer une clé étrangères n'est possible que sur une ou plusieurs colonnes dotée d'une contrainte d'unicité. En fait le langage SQL est mal fait de ce point de vue, car on devrait pouvoir créer une contrainte FK en référence à une contrainte PK ou UNIQUE.... et ce n'est pas le cas, car il faut passer par les colonnes !!!! (absurde entre nous...)
    La raison pour laquelle la référence est unique est assez simple.... Imaginez que vous allez à l'hôtel et que l'on vous donne la clef de la chambre 7.... Vous arrivez dans un couloir et là surprise :


    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  10. #10
    Expert éminent sénior
    D'une manière générale une table qui contient une clef primaire de substitution doit impérativement avoir une clé unique fonctionnelle également!

    Regardez la table product_category. Sans la clé fonctionnelle, contraint unique sur la zone name, il est possible d'insérer des "doublons fonctionnels"
    Id Name
    1 Vegetables
    2 Sweets
    3 Vegetables
    4 Vegetables

    Une clé unique sur la zone nom vous assure l'unicité des valeurs et l'impossibilité de la situation décrite ci-dessus.

    Il y a une confusion dans la question entre les indexes qui font partie des structures des données permettant d'améliorer les performances des certaines requêtes et les contraintes qui sont responsables de l'intégrité des données! Le fait que Oracle et autres SGBD crée automatiquement des indexes pour "supporter" certaines types de contraintes ajout beaucoup à cette confusion.

    D'une manière générale parler "performances" sans parler "requêtes SQL" et "volumétrie estimée" est une pure perte de temps.

###raw>template_hook.ano_emploi###