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

 Oracle Discussion :

Foreign Key avec constante [10g]


Sujet :

Oracle

  1. #1
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2011
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2011
    Messages : 101
    Points : 134
    Points
    134
    Par défaut Foreign Key avec constante
    Bonjour,

    Je voudrais ajouter une clé étrangère sur une table, pour l'exemple : table_client.

    Cette table contient plusieurs champs :
    - client_id
    - client_name
    - adresse_id

    Afin de la lier à une table, ici table_adresse :
    - adresse_id
    - status
    - rue
    ...

    Le problème est que le champ adresse_id n'est pas unique, il est présent plusieurs fois. La clé primaire étant sur le duo : adresse_id, status.

    Je voudrais donc créer cette clé étrangère sur la table_client avec comme lien : adresse_id et une constante pour le status = 0. Ceci sans vouloir ajouter un champ toujours égal à 0 dans ma table_client.

    NB : J'ai simplifié l'exemple en prennant un cas d'école client/adresse, mais dans mon cas ça touche d'autres tables qui sont utilisées par plusieurs process. Repenser la solution totale pour la table_adresse n'est donc pas possible.

  2. #2
    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
    Votre modèle de données semble en souffrance. Vous pouvez implémenter cette contrainte à l’aide des triggers mais cette solution devient souvent une source de nombreuses erreurs en plus des autres désavantages.

  3. #3
    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,
    En 11g on a la possibilité de colonne virtuelle (non stockée).
    Et elle peuvent être utilisées comme foreign key:
    Dans votre cas:
    create table table_client (client_id number,adresse_id number,adresse_status as (0),foreign key(adresse_id,adresse_status)references table_adresse )
    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

  4. #4
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Votre question est plutôt bien postée, certes

    Mais fournissez au mieux les DDL de vos tables afin de bien comprendre votre situation, vos besoins et votre demande.

    Citation Envoyé par Proxy
    NB : J'ai simplifié l'exemple en prennant un cas d'école client/adresse, mais dans mon cas ça touche d'autres tables qui sont utilisées par plusieurs process. Repenser la solution totale pour la table_adresse n'est donc pas possible.
    Ce que l'on conçoit bien s'énonce clairement !
    De plus un "id" non atomique surtout une adresse c'est
    Il y a moyen de faire mieux !

    Et dire que repenser une solution, comme dans votre cas, n'est pas possible, c'est juste idiot (Je ne dis pas cela pour vous personnellement mais dans la majorité des cas, rien n'est prévu au départ pour faire de bonnes choses ).
    Je le sais bien je travaille avec des Bases irréelles tous les jours

    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  5. #5
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2011
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2011
    Messages : 101
    Points : 134
    Points
    134
    Par défaut
    Bonjour,

    Merci pour vos réponses!

    Je travaille dans une société dont la base de données est 'historique' et utilisée par de nombreuses équipe... Modifier la structure entrainera de la régression dans trop de points.

    Il s'agit d'une table de services et non d'adresse, chaque service a son identifiant mais peut évoluer. On a un status pour donner la version active.

    Cela ne change rien au problème posé.

    Et oui, les bases réelles sont posées et souvent pas très bien pensées.

    Actuellement, on ne fait jamais de clé étrangère sur cette table, on espère juste que les jointures soient bien faites... Ici je dois réaliser une nouvelle table et je voudrais justement pouvoir éviter cette manière de faire pour avoir un minimum de cohérence... Si c'est possible.

    pachot :

    Merci, mais je ne suis pas sous 11g, existe-t'il une solution similaire en 8-10g?

    Si pas, je crois que la solution de mnitu sera la meilleur.

  6. #6
    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
    Alors en <11g, pas de colonnes virtuelles. Il faut stocker la valeur même si elle est constante. Stocker un zéro, ça prend seulement 1 octet...

    Ne pas oublier d'avoir un index qui a les colonnes de la foreign key au début (constante inclue) pour éviter de bloquer la table fille pendant qu'on change le status d'une adresse. D'ailleurs, même en 11g avec colonnes virtuelles l'index doit stocker la valeur.

    Personnellement, je ne voit pas de défaut à cette modélisation.
    Isoler les adresses qui ont un status=0 dans une autre table n'est pas une bonne solution si on interroge souvent l'ensemble des adresse quel que soit le status.

    Implémenter de l'intégrité référentielle par des triggers n'est pas une bonne idée non plus, car à cause de l'isolation des transactions, il faudra souvent verrouiller toute la table.
    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

  7. #7
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2011
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2011
    Messages : 101
    Points : 134
    Points
    134
    Par défaut
    Ok, merci Pachot,

    Je vais créer cette colonne supplémentaire sur la nouvelle table. Je voulais éviter d'encombrer celle-ci mais cette solution semble la meilleur.

    Merci.

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

Discussions similaires

  1. Asscociation d'une foreign key avec une autre table
    Par ROUGE87 dans le forum Général Java
    Réponses: 7
    Dernier message: 13/04/2011, 10h36
  2. Problème foreign key avec hibernate
    Par souhait dans le forum Hibernate
    Réponses: 5
    Dernier message: 05/09/2008, 15h23
  3. Foreign Key avec "filtre données"
    Par plalm dans le forum Oracle
    Réponses: 0
    Dernier message: 01/05/2008, 09h11
  4. probleme foreign key avec clé composée
    Par jccanut dans le forum Requêtes
    Réponses: 3
    Dernier message: 18/10/2007, 13h05
  5. Foreign Key avec MySQL / phpMyAdmin ?
    Par Tchupacabra dans le forum Outils
    Réponses: 4
    Dernier message: 13/12/2006, 15h59

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