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 :

[PostgreSQL] Format d'attribut pour auto-jointure récursive


Sujet :

Langage SQL

  1. #1
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut [PostgreSQL] Format d'attribut pour auto-jointure récursive
    Bonjour,
    Dans ma conceptualisation, j'aurais un attribut reprenant un ensemble de id de la table elle même.
    Quelle est le meilleur type d'attribut afin de stocker (array,json....) ces id et ensuite faire une auto jointure pour retrouver l'ensemble de mes records.

    D'avance merci.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    J'aurais plutôt vu une table complémentaire :
    table LIAISON
    ( ID foreign key references MATABLE(ID)
    , ID_LIE foreign key references MATABLE(ID)
    , primary key (ID, ID_LIE)
    )
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Hum, je me disais que j'aurais plutôt pu partir sur un format json et faire une cte.
    Je ne vois pas ce qui est le plus simple.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Quel que soit le format sous lequel elle est stockée, une liste d'identifiants dans une colonne c'est à terme une source de problèmes
    Lourd pour faire une recherche à l'intérieur, pas de contrôle d'intégrité, besoin d'une procédure pour utiliser dans une requête, etc...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    En fait , avec la requête suivante j'obtient ma donnée , mais je vais l'utiliser pour peupler une table intermédiaire comme vous me le conseillez, cela me semble le plus logique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    with h as (
    	SELECT id_cours,libelle, regexp_split_to_table(cours_ue, ';') as aa
    	FROM cours 
    	where niveau = 'U'
    	-- and id_cours = 12591
    )
    select h.libelle as ue,c.libelle as aa from h
    left join cours c
    on c.id_cours::text = h.aa

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    Hum, je me disais que j'aurais plutôt pu partir sur un format json et faire une cte.
    Je ne vois pas ce qui est le plus simple.
    C'est un viol de la première forme normale…. Un attribut ne doit contenir que des valeurs atomique !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    C'est un viol de la première forme normale…. Un attribut ne doit contenir que des valeurs atomique !

    A +
    Certe, mais les dettes techniques nous obligent à certaine contorsion pour survivre en attendant une nouvelle normalisation.

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 602
    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 602
    Billets dans le blog
    10
    Par défaut
    Les dettes techniques ? J'avoue ne pas comprendre et je suis du même avis que al1_24, une table en liaison 1,n est préférable à tout point de vue

  9. #9
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 197
    Billets dans le blog
    1
    Par défaut
    Je ne vois pas d'où vient cet entêtement à vouloir absolument mettre en place une usine à gaz pour gérer un truc aussi simple...

    Une table de relation, point barre.

    Les avantages sont multiples :
    - Requêtage simplifié
    - Intégrité des données garantie
    - Evolutivité pour stocker des informations sur la relation
    - Mise à jour de masse aisée (genre si un ID doit dispaître, c'est plus facile de faire un "delete matable where id2 = X" plutôt que de décoder toutes les valeurs JSON stockées dans une colonne, vérifier si la valeur est dedans, puis resérialiser les lignes modifiées..)

  10. #10
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Alors, pour la dette techniques.
    Disons, que je dispose d'une DB, absolument pas normalisé, qui date du siècle dernier.
    Exemple de date 1011223 ou 971223 qui respectivement est 2001/12/23 ou 97/12/23
    Et pour ma demande c'est parce que j'ai dans une table une ligne qui comprend un attribut avec ce genre de donnée en texte ';565;9876;6543;89987; qui chaque nombre représente un id de la table elle même.
    Alors oui, nous avons plusieurs dizaine d'applications qui utilisent cette db, alors je peux faire la révolution, mais doucement.
    Si pour vous c'est un truc simple....mon existant ne l'est pas trop...et je passe les détails de valeurs inexistantes et tout le toutim....donc oui, un Json dans lequel je pouvais faire une recherche me semblais une piste....c'est d'ailleurs la raison de ma demande ici, pour avoir vos retours

  11. #11
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 197
    Billets dans le blog
    1
    Par défaut
    A mon sens, le JSON est inadapté ici.

    Le JSON sera intéressant pour stocker des données structurées, homogènes ou non, dont les attributs sont des informations qui sont rarement filtrées, rarement mises à jour, et qui n'ont pas de contraintes d'intégrité (c'est à dire dont les données ne dépendent pas d'autres données stockées dans la base).

    Par exemple, pour un dossier médical, on pourrait stocker les résultats n'analyses médicales des patients sous forme JSON pour pouvoir les ressortir aisément le taux moyen d'albumine dans les urines de tel patient entre telle date et telle date.
    En revanche, il ne faudrait surtout pas faire des requêtes du type "dans quelle région avons-nous le plus souvent un taux trop élevé d'albumine dans les urines".

    Dans votre cas, la liste en question est une liste d'identifiants d'une table.
    Ceci implique que cette liste servira régulièrement lors de requête de jointures, et sera potentiellement souvent mise à jour.
    Les performances seront alors fortement dégradées, et la complexité du code sera lourdement impactée. Sans oublier les risques énormes de non respect des contraintes (présence d'ID inexistants dans la liste).

    Je vous conseille grandement de partir sur une table séparée, quitte à conserver une colonne calculée, ou une vue, permettant de continuer à disposer et utiliser l'ancienne colonne.
    Un peu de lecture ici, qui pourrait vous donner des pistes pour améliorer votre base de données tout en révolutionnant sans trop révolutionner
    https://www.developpez.net/forums/bl...-base-donnees/

  12. #12
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Et c'est bien vers une nouvelle table que j'ai orienté ma réflexion finale.
    J'ai donc créé la table suivante :


    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
    22
    23
    24
    25
     
     
    -- object: brain.ue | type: TABLE --
    -- DROP TABLE IF EXISTS brain.ue CASCADE;
    CREATE TABLE brain.ue(
    	id_ue serial NOT NULL,
    	ue integer,
    	aa integer,
    	CONSTRAINT ue_pk PRIMARY KEY (id_ue)
     
    );
     
    -- object: "cours.id_cours" | type: CONSTRAINT --
    -- ALTER TABLE brain.ue DROP CONSTRAINT IF EXISTS "cours.id_cours" CASCADE;
    ALTER TABLE brain.ue ADD CONSTRAINT "cours.id_cours" FOREIGN KEY (ue)
    REFERENCES brain.cours (id_cours) MATCH FULL
    ON DELETE SET DEFAULT ON UPDATE SET DEFAULT;
    -- ddl-end --
     
    -- object: "cours.id_cours1" | type: CONSTRAINT --
    -- ALTER TABLE brain.ue DROP CONSTRAINT IF EXISTS "cours.id_cours1" CASCADE;
    ALTER TABLE brain.ue ADD CONSTRAINT "cours.id_cours1" FOREIGN KEY (aa)
    REFERENCES brain.cours (id_cours) MATCH FULL
    ON DELETE SET DEFAULT ON UPDATE SET DEFAULT;
    -- ddl-end --
    Remplis avec la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    insert into brain.ue (ue,aa)
    select id_cours,cast(regexp_split_to_table(cours_ue, ';') as int) as aa
    from brain.cours 
    where niveau = 'U'
    and cours_ue != ''
    Merci de votre aide et réflexion.

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

Discussions similaires

  1. Auto-jointure pour recherche
    Par Djakisback dans le forum Langage SQL
    Réponses: 6
    Dernier message: 01/07/2014, 13h52
  2. Auto jointure pour recuperation d'enfant !
    Par maloups dans le forum Hibernate
    Réponses: 2
    Dernier message: 17/07/2007, 16h02
  3. resultat d'une auto jointure
    Par slc dans le forum Requêtes
    Réponses: 6
    Dernier message: 30/09/2004, 13h54
  4. Auto jointure speciale
    Par kv000 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 14/04/2004, 13h02
  5. [Debutant]Formater un string pour une url
    Par maxxou dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 22/03/2004, 16h17

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