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 dont la référence peut changer


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 67
    Points : 52
    Points
    52
    Par défaut Clé étrangère dont la référence peut changer
    Bonjour,

    J'ai une question sur les clés étrangères, est-il possible de créer une clé étrangère qui référence la clé primaire d'une table parmi une liste ?

    Explication par l'exemple :
    J'ai les tables suivantes : "roman", "jeux" et "mangas".
    Sur mon site, je présentes des romans, jeux et mangas que j'aime bien et laisse la possibilité aux utilisateurs de laisser des commentaires sur ce qu'ils veulent. Pour cela, j'ai une table "commentaire" qui a un champ qui stock l'identifiant de l'article (on va l'appeler comme ça ^^). Cet article peut être un roman, un jeu, ou un manga.
    J'aimerais savoir si c'est possible de dire "Ce champ est une clé étrangère qui référence l'id d'une de ces trois table".
    Je sais que je peux ne mettre aucune contrainte sur le champ et faire attention de pas y mettre n'importe quoi mais, pour faire propre, vaut mieux utiliser les clés étrangères.

    Si on peut pas, je ferais plusieurs tables : "commentaire_roman", "commentaire_jeu" et "commentaire_manga".

    Je vous remercie par avance pour vos réponses.

    PS: si ça existe pas, ça pourrait être une bonne extension non?

  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
    Votre modélisation est mal faite.
    Vous devriez avoir une table article unique, avec une colonne type qui pointe sur une table de référence qui contient roman, jeux et mangas.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 67
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Vous devriez avoir une table article unique, avec une colonne type qui pointe sur une table de référence qui contient roman, jeux et mangas.
    Bonjour Waldar, je vous remercie grandement pour votre réponse.
    Cependant, elle ne convient pas à mon cas car les articles ne contiennent pas les mêmes informations. Ils ont plusieurs colonnes similaires mais ne sont pas tout à fait identique (il faudrait un héritage pour parler en objet mais je ne pense pas que cela existe en SQL).
    Par exemple, imaginons que je veuille aussi présenter des films.
    Un film possède un réalisateur, un producteur et des acteurs en plus des éléments que l'on trouve dans un roman (histoire, personnages etc...)

    La modélisation que vous proposez ne fonctionne que si les tables ont la même structure (si j'ai bien compris votre solution), or, mes tables n'ont pas la même structures

    En tous cas, je vous remercie une nouvelle fois pour votre réponse rapide.

  4. #4
    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
    Vous consolidez tous les attributs communs dans la table Article (qui peut être simplement (art_id, art_typ, art_nom)), et laissez le spécifique dans les autres tables, avec des clefs étrangères sur l'art_id.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 67
    Points : 52
    Points
    52
    Par défaut
    Bonjour,

    encore une fois, je vous remercie, c'est une solution possible, je vais faire comme vous dites

    Je me demandes tout de même s'il est possible ou non de faire des clés étrangères comme celle que je voulais faire.

    Au vu des solutions que vous m'avez donné, j'en conclue que ce genre de clé étrangère n'existe pas.

    Si quelqu'un pouvait me le confirmer (simple curiosité), j'en serais ravi.

    Merci encore pour le temps que vous m'avez accordé Waldar.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 26
    Points : 33
    Points
    33
    Par défaut
    Bonjour,

    J'ai testé avec ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    CREATE TABLE "ROMAN" (
    	ROMAN_ID 	NUMBER(22) 		NOT NULL
    );
     
    CREATE TABLE "MANGA" (
    	MANGA_ID 	NUMBER(22) 		NOT NULL
    );
     
    CREATE TABLE "COMMENTAIRE" (
    	COMMENTAIRE_ID 	NUMBER(22) 		NOT NULL,
    	FK_LIVRE_ID 	NUMBER(22) 		NOT NULL
    );
     
    ALTER TABLE "ROMAN" ADD CONSTRAINT ROMAN_ID PRIMARY KEY (ROMAN_ID);
    ALTER TABLE "MANGA" ADD CONSTRAINT MANGA_ID PRIMARY KEY (MANGA_ID);
    ALTER TABLE "COMMENTAIRE" ADD CONSTRAINT COMMENTAIRE_ID PRIMARY KEY (COMMENTAIRE_ID);
     
    ALTER TABLE "COMMENTAIRE" ADD CONSTRAINT FK_ROMAN FOREIGN KEY (FK_LIVRE_ID) REFERENCES ROMAN(ROMAN_ID);
    ALTER TABLE "COMMENTAIRE" ADD CONSTRAINT FK_MANGA FOREIGN KEY (FK_LIVRE_ID) REFERENCES MANGA(MANGA_ID);
    A priori, rien interdit de faire ce que vous souhaitez. Bon je rejoins Waldar sur le fait que c'est pas beau

    Apres pour les clefs primaires je pense qu'il faut normaliser les clefs des tables Roman, Manga ... avec des varchar du genre RO_identifiant pour la table roman.

  7. #7
    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
    Oui mais il manque la partie avec les données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    insert into "ROMAN" (ROMAN_ID) values (1);
    -- 1 row inserted.
     
    insert into "MANGA" (MANGA_ID) values (2);
    -- 1 row inserted.
     
    insert into "COMMENTAIRE" (COMMENTAIRE_ID, FK_LIVRE_ID) values (1, 1);
    -- ORA-02291: violation de contrainte d'intégrité (FK_MANGA) - clé parent introuvable
     
    insert into "COMMENTAIRE" (COMMENTAIRE_ID, FK_LIVRE_ID) values (1, 2);
    -- ORA-02291: violation de contrainte d'intégrité (FK_ROMAN) - clé parent introuvable

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 67
    Points : 52
    Points
    52
    Par défaut
    Bonjour,

    Merci à vous deux pour vos réponses.

    Donc, si j'ai bien compris, c'est impossible.

    Très bien (de toutes façons, puisque "c'est pas beau", je ferais autrement ^^).

    Merci encore pour vos réponses.

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

Discussions similaires

  1. Boucle dont la variable peut changer sur une seule ligne ?
    Par geeka dans le forum Général JavaScript
    Réponses: 22
    Dernier message: 15/04/2015, 10h06
  2. Activer un fichier csv dont le suffixe du nom peut changer
    Par arnold95 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/07/2013, 11h19
  3. Réponses: 9
    Dernier message: 24/02/2012, 14h39
  4. Réponses: 1
    Dernier message: 22/04/2008, 07h35
  5. [.NET 2] [C#] Un web service dont l'adresse peut changer
    Par stailer dans le forum Windows Forms
    Réponses: 1
    Dernier message: 26/03/2006, 22h10

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