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

SQL Oracle Discussion :

Clés primaires/étrangères obligatoires?


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Points : 71
    Points
    71
    Par défaut Clés primaires/étrangères obligatoires?
    Bonjour,

    j'ai quelques questions au sujet d'une base de données très particulière que je dois traiter... Quelques tables sont assez volumineuses (plusieurs millions de lignes), voilà pourquoi je voulais créer des clés primaires/étrangères afin d'accélerer la recherche lors de futures jointures.

    J'ai donc une table T1 avec plusieurs informations, dont une clé primaire (numéro de téléphone).
    Je possède également une autre table T2 avec un champ numéro de téléphone également, mais ici de temps en temps certaines occurences sont en double (donc pas de clé étrangère possible de T1 vers T2).

    1ère question: les clés primaires et étrangères sont-elles forcément obligatoires dans une base de données?
    2ème question: si quelques tables n'ont pas de relations primaires/étrangères (mais possèdent pourtant des infos communes afin de les jointer), mais que d'autres dans la base sont elles reliées par des clés primaires/étrangères, est-ce grave?

    ps: je suis sous Oracle10g via Sql*Plus, bien que ce ne soit pas important ici

    Merci à tous

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Je possède également une autre table T2 avec un champ numéro de téléphone également, mais ici de temps en temps certaines occurences sont en double (donc pas de clé étrangère possible de T1 vers T2).
    Mais vous pouvez faire une clef étrangère de T2 vers T1, après est-ce que c'est correct, je ne sais pas.

    1ère question: les clés primaires et étrangères sont-elles forcément obligatoires dans une base de données?
    Rien n'est obligatoire au niveau de la base de données, mais en terme de modélisation, si vous n'avez aucune contrainte ça peut être catastrophique.

    2ème question: si quelques tables n'ont pas de relations primaires/étrangères[...]
    Non ce n'est pas nécessairement grave ni faux... mais encore une fois ce n'est pas la partie base de donnée qui le requiert, mais la modélisation !

  3. #3
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par ganguill Voir le message
    ...Quelques tables sont assez volumineuses (plusieurs millions de lignes), voilà pourquoi je voulais créer des clés primaires/étrangères afin d'accélerer la recherche lors de futures jointures.
    Les clés n'accélère rien; ce sont les indexes qui servent à ça. Les clés sont la en principal pour assurer l’intégrité des données.

    Citation Envoyé par ganguill Voir le message
    ...
    Je possède également une autre table T2 avec un champ numéro de téléphone également, mais ici de temps en temps certaines occurences sont en double (donc pas de clé étrangère possible de T1 vers T2).
    Le fait que les valeurs sont en "double" (mais que est-ce que ça signifie vraiment) ne vous empêche pas de définir des clés étrangères.

    Citation Envoyé par ganguill Voir le message
    ...
    1ère question: les clés primaires et étrangères sont-elles forcément obligatoires dans une base de données?
    Non, mais fortement conseillées.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Points : 71
    Points
    71
    Par défaut
    Pour visualiser un peu le tout, partons du principe que je possède une table T1 comme ceci:
    T1
    TEL_T1 | NOM | PRENOM
    0445653433 | MARTIN | MICHEL
    etc..


    Et une table T2 comme ceci:
    T2
    TEL_T2 | VALEUR
    0445653433 | tata
    0445653433 | toto


    En testant donc de définir une clé étrangère de T2 vers T1 (solution proposée par Waldar), j'obtiens cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ALTER TABLE T2 ADD CONSTRAINT fk_TEL FOREIGN KEY(TEL_T2) REFERENCES T1(TEL_T1);
     
    ERREUR à la ligne 2 :
    ORA-02298: cannot validate (xxx.FK_ND) - parent keys not found

    Si je veux simplement créer une clé étrangère de T1 vers T2, j'obtiens cette erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ALTER TABLE T1 ADD CONSTRAINT fk_TEL FOREIGN KEY(TEL_T1) REFERENCES T2(TEL_T2)
                                                                *
    ERREUR à la ligne 2 :
    ORA-02270: no matching unique or primary key for this column-list
    Pour cette deuxième solution, il semblerait qu'Oracle me demande que TEL_T2 soit unique ou clé primaire de T2...

    Donc là, je ne vois pas du tout ce que je peux faire pour relier ces deux tables

    ps: Merci beaucoup de votre aide

  5. #5
    En attente de confirmation mail
    Inscrit en
    Mars 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 205
    Points : 230
    Points
    230
    Par défaut
    Ca veut dire que tu as des numéros de téléphones qui sont dans T2 et pas dans T1. Je ne sais pas si c'est normal, mais si c'est le cas t'es mal parti pour mettre une foreign key sur T2.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par sgora Voir le message
    Ca veut dire que tu as des numéros de téléphones qui sont dans T2 et pas dans T1. Je ne sais pas si c'est normal, mais si c'est le cas t'es mal parti pour mettre une foreign key sur T2.

    Ben le problème c'est que c'est normal... Ces fichiers appartiennent à France Télécom. Maintenant je vais me renseigner afin de savoir si je peux voir quels numéros sont en trop dans T2, et surtout savoir si je peux les supprimer..

    Merci beaucoup pour l'aide en tout cas

  7. #7
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par ganguill Voir le message
    ...Si je veux simplement créer une clé étrangère de T1 vers T2 (donc solution de mnitu...
    J’apprécierais beaucoup si vous ne m’attribuez pas des choses que je n’ai jamais dites ou suggérées.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par mnitu Voir le message
    J’apprécierais beaucoup si vous ne m’attribuez pas des choses que je n’ai jamais dites ou suggérées.
    Ne le prenez pas comme ça, je vais éditer.. au passage voilà quand même votre message : "Le fait que les valeurs sont en "double" (mais que est-ce que ça signifie vraiment) ne vous empêche pas de définir des clés étrangères.
    "
    Voilà pourquoi j'ai tout simplement tenté de créer une clé étrangère malgré ces valeurs en doubles dans T2. Maintenant je ne vois pas ce qu'il y a qui pose problème dans ce que j'ai dit.. Mais bon passons

  9. #9
    En attente de confirmation mail
    Inscrit en
    Mars 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 205
    Points : 230
    Points
    230
    Par défaut
    Tu ne peux pas avoir de clé étrangère dans le sens T1 -> T2, dans ce cas tu devrais avoir une condition d'unicité sur les n° de tél dans T2, ce qui n'est pas le cas.

    Et mnitu ne t'a aucunement conseillé cette solution, qui n'est pas possible, tu lui attribues donc une solution qui ne peut fonctionner. Tu comprends pourquoi il n'apprécie guère ?

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par sgora Voir le message
    Tu ne peux pas avoir de clé étrangère dans le sens T1 -> T2, dans ce cas tu devrais avoir une condition d'unicité sur les n° de tél dans T2, ce qui n'est pas le cas.

    Et mnitu ne t'a aucunement conseillé cette solution, qui n'est pas possible, tu lui attribues donc une solution qui ne peut fonctionner. Tu comprends pourquoi il n'apprécie guère ?

    Je suis actuellement en train d'exécuter une requête qui me donnera le nombre de numéros étant dans T2 mais pas dans T1. Ensuite je verrais si je peux les supprimer, et je ferais alors une clé étrangère de T2 vers T1 (sinon ben tant pis ).
    Pour minitu, pas de soucis je comprends ce qu'il a voulu dire. Mais je ne voulais pas attribuer quoi que ce soit à qui que ce soit (ce sont MES tests, et que ça marche ou non j'en assûme les conséquences)! Maintenant je n'ai pas pris ça comme un conseil, mais plutôt comme une phrase disant que théoriquement ça devait marcher (voilà pourquoi j'ai essayé, et je le répète c'est bien moi qui l'a décidé).

    J'espère que tout est clair maintenant Merci pour ton aide sgora!

  11. #11
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Les clés n'accélère rien; ce sont les indexes qui servent à ça. Les clés sont la en principal pour assurer l’intégrité des données.
    Ce n'est pas tout à fait juste. Les contraintes d'intégrité donne une indication sur les données, qu'Oracle utilise lors de l'optimisation des requêtes.

    L'optimiseur estime le nombre de ligne retournées par les prédicats de la clause where, afin de choisir le meilleur accès. Cette estimation est d'autant plus juste que les contraintes sont renseignées: PK veut dire aussi not null, c'est une indication que toutes les lignes sont référencées dans l'index. PK et unique permettent de savoir lorsqu'un prédicat ramène une seule ligne au maximum. FK aussi, et peut même éviter d'aller voir une table si on a pas besoin des colonnes non-clé...

    En bref, elles ne sont pas obligatoires mais très utiles (tout comme créer des index, ce n'est pas obligatoire, ou définir les bons types de données avec leur bonne taille, ... )

    Cordialement,
    Franck.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par pachot Voir le message
    Bonjour,



    Ce n'est pas tout à fait juste. Les contraintes d'intégrité donne une indication sur les données, qu'Oracle utilise lors de l'optimisation des requêtes.

    L'optimiseur estime le nombre de ligne retournées par les prédicats de la clause where, afin de choisir le meilleur accès. Cette estimation est d'autant plus juste que les contraintes sont renseignées: PK veut dire aussi not null, c'est une indication que toutes les lignes sont référencées dans l'index. PK et unique permettent de savoir lorsqu'un prédicat ramène une seule ligne au maximum. FK aussi, et peut même éviter d'aller voir une table si on a pas besoin des colonnes non-clé...

    En bref, elles ne sont pas obligatoires mais très utiles (tout comme créer des index, ce n'est pas obligatoire, ou définir les bons types de données avec leur bonne taille, ... )

    Cordialement,
    Franck.


    Merci beaucoup pour les renseignements
    J'aurais dailleurs une petite question au sujet de mes valeurs qui seraient dans T2 mais pas dans T1.. Pour les trouver j'ai testé cette requête que j'ai fait, mais qui doit être fausse vu qu'elle fait planter Oracle... (je l'ai laissé tourné toute la nuit, mais il ne répond plus ce matin..) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT TEL_T2 FROM T2 WHERE T2 NOT IN(SELECT TEL_T1 FROM T1);
    J'ai également testé ça afin de connaître le nombre (étant donné que ça avait l'air très long de tous les afficher. Mais au final ça na rien changé..) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT count(TEL_T2) FROM T2 WHERE T2 NOT IN(SELECT TEL_T1 FROM T1);

    Ces requêtes seraient-elles fausses? (d'un point de vue "grammatical" ça paraît logique.. maintenant je ne sais pas

    Merci à tous encore une fois

  13. #13
    En attente de confirmation mail
    Inscrit en
    Mars 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 205
    Points : 230
    Points
    230
    Par défaut
    Tu te compliques la vie, fais plutôt un truc dans ce goût là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select tel from t2 
    minus
    select tel from t1
    Tu auras tous les tél de T2 qui sont absents de T1

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par sgora Voir le message
    Tu te compliques la vie, fais plutôt un truc dans ce goût là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select tel from t2 
    minus
    select tel from t1
    Tu auras tous les tél de T2 qui sont absents de T1


    Oh merci sgora, je ne connaissais pas "minus" Je testerai ça tout à l'heure!

    Le problème avec mon ancienne requête c'est qu'Oracle devait à chaque fois comparer le numéro courant de T2 avec toute la table T1, puis le numéro suivant de T2 avec toute la table T1 etc... donc à chaque fois Oracle devait se faire plusieurs millions de lignes plusieurs millions de fois (du moins c'est ce que je pense)

Discussions similaires

  1. Clé étrangère sur deux clés primaires?
    Par flozz dans le forum Requêtes
    Réponses: 4
    Dernier message: 10/06/2011, 15h41
  2. Définition des clés primaires et étrangères
    Par Yukiho dans le forum Débuter
    Réponses: 6
    Dernier message: 01/03/2010, 16h18
  3. Des tables sans clés étrangères ni clés primaires
    Par tomyy dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 04/09/2009, 02h50
  4. Réponses: 4
    Dernier message: 03/02/2009, 11h50
  5. Problème avec clés primaires et étrangères
    Par mat777 dans le forum JDBC
    Réponses: 0
    Dernier message: 23/01/2009, 15h32

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