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 :

Comment faire pour joindre une table dont la clé étrangère peut être celle de n'importe quelle autre table ?


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2007
    Messages : 165
    Points : 119
    Points
    119
    Par défaut Comment faire pour joindre une table dont la clé étrangère peut être celle de n'importe quelle autre table ?
    Bonsoir,
    Je n'ai aucune idée du comment faire pour joindre une table dont la clé étranger peut être celle de n'importe quelle table. Voici un exemple :

    J'ai la table "ABONNEE" :

    ID_ABONNEE
    ID_ACTIVITE

    La table "ACTIVITE" :

    ID_ACTIVITE
    ID_ABONNEE
    ID_????

    l'ID_???? peut être ID_HOTEL ou ID_RESTAURANT ou ID_TAXI, etc.

    L'abonnée peut être un hôtel, un taxi, un restaurant, etc. Et je ne sais pas comment faire cette liaison, devrais-je faire ça :

    ID_ACTIVITE
    ID_ABONNEE
    ID_HOTEL
    ID_RESTAURANT
    ID_TAXI
    ID_...
    ID_N

    Si l'abonnée est un hôtel alors les autres ID seront Null, mais ce n'est pas de la bonne pratique je présume.
    PS : en java se serait, @ManyToOne (N à 1) entre ABONNEE et ACTIVITE et @OneToOne (1 à 1) entre ACTIVITE et Hotel/Restaurant/Agence_Taxi ... etc.
    Si quelqu'un peut m'aider s'il vous plait, merci.
    Cordialement.

    Edit : Puisque personne ne sait pour le moment, je vais proposer une solution.

    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
    20
    21
     
    CREATE TABLE "CHABANE"."ACTIVITE"
      (
        "ID_ACTIVITE"   NUMBER(20,0) NOT NULL ENABLE,
        "ID_ABONNEMENT" NUMBER(20,0) NOT NULL ENABLE,
        "NOM_ACTIVITE"  VARCHAR2(20 BYTE) NOT NULL ENABLE,
        CONSTRAINT "ACTIVITE_PK" PRIMARY KEY ("ID_ACTIVITE") USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" ENABLE,
        CONSTRAINT "ACTIVITE_CAMPAGNIE_AERIEN_FK1" FOREIGN KEY ("ID_ACTIVITE") REFERENCES "CHABANE"."CAMPAGNIE_AERIENNE" ("ID_CA") ON
      DELETE CASCADE ENABLE,
        CONSTRAINT "ACTIVITE_HOTEL_FK1" FOREIGN KEY ("ID_ACTIVITE") REFERENCES "CHABANE"."HOTEL" ("ID_HOTEL") ON
      DELETE CASCADE ENABLE,
        CONSTRAINT "ACTIVITE_LOCATION_VOITURE_FK1" FOREIGN KEY ("ID_ACTIVITE") REFERENCES "CHABANE"."LOCATION_VOITURE" ("ID_LOCATION_VOITURE") ON
      DELETE CASCADE ENABLE,
        CONSTRAINT "ACTIVITE_TAXI_FK1" FOREIGN KEY ("ID_ACTIVITE") REFERENCES "CHABANE"."TAXI" ("ID_TAXI") ON
      DELETE CASCADE ENABLE
      )
      PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE
      (
        INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT
      )
      TABLESPACE "USERS" ;

  2. #2
    Invité
    Invité(e)
    Par défaut
    S'il vous est impossible de savoir d'où provient cette clé étrangère, votre modèle est mal fait.
    Une clé étrangère ne peut que référencer une table.
    Sinon, comment savoir d'où provient l'id numéro 122313 ???
    Corriger ça au plus vite !

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2007
    Messages : 165
    Points : 119
    Points
    119
    Par défaut
    La bonne pratique dit que je dois créer une table intermédiaire entre chaque tables c'est à dire :

    abonnée - activité_hotel - hotel
    abonnée - activité_restaurant - restaurant
    ...
    au lieu de abonnée - activité - (hotel, restaurant,...) la clé primaire de la table activité sera la clé étrangère de toutes les autres tables.

    La première solution n'est pas de la répétition ? Je me suis dit que peut être y a une solution particulière avec Oracle.

    Sinon, comment savoir d'où provient l'id numéro 122313 ???
    Vous avez lu la requête SQL ? NOM_ACTIVITE fera la différence entre les tables référencés, enfin c'est mon point de vue.

  4. #4
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2007
    Messages : 165
    Points : 119
    Points
    119
    Par défaut
    Y a-t-il une solution quelconque ? Ou devrais-je créer une table pour chaque service ?

  5. #5
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 76
    Points : 81
    Points
    81
    Par défaut
    Une solution pourrait etre de t'inspirer de ce que font les ORM en langage objet.
    Ton problème est en fait une modélisation d'un héritage.
    Il existe trois possibilités pour modeliser un héritage.
    - Tous ds une table avec une colonne de type varchar pour le type.
    - Une table par classe. Avec la pb que tu as levé.
    - Une table par classe enfant de l'héritage. Ex:
    B(idB) herite de A(idA)
    C(idC) herite de A(idA)
    Dans ta BD tu auras deux tables B (idB,idA) et C (idC,idA)

    Le choix depend du nb de tables que tu aurais a modéliser, du contenu des tables, de la fréquence de remplissage, du tps que tu aurais à modeliser ou non des contraintes etc...

    Des pistes:
    http://sqlpro.developpez.com/cours/m...tion/heritage/

    Ajout:
    J'ai testé la solution "tous ds une table" ds le cadre de mon projet. Pour les raisons suivantes:
    - Bcp de colonnes communes (genre chat et chien hérite d'animal) donc très peu de colonnes avec des valeurs null.
    - Peu de données( 100 000 environs et ca ne grossira pas)
    - Grande facilité de gestion pour créer des relations avec d'autres tables. tu n'as pas pour gerer un histo de type "une table histo par table" à créer autant de tables histo que tu as de tables heritant d'animal.
    etc...

  6. #6
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2007
    Messages : 165
    Points : 119
    Points
    119
    Par défaut
    Merci, je pense que je vais opter pour un héritage. Je posterais la solution lorsque j'aurais essayé

  7. #7
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    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 822
    Points : 6 446
    Points
    6 446
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Pour moi si les différents concepts de HOTEL, TAXI, RESTAURANT, ... sont des concepts bien séparés, dont le nombre est relativement fixe, et qui ont chacun des attributs (et associations) très différents, alors une table pour chacun, et une foreign key pour chacun (+ contraint d'intégrité pour dire que un seul n'est pas null) me paraît juste.

    Mais je ne pense pas que ce soit le cas pour 3 raisons:
    - d'une part parce que son sont tous des ACTIVITES
    - qu'ils ont au moins quelque chose d'important en commun: ils ont des ABONNES
    - et parce qu'il y en a un grand nombre, puis que du dis '...' , 'N'

    Et dans ce cas, je verrais plutôt une seule table ACTIVITE avec des champs communs (probablement une adresse, un no de téléphone, un prix ...), et des champs spécifiques (pouvant être nulls suivant le type d'activité - et les contraintes d'intégrité qui vont bien)

    La question clé:

    Est que tu vois ton système d'information
    - plutôt comme une gestion d'abonnes, pouvant s'abonner à tout un tas de types d'activités,
    - ou bien comme un ensemble de systèmes de gestion de restaurant, de gestion de taxi, ... qui ont tous un référentiel d'abonnés commun ?

    Cordialement,
    Franck.

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/11/2010, 17h37
  2. Réponses: 2
    Dernier message: 04/03/2008, 11h32
  3. Comment faire pour afficher une image ds une dbgrid
    Par totomaze dans le forum Bases de données
    Réponses: 2
    Dernier message: 16/10/2004, 15h31
  4. Comment faire pour killer une application ?
    Par tintin22 dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 17/08/2004, 18h16
  5. comment faire pour qu'une application soit toujours visible ?
    Par goldbar dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 28/03/2004, 14h35

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