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

Requêtes PostgreSQL Discussion :

SQL type dynamique


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2016
    Messages : 8
    Points : 10
    Points
    10
    Par défaut SQL type dynamique
    Bonjour,

    Pour la réalisation d'un travail, je dois pouvoir inscrire dans une base de données, une information de type dynamique pouvant être l'un des types par défaut du langage SQL.
    Est-ce possible dans l'immédiate ou dois-je passer par une combine via une librairie ou une magouille de tables?

    La base de données est PostgreSQL 9.4.10
    et le langage d'écriture est Python 2.7

    Merci de vos réponses et bonne journée

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Xerthes Voir le message
    une information de type dynamique pouvant être l'un des types par défaut du langage SQL.
    C'est le type de la donnée qui change ? par exemple tantôt char, tantôt decimal etc... ?
    Qu'appelez vous le type par défaut ?
    Pouvez vous expliquer le besoin fonctionnel quel est le but de l'application

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2016
    Messages : 8
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    C'est le type de la donnée qui change ? par exemple tantôt char, tantôt decimal etc... ?
    Qu'appelez vous le type par défaut ?
    Pouvez vous expliquer le besoin fonctionnel quel est le but de l'application
    Oui, le type est pour moi les différents data type trouvable dans un serveur SQL exemple avec W3C http://www.w3schools.com/sql/sql_datatypes_general.asp
    Le but est de que l'utilisateur puissent remplir un champ avec des donnée et qu'une application web puissent la transmettre au serveur sans ce soucier du type de donnée

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Il existe une multitude de solutions, chacune ayant ses avantages et ses inconvénients.

    La première, la plus répandue, mais aussi la plus crade : une table "fourre tout", ayant la structure suivante :
    nom_table, id_link, nom_valeur, type_valeur, num, dec, dat, txt

    => Par exemple, si tu lies la ligne d'ID 12 de la table voiture avec la valeur numérique "vitesses", tu auras les valeurs suivantes :
    'voiture', 12, 'vitesses', 'num', 5, null, null, null

    Cette solution est très pratique, car permet de stocker tout et n'importe quoi, lié à n'importe quelle ligne de n'importe quelle table.
    En revanche, pas de clés possibles, pas de contrôles sans mise en place de triggers très lourds, performances catastrophiques, etc.
    Bref, à éviter, sauf pour une toute petite base et pour des informations purement descriptives.

    La seconde, plus complexe, consiste à faire N tables (une pour chaque type + 1) pour chaque table pour lesquelles ajouter valeurs :
    relation_voiture (id, id_voiture, nom_valeur, type_valeur)
    valeur_voiture_num (id_relation_voiture, num)
    valeur_voiture_dec (id_relation_voiture, dec)
    ...

    Cette solution permet de respecter les principales règles de modélisation.
    En revanche, niveau requêtage ça peut vite devenir bordelique.

    Ensuite, deux autres solutions, qui peuvent s'avérer séduisantes si le SGBD supporte en natif ces types :
    - Colonne XML
    - Colonne JSON

    Dans ce cas, tu n'as qu'à sérialiser en XML ou JSON tes objets, et les stocker tels quels dans la base.
    Le moteur du SGBD sait alors parser ces colonnes de type complexe pour les indexer et les requêter.

    Microsoft SQL Server supporte les deux de façon performante. Je n'ai aucune idée de ce que permet PostgreSQL

    Il existe des myriades d'autres solutions, toutes plus ou moins dérivées de celles-ci.
    On ne jouit bien que de ce qu’on partage.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2016
    Messages : 8
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    La seconde, plus complexe, consiste à faire N tables (une pour chaque type + 1) pour chaque table pour lesquelles ajouter valeurs :
    relation_voiture (id, id_voiture, nom_valeur, type_valeur)
    valeur_voiture_num (id_relation_voiture, num)
    valeur_voiture_dec (id_relation_voiture, dec)
    ...
    Cette solution m'a l'air clairement plus intéressante par contre je ne comprend pas comment la table relation_voiture (id, id_voiture, nom_valeur, type_valeur) va faire le choix entre valeur_voiture_num (id_relation_voiture, num) ou valeur_voiture_dec (id_relation_voiture, dec). Comment je la fait pointer sur l'une ou l'autres?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2016
    Messages : 8
    Points : 10
    Points
    10
    Par défaut
    Désolé pour le double poste mais je vois que ma question est peut clair même en la relisant plusieurs fois.

    Il me faudra donc une table par DataType cependant faire depuis ma table principale pour choisir la bonne valeur via le SQL? Comment dans ma table voiture je vais choisir la bonne foreign key et dire à mon SGBD qu'elle fait partie de la table valeur_voiture_num et pas valeur_voiture_bool?

    Bonne journée

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Vous allez être obligés de faire du SQL dynamique ou plusieurs requêtes.

    Par exemple, dans "relation_voiture" vous avez :
    id id_voiture nom_valeur type_valeur
    1 12 vitesses num
    2 12 finition txt
    3 12 co2 dec
    Et dans les tables voiture_num, voiture_txt et voiture_dec
    voiture_nom
    id_relation valeur
    1 5
    
    voiture_txt
    2 Confort
    
    voiture_dec
    3 156.8
    Vous interrogez une première fois la table des relations pour connaître l'identifiant et le type des données à récupérer.
    Puis ensuite vous pouvez générer la requête finale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select v.id, v.modele, r.id, r.valeur_nom, r.valeur_type
    from voiture v
    inner join voiture_relation r on r.voiture_id = v.id
    Puis vous interrogez les différentes tables à partir du résultat précédent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select v.valeur
    from voiture_num v
    where v.id = @r_id
     
    select v.valeur
    from voiture_txt v
    where v.id = @r_id
     
    select v.valeur
    from voiture_dec v
    where v.id = @r_id
    On ne jouit bien que de ce qu’on partage.

  8. #8
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Vous pouvez aussi faire une requête plus générique à grand coup de LEFT OUTER JOIN sur chacune des trois tables, puis de jolis COALESCE, mais ça va être usine à gaz et vous allez mélanger les types dans une même colonne de résultat (cast en varchar obligatoire), donc c'est très moyen.
    On ne jouit bien que de ce qu’on partage.

Discussions similaires

  1. Réponses: 10
    Dernier message: 02/02/2007, 00h02
  2. [pb requête sql] Requête dynamique
    Par viny dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 15/09/2005, 12h31
  3. Réponses: 10
    Dernier message: 27/04/2005, 11h26
  4. Variable globale - PL/SQL - %TYPE
    Par ogre dans le forum PL/SQL
    Réponses: 25
    Dernier message: 20/10/2004, 13h47
  5. PL/SQL TYPE DE DONNEES HEURE
    Par mimi_été dans le forum PL/SQL
    Réponses: 3
    Dernier message: 18/10/2004, 16h33

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