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 :

une colonne peut-elle être une référence à une table?


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut une colonne peut-elle être une référence à une table?
    Bon l'intitulé de ma question n'est pas très clair alors je vais essayer de préciser.
    Imaginons qu'on ait différentes tables TB1, TB2, TB3 qui décrivent des produits différents vendus par un magasin.
    Ces tables ont au moins une information commune: la référence unique du produit dans le magasin.
    Maintenant comment chercher un produit en fonction de sa référence?

    question 1: la question est-elle stupide parcequ'elle relève d'une mauvaise conception?

    question 2: si possible: comment faire? une table qui relierait le numero unique à une autre table est-elle possible?

    je veux dire pour simplifier peut-on faire" SELECT * from X" où X est calculé à partir d'une autre requête SELECT?

    pour compliquer un peu plus la question: pas de base de référence! c'est une question purement abstraite.

    merci

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Réponse à la question 1 : oui, c'est une mauvaise modélisation.

    Réponse à la question 2 : oui, on peut quand même s'en sortir avec une requête de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT reference, source
    FROM
    (
    SELECT reference, 'TAB1' as source FROM Table1
    UNION ALL
    SELECT reference, 'TAB2' FROM Table2
    UNION ALL
    SELECT reference, 'TAB3' FROM Table3
    ) sr
    WHERE reference = ...

  3. #3
    Membre émérite Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Par défaut
    Ça ne me semble pas être une "mauvaise conception".
    La description donnée fait penser à de l'héritage (mais sans la table "parent").

    Quelque chose comme ceci (clé primaire soulignée, clé étrangère en italique):
    Produit(prod_id, prod_nom)
    Chaussure(prod_id, pointure)
    Chapeau(prod_id, tourTete)
    Jean(prod_id, longueur, largeur, couleur)

    Ensuite, je ne voit pas quel est le problème

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Justement, c'est table principale manquante, c'est la mauvaise conception.
    Heureusement, c'est ratrapable.

  5. #5
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    .
    Pour simplifier le propos:
    imaginons qu'on ait des tables "fabricant" qui décrivent des produits. Ces tables ont des informations assez diverses et de nouvelles tables peuvent se présenter rapidement dans la vie de l'application.
    On gère par contre la vue "distributeur" quelque chose qui aurait l'aspect
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ref_unique_distributeur;  prix;  stock;  table_fabricant;  clef_fabricant;
    peut-on imaginer une requête propre qui donne toutes les informations "fabricant" connaissant la "ref_unique_distributeur" (par exemple).
    contrainte: la liste des tables fabricant n'est pas en dur dans la requête.

    bravo à ceux qui ont vu l'héritage: il est vrai que l'appli retransforme tout ça sur la base d'une classe abstraite Java "Produit". Bien entendu je peux tout à fait m'éviter une requête SQL tordue en gérant les choses en deux coups dans mon programme: consultation de la table distributeur puis aiguillage vers une autre requête SQL bien simple.
    Je suis quand même curieux de savoir si ce genre de situation de configuration ne se produit jamais dans la "vraie vie" .

    merci à tous.

  6. #6
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Non, ce n'est pas possible sans mettre de nom en dur.
    Je suppose que que la colonne "table_fabricant" contient le nom de la table à lire ?

    Dans ce cas, soit tu fais la jointure systématique sur toutes les tables fabricant en incluant cette colonne comme critère de jointure, soit tu réalises ton exécution en deux fois (comme tu l'envisageais en Java).

  7. #7
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par professeur shadoko Voir le message
    .
    Pour simplifier le propos:
    imaginons qu'on ait des tables "fabricant" qui décrivent des produits.
    Ça reste une mauvaise conception on dirait !
    Une table "fabricant" décrit les fabricants, pas les produits !

    Ces tables ont des informations assez diverses et de nouvelles tables peuvent se présenter rapidement dans la vie de l'application.
    Normalement, le modèle de données est figé et l'application n'a pas à créer de nouvelles tables, sauf cas très particuliers (archivage de données régulières, importation de données brutes à des fins de statistiques par exemple).
    Si ton application génère de nouvelles tables "fabricant", c'est de plus en plus probable qu'il y a une erreur de conception !

    [quote]On gère par contre la vue "distributeur" quelque chose qui aurait l'aspect
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ref_unique_distributeur;  prix;  stock;  table_fabricant;  clef_fabricant;
    C'est une vue "distributeur" qui semble afficher des données relatives à des produits (stock, prix) et qui fait référence à des fabricants (ceux des produits j'imagine ?).
    Il y a au moins un problème de sémantique dans ton machin !

    Normalement tu devrais avoir plutôt un schéma de données de ce type (formalisme MCD de la méthode Merise) :
    Fabricant -0,n----Fabriquer----1,n- Produit -0,n----Distribuer----0,n- Distributeur

    Ce qui donnerait par exemple les tables :
    Fabricant (fab_id, fab_nom, fab_adresse...)
    Distributeur (dis_id, dis_nom, dis_adresse...)
    Produit (prd_id, prd_nom, prd_ref_interne, prd_prix_vente_ht...)
    Fabriquer (fbq_id_produit, fbq_id_fabricant, fbq_prix_achat_ht...)
    Distribuer (dtb_id_produit, dtb_id_distributeur, dtb_prix_achat_ht...)
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/03/2015, 11h46
  2. Une machine téléportée peut-elle être réutilisable ?
    Par mtiburs dans le forum VirtualBox
    Réponses: 1
    Dernier message: 24/09/2013, 19h07
  3. Une variable créée peut-elle être liée ?
    Par Baldenschaft dans le forum Deski
    Réponses: 2
    Dernier message: 29/08/2011, 14h28
  4. Réponses: 13
    Dernier message: 15/01/2007, 02h30
  5. Une Foreign Key peut-elle être null ?
    Par bassim dans le forum Firebird
    Réponses: 9
    Dernier message: 21/11/2006, 20h20

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