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 :

Foreign KEY sur une SEQUENCE


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 161
    Points : 75
    Points
    75
    Par défaut Foreign KEY sur une SEQUENCE
    Bonsoir à tous, voila j'ai besoin de votre aide car ceci n'est pas commun et je ne sais même pas si on peut le faire (je pense que oui).

    Structure de la base de donnée

    J'ai deux tables, avec des champs respectif :
    Menu
    -idMenu
    -nom
    Plats
    -idPlats
    -nom

    J'ai une Séquence
    Permettant à l'incrémentation des id De menu et de Plats.

    J'ai un trigger
    Qui permet de faire cette incrémentation avant chaque insertion sur les tables Menu et Plats.

    Donc en gros Les Id de plats et de menu son des id commun, il ne peut y avoir des même numéro dans ces champs la.

    Mais je voudrai rajouter une KEY étrangère à ces deux champs pour plus de sécurité.
    Rajouter une FOREIGN KEY sur une table cela est facile mais la rajouter à une sequence je ne sais pas faire d'ou ma demande d'aide.

    Merci de votre aide.

  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
    Mauvaise modélisation, mauvaise solution technique !

    Qu'est-ce qui, fonctionnellement, peut justifier ceci ?
    Les Id de plats et de menu son des id commun, il ne peut y avoir des même numéro dans ces champs la.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 161
    Points : 75
    Points
    75
    Par défaut
    Des plats son composés d'ingrédients (je vous est pas mis cette table)
    Des menus son composé de plat.

    Une personne peux commander soit des plats soit des menus.
    Les prix seront différents si vous prenez un menu que si vous prenez les plats en séparés.

    Comment structuré la table autrement sinon ?

    Une autre table existe :
    Commande
    -idClient
    -Choix (correspondrai a l'id du menu ou du plat)

    Je compté faire une view pour la facture qui relierai la table commande avec la table menu ou plats, pour avoir le prix final du client.

    Si je veux faire cette foreign key sur la séquence c'est parce que je suis coincé au niveau du choix client dans la table commande.

    Merci de votre réponse au passage.


    Ps : si vous changez la table "commande"
    En rajoutant des champs du genre :

    commande
    -idClient
    -idmenu
    -idPlat

    Cela permet d'avoir les ID en primary key sur les tables Menu et Plats.
    Mais cela implique d'avoir une structure de table qui n'est pas en troisième forme normal (je suis maniaque)
    Car à chaque fois un champs sera rempli en vide.

    ex : si une personne commande un plat la table sera du style

    idClient idMenu idPlats
    1 NULL 3



    Ps²: Pour créer la table commande je me suis basé sur le client, en me basant sur les menu et plats je peux peut être faire d'une autre manière.

    Menu_commandé
    -idMenu
    -idClient

    Plats_commandé
    -idPlats
    -IdClient

    Cela impliquera que je serai obligé d'aller chercher le prix de la commande final du client sur deux tables différentes, n'est ce pas un peu dérangeant?

  4. #4
    Membre averti Avatar de mongilotti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2003
    Messages : 314
    Points : 303
    Points
    303
    Par défaut
    il faut simplifier et utiliser:
    une table type_commande(ID, NOM_TYPE)
    qui peut contenir tous types meme au futur (1,MENU) (2,PLAT) ...

    la table commande (ID, ID_TYPE, QTE ,...)

    inspire toit de ça!

  5. #5
    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,

    Pour moi, la bonne manière de modéliser en relationnel 'Une personne peux commander soit des plats soit des menus.' c'est ce que tu évoques:
    une Commande a :
    - un idMenu , foreign key sur Menu
    - et un IdPlat, foreign key sur Plat
    - une contrainte check ( idMenu is null or IdPlat is null )

    D'autres trouveront comme toi que ce n'est pas beau, pas conforme à la théorie, par en forme normale.

    Pour moi la bonne manière de faire sur les SGBD relationnels tels qu'ils sont implémentés aujourd'hui.

    L'interêt d'être en forme normale, c'est d'éviter des inconsistences de données. Mais dans cet exemple, il n'y a pas d'inconsistences car les foreign key et la contrainte check vérifient exactement toutes les règles métier.

    Alors que dans ta solution, tu ne peux pas vérifier toutes les règles métiers (car tu ne peux pas mettre la foriegn key qu'il te faudrait, vers 2 tables) par des contraintes d'intégrité. Bien sûr, tu peux les vérifier en procédural, par des triggers, mais de manière beaucoup moins performante: il faudrait locker toutes les tables pour faire cette vérification.
    Ou alors il faudrait rester dans la théorie (relationnel, formes normales, pas de null, ...) et cette théorie comprends une contrainte d'intégrité 'ASSERTION' qui permet de tout vérifier. Mais dans la vraie vie, l'assertion n'a pas été implémentée par la pluspart des SGBDR car il n'y a pas de solution efficace.

    Ta deuxième solution (menu_commandé et plat_commandé) a pour moi le problème que la règle 'Une personne peux commander soit des plats soit des menus.' n'est pas implémentée par une contrainte d'intégrité.

    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

Discussions similaires

  1. Emuler une foreign key sur des tables pseudo-héritées
    Par gorgonite dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 11/01/2013, 16h25
  2. Foreign Key sur une partie de Primary Key
    Par Loceka dans le forum Langage SQL
    Réponses: 3
    Dernier message: 03/10/2006, 09h09
  3. Foreign key sur clé primaire composée
    Par mona dans le forum Oracle
    Réponses: 6
    Dernier message: 13/10/2005, 22h36
  4. Foreign Key sur Mysql
    Par lemagicien dans le forum Outils
    Réponses: 1
    Dernier message: 23/09/2005, 13h39
  5. [débutant] Aide pour mettre une FOREIGN KEY sur une table
    Par cauldron dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/11/2004, 17h16

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