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

  1. #1
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA & Dev PHP
    Inscrit en
    juin 2005
    Messages
    4 980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA & Dev PHP
    Secteur : Service public

    Informations forums :
    Inscription : juin 2005
    Messages : 4 980
    Points : 11 116
    Points
    11 116

    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
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    8 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 8 069
    Points : 26 018
    Points
    26 018

    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 & Dev PHP
    Inscrit en
    juin 2005
    Messages
    4 980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA & Dev PHP
    Secteur : Service public

    Informations forums :
    Inscription : juin 2005
    Messages : 4 980
    Points : 11 116
    Points
    11 116

    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
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    8 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 8 069
    Points : 26 018
    Points
    26 018

    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 & Dev PHP
    Inscrit en
    juin 2005
    Messages
    4 980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA & Dev PHP
    Secteur : Service public

    Informations forums :
    Inscription : juin 2005
    Messages : 4 980
    Points : 11 116
    Points
    11 116

    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 SGBDR & SQL, spécialiste Microsoft SQL Server
    Inscrit en
    mai 2002
    Messages
    18 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 18 869
    Points : 44 149
    Points
    44 149

    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...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  7. #7
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA & Dev PHP
    Inscrit en
    juin 2005
    Messages
    4 980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA & Dev PHP
    Secteur : Service public

    Informations forums :
    Inscription : juin 2005
    Messages : 4 980
    Points : 11 116
    Points
    11 116

    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
    Expert éminent sénior

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    4 467
    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 : 4 467
    Points : 11 088
    Points
    11 088
    Billets dans le blog
    1

    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
    3 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    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 : 3 482
    Points : 5 752
    Points
    5 752
    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..)
    On ne jouit bien que de ce qu’on partage.

  10. #10
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA & Dev PHP
    Inscrit en
    juin 2005
    Messages
    4 980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA & Dev PHP
    Secteur : Service public

    Informations forums :
    Inscription : juin 2005
    Messages : 4 980
    Points : 11 116
    Points
    11 116

    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
    3 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    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 : 3 482
    Points : 5 752
    Points
    5 752
    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/
    On ne jouit bien que de ce qu’on partage.

  12. #12
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA & Dev PHP
    Inscrit en
    juin 2005
    Messages
    4 980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA & Dev PHP
    Secteur : Service public

    Informations forums :
    Inscription : juin 2005
    Messages : 4 980
    Points : 11 116
    Points
    11 116

    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 IO
    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