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

Langage SQL Discussion :

Clé étrangère null


Sujet :

Langage SQL

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Points : 393
    Points
    393
    Par défaut Clé étrangère null
    Je me suis laissé dire qu'une clé étrangère ne peut pas etre null; c'est vrai ?

    Pourquoi ?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Points : 639
    Points
    639
    Par défaut
    Bien sûr que c'est vrai !!!
    Car par essence, elle doit référencer une valeur de la clé primaire de la table dont elle dépend.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Points : 393
    Points
    393
    Par défaut
    Mais si j'ai une entité
    A qui "peut contenir" une entité B (agrégation)
    Comme j'ai la proposition (peut contenir) on a 0 ou 1 B. Donc dans le cas de 0 je fais comment ? A référence B, mais B peut exister sans A (aggrégation)

    Je suis un pro modélisation object mais pas base de données donc ca me pose des problèmes de compréhension.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Points : 639
    Points
    639
    Par défaut
    SI j'ai bien compris ton exemple, c'est A qui peut exister sans B, et non l'inverse.

    Tu dis "A peut contenir B", mais je rajoute que "A peut aussi ne pas contenir B" (au sens Merise).
    Par contre, si B existe, il est forcément contenu par A.

    La clé primaire est dans A, la clé étrangère dans B...

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Points : 393
    Points
    393
    Par défaut
    Mais en faite si je comprends bien en modélisation de table on choisi pas la navigation qu'on veut.

    J'ai une voiture (A) qui peut avoir un moteur (B). (Je suis dans une casse par exemple). Donc la classe A contient un attribut moteur. Si je retire le moteur, l'attribut=null;

    A et B peuvent donc exister indépendamment.

    Si je te comprend pour respecter le problème de null comme clé étrangère, il faut que ce soit le moteur qui référence la voiture donc de (B vers A). en faite meme pas il faut d'office une table d'association représentant le lien entre les deux.

    Enfin en somme il ne faut pas penser comme en UML. Pour les référencements entre tables. Si je veux reconstruire une instance voiture et son moteur, avec mon DAO. Je parse la table voiture avec son immatriculation, et ensuite la table moteur avec la clé étrangère pointant sur l'ID du moteur.

    Autre question: est ce que une clé étrangère peut etre redondante ?

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Une clé étrangère peut être nulle et représenter la cardinalité 0-x en modélisation.

    Elle peut aussi être redondante si tu ne définis pas un index unique dessus.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Points : 639
    Points
    639
    Par défaut
    Pour ton exemple, tu peux tout imaginer :
    - soit tu dis qu'une voiture et un moteur peuvent exister indépendamment (cardinalité 0 - n), dans ce cas là pourquoi parler de clé étrangère ?
    - soit tu dis qu'une voiture est obligatoirement équipée d'un moteur, et inversement qu'un moteur appartient à une voiture et une seule, dans ce cas la moteur est un simple attribut de l'entité voiture.
    - soit tu dis qu'une voiture peut ne pas avoir de moteur, mais que par contre un moteur appartient forcément à une voiture et une seule (cardinalité 1 - 1), donc dans ce cas l'entité Moteur contient un champ id_voiture qui est clé étrangère reférençant la clé primaire id_voiture de l'entité Voiture, et donc ce champ est obligatoirement renseigné.

    En clair, le problème n'est pas de savoir si une clé étrangère peut être nulle (ce n'est pas possible au niveau des SGBD), c'est plutôt de se poser la question d'en mettre une ou pas selon justement si on a une relation 0 - n (voire 1 - n) ou 1 - 1.

    Quand vmolines dit "Une clé étrangère peut être nulle et représenter la cardinalité 0-x en modélisation.", il précise bien en modélisation. Quand tu vas passer au modéle physique dans le SGBD, ce ne sera plus possible d'avoir du null si tu as créé la clé étrangère.

    Cela dit, en disant cela, vmolines s'écarte déjà des règles de l'art, car j'irai même plus loin : en remontant aux sources de Merise (que j'ai appris avec des vieux gourous il y a 15 ans), la notion de clé étrangère n'existe pas dans le modèle logique, c'est une conséquence automatique des cardinalités 1 - 1 lorsqu'on passe vers le modèle physique : on appelle ça une intégrité référentielle (c'est d'ailleurs comme ça, en respectant scrupuleusement cette règle, que des outils de modélisation comme AMC Designor peuvent générer automatiquement les clés primaires lors de la création des scripts)

    Voici un autre exemple, qui est un cas d'école : toute facture dans un magasin référence un client. Si tu ne veux pas mettre la clé sous la porte, tu ne peux pas envisager une seule seconde avoir une autre cardinalité que 1 - 1 de facture vers client, donc tu vas créer la clé étrangère.
    Dans ton exemple, le débat est plus ouvert, c'est pour ça que je dis que tu dois adapter ton modèle physique en fonction des règles de gestion arrêtées finalement.

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Citation Envoyé par dgi77 Voir le message
    Quand vmolines dit "Une clé étrangère peut être nulle et représenter la cardinalité 0-x en modélisation.", il précise bien en modélisation. Quand tu vas posser au modéle physique dans le SGBD, ce ne sera plus possible d'avoir du null si tu as créé la clé étrangère.
    C'est tout à fait possible aussi sur le modèle physique. J'ai parlé de modélisation mais je n'ai pas réduit la possibilité à la simple modélisation.

    Une clé étrangère peut très bien être définie avec le champ nullable.

    Exemple tout bête pour une arborescence en auto-référence :

    T_ElementArbre = {idElement, Libelle, #idElementParent}

    Une FK peut être définie entre idElementParent et idElement. idElement doit et peut être défini comme nullable pour un éléments racine.

    L'intégrité référentielle fonctionnera et empèchera d'avoir une ligne avec un idElementParent qui ne référence aucun idElement existant. Par contre on pourra avoir idElementParent à Null sans violer l'intégrité définie par la FK.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Points : 639
    Points
    639
    Par défaut
    Ton exemple n'est pas tout bête : il s'agit d'une auto-référence. C'est un cas très particulier qui s'apparente aux chaînages, et effectivement le premier père n'a pas de père lui-même.

    Par contre, je n'ai jamais testé si ce que tu dis est vrai, mais je suis curieux de savoir sur quel SGBD tu l'as fait ?

  10. #10
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Points : 393
    Points
    393
    Par défaut
    Ok merci pour toutes ces précisions.

  11. #11
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Citation Envoyé par dgi77 Voir le message
    Ton exemple n'est pas tout bête : il s'agit d'une auto-référence. C'est un cas très particulier qui s'apparente aux chaînages, et effectivement le premier père n'a pas de père lui-même.

    Par contre, je n'ai jamais testé si ce que tu dis est vrai, mais je suis curieux de savoir sur quel SGBD tu l'as fait ?
    J'ai pris cet exemple pour ne pas avoir à déclarer 2 tables (moindre effort) mais il est tout aussi applicable à n'importe quelle FK même sans auto référence.

    Je n'ai pas une énumération précise des SGBD sur lesquels j'ai utilisé des FK nullables mais je n'ai pas souvenir d'avoir été gêné pour ça. Le dernier en date est actuellement SQL Server.

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    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 897
    Points : 53 132
    Points
    53 132
    Billets dans le blog
    6
    Par défaut
    Une clef étrangère peut heureusement parfaitement être null. En effet une voiture peut avoir un conducteur, mais heureusement que lorsque l'on la gare on n'est pas obligé de rester au volant !!!!!

    A +

  13. #13
    say
    say est déconnecté
    Membre éprouvé
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 258
    Points
    1 258
    Par défaut
    Citation Envoyé par dgi77 Voir le message
    Par contre, je n'ai jamais testé si ce que tu dis est vrai, mais je suis curieux de savoir sur quel SGBD tu l'as fait ?
    moi je le fais sous postgresql par exemple...

    la contrainte FK permet surtout de vérifier les contraintes d'intégrité référentielle
    ...le nullable est en plus en fonction des cas, mais n'est pas une condition préalable de la contrainte

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

Discussions similaires

  1. clef étrangère à null
    Par supertotal dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 12/07/2010, 07h23
  2. many-to-one et clé étrangère null
    Par nicolas_isi dans le forum Hibernate
    Réponses: 1
    Dernier message: 06/07/2010, 09h30
  3. Clé étrangère à null
    Par grunk dans le forum MySQL
    Réponses: 5
    Dernier message: 22/01/2010, 14h10
  4. Clés étrangères nulles
    Par tofito dans le forum Requêtes
    Réponses: 5
    Dernier message: 03/09/2009, 06h42
  5. Question clé étrangère + Null
    Par vmolines dans le forum Langage SQL
    Réponses: 1
    Dernier message: 28/02/2008, 16h13

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