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

Schéma Discussion :

Modélisation d'une base de données


Sujet :

Schéma

  1. #61
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Merci fsmrel. Pour le coup, ma base semble complète. Il subsiste quand-même un problème. Lorsque j'exécute la CTE que vous m'avez donnée, mysql m'affiche parents et enfants de chaque thème, indépendamment du set recherché.

    Exemple: Je recherche la set '6929-1' qui fait partie du thème 'Space > Classic Space'. J'ai pu faire en sorte que cela fonctionne en modifiant votre CTE de la façon 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
    WITH RECURSIVE CTE (themeId_parent, themeId_enfant, path) AS
    (
        (SELECT themeId_parent, themeId_enfant, CONCAT(z.themeName, ' > ', t.themeName)
         FROM   TH_TH AS x
         JOIN LEGO_SET as y on x.themeId_enfant = y.themeId
         JOIN THEME as z ON x.themeId_parent = z.themeId
         JOIN THEME as t ON x.themeId_enfant = t.themeId
         WHERE  setNum = '6929-1') 
        UNION ALL 
        (SELECT y.themeId_parent, y.themeId_enfant, CONCAT(path, ' > ', themeName)
         FROM   CTE AS x
           JOIN TH_TH AS y ON y.themeId_parent = x.themeId_enfant
           JOIN THEME as z ON z.themeId = y.themeId_enfant)
    )
    SELECT DISTINCT path from CTE ;

    Par contre, si je recherche le set '30-1', qui fait partie du thème 'Service Packs > Space', mysql m'affiche tous les chemins contenant space. Un aperçu :

    Legoland > Space
    Service Packs > Space
    Educational and Dacta > Space
    Legoland > Space > Supplemental
    Legoland > Space > Alien Conquest
    Legoland > Space > Blacktron I
    Legoland > Space > Blacktron II
    Legoland > Space > Classic Space
    Legoland > Space > Exploriens
    Legoland > Space > Futuron
    Legoland > Space > Ice Planet 2002
    Legoland > Space > Insectoids
    Legoland > Space > Life On Mars
    Legoland > Space > M:Tron
    Legoland > Space > Mars Mission
    Legoland > Space > RoboForce
    Legoland > Space > Space Police I
    Legoland > Space > Space Police II
    ... ...

  2. #62
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir Neelix,

    Citation Envoyé par Neelix57 Voir le message
    si je recherche le set '30-1', qui fait partie du thème 'Service Packs > Space', mysql m'affiche tous les chemins contenant space.
    Quel est le thème auquel fait directement référence le set '30-1' : 'Service Packs' ? 'Space' ?

    Et que voulez-vous voir affiché ?
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  3. #63
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Bonsoir,

    Le set '30-1' fait appel au thème 'Space'.

    Le résultat devrait être 'Service Packs > Space'

  4. #64
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Regardez bien la ligne 13 de votre CTE :

    JOIN THEME as z ON z.themeId = y.themeId_enfant

    Elle dit que vous recherchez les descendants de 'Space'.
    Si vous recherchez plutôt ses ascendants, alors il faut alors utiliser la CTE :

    WITH CTE (themeId_parent, themeId_enfant, path) AS
    (
        (SELECT themeId_parent, themeId_enfant
       , CONCAT(z.themeName, ' > ', t.themeName)
         FROM   TH_TH AS x
         JOIN LEGO_SET as y on x.themeId_enfant = y.themeId
         JOIN THEME as z ON x.themeId_parent = z.themeId
         JOIN THEME as t ON x.themeId_enfant = t.themeId
         WHERE  set_Num = '30-1') 
        UNION ALL 
        (SELECT y.themeId_parent, y.themeId_enfant
       , CONCAT(themeName, ' > ', path)
         FROM   CTE AS x
           JOIN TH_TH AS y ON y.themeId_enfant = x.themeId_parent
           JOIN THEME as z ON z.themeId = y.themeId_parent)
    ) ; 
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  5. #65
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Je ne suis pas plus avancé. Avec le set '30-1', j'obtiens un résultat vide. Si j'essaye avec le set '6929-1', j'obtiens ce que je décrivais pour le set '30-1' dans mon précédent post.

    Mon impression est que, la relation n'est pas correcte. Du moment qu'un thème a plusieurs ascendants et/ou descendants, ils sont tous affichés.

    Du coup, ma question est la suivante :

    Si un thème T01 a pour ascendant T02 et T03. Comment sait-on que le set recherché fait partie du thème 'T02 > T01' et non du set 'T03 > T01' ?

  6. #66
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par Neelix57 Voir le message
    Avec le set '30-1', j'obtiens un résultat vide.

    Soit la requête (R1) :

    SELECT x.themeId
         FROM LEGO_SET as x 
         JOIN THEME as y ON x.themeId = y.themeId
         WHERE  set_Num = '30-1'
    
    Si le résultat de (R1) est vide, alors la valeur de themeId dans LEGO_SET est absente de THEME (il y a donc viol de l’intégrité référentielle !)

    Si le résultat de (R1) n’est pas vide, soit la requête (R2) :

    SELECT x.themeId
         FROM LEGO_SET as x 
         JOIN THEME as y ON x.themeId = y.themeId
         JOIN TH_TH as z ON y.themeId = z.themeId_enfant
         WHERE  set_Num = '30-1'
    ;
    Si le résultat de (R2) est vide, c’est que la valeur de themeId dans THEME est absente dans la colonne themeId_enfant de la table TH_TH, c’est-à-dire que le thème utilisé pour le set '30-1' n’est pas enfant d’un autre thème.

    Si le résultat de (R1) n’est pas vide, soit la requête (R3) :

    SELECT x.themeId
         FROM LEGO_SET as x 
         JOIN THEME as y ON x.themeId = y.themeId
         JOIN TH_TH as z ON y.themeId = z.themeId_parent
         WHERE  set_Num = '30-1'
    ;
    
    Si le résultat de (R3) est vide, c’est que la valeur de themeId dans THEME est absente dans la colonne themeId_parent de la table TH_TH, c’est-à-dire que le thème utilisé pour le set '30-1' n’est pas parent d’un autre thème.

    Que donnent (R1), (R2), (R3) ?


    Citation Envoyé par Neelix57 Voir le message
    Si un thème T01 a pour ascendant T02 et T03. Comment sait-on que le set recherché fait partie du thème 'T02 > T01' et non du set 'T03 > T01' ?
    Vous dites que T01 a pour ascendants T02 et T03. Si le set S01 fait référence au thème T01, il fait donc automatiquement référence à T02 et T03 par le biais de T01. Si vous voulez que S01 ne fasse référence qu’à T02, alors il faudra créer un thème T04 (clone de T01), que référencera S01, tandis que, en tant qu’enfant, T04 ne référencera que T02.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  7. #67
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Bonjour,

    La requête R1 me renvoie un resultat vide. J'ai donc remise à jour la table LEGO_SET et vérifié que tous les valeurs de 'themeId ' figurent dans la table THEME par la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT LEGO_SET.themeId FROM LEGO_SET
    WHERE LEGO_SET.themeId NOT IN (SELECT THEME.themeId FROM THEME)
    Le retour de ma requête est vide. Et effectivement, du coup, R1 me renvoie le 'themeId' du set '30-1'

    Les requêtes R2 et R3, quand à elles, renvoient un résultat vide.

    Vous dites que T01 a pour ascendants T02 et T03. Si le set S01 fait référence au thème T01, il fait donc automatiquement référence à T02 et T03 par le biais de T01. Si vous voulez que S01 ne fasse référence qu’à T02, alors il faudra créer un thème T04 (clone de T01), que référencera S01, tandis que, en tant qu’enfant, T04 ne référencera que T02.
    Autrement dit, créer des entrées redondantes dans la table THEME. Par conséquent, la table TH_TH disparaîtrait. Est-ce bien cela ?

  8. #68
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonjour Neelix,


    Citation Envoyé par Neelix57 Voir le message
    La requête R1 me renvoie un resultat vide. J'ai donc remise à jour la table LEGO_SET et vérifié que tous les valeurs de 'themeId ' figurent dans la table THEME par la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT LEGO_SET.themeId FROM LEGO_SET
    WHERE LEGO_SET.themeId NOT IN (SELECT THEME.themeId FROM THEME)
    Le retour de ma requête est vide. Et effectivement, du coup, R1 me renvoie le 'themeId' du set '30-1'
    D’accord, le problème concernant les liens LEGO_SET - THEME est donc manifestement réglé.


    Citation Envoyé par Neelix57 Voir le message
    Les requêtes R2 et R3, quand à elles, renvoient un résultat vide.
    Soit Tx le thème auquel fait référence le set '30-1' selon la requête R1.

    Si le résultat de (R2) est vide, c’est que la valeur de themeId dans THEME est absente dans la colonne themeId_enfant de la table TH_TH, c’est-à-dire que, dans l’état de la base de données, le thème Tx utilisé pour le set '30-1' n’est pas enfant d’un autre thème Ty, il est orphelin. Soit cet état de fait est conforme à ce que vous attendez, soit ça n’est pas conforme, ce qui voudrait dire que la création de TH_TH ne s’est pas déroulée normalement.

    (Q50) Cet état de fait est-il conforme à ce que vous attendez ?


    Citation Envoyé par Neelix57 Voir le message
    Autrement dit, créer des entrées redondantes dans la table THEME. Par conséquent, la table TH_TH disparaîtrait. Est-ce bien cela ?
    Faire disparaître la table TH_TH c’est aller un peu vite en besogne !

    Revenons à la question (Q17) à laquelle vous avez répondu affirmativement (cf. posts #20 et #21). Peut-être que nous ne nous donnons pas le même sens au mot « enfant »...
    Par enfant, j’entends « enfant direct ». Mais peut-être avez-vous raisonné en terme de « descendant » ?

    (Q51) T01 peut-il à la fois être enfant direct de T02 et T03?

    Si vous répondez positivement, c’est que TH_TH représente bien un réseau.

    Si vous répondez négativement, c’est que TH_TH ne représente pas un réseau mais une hiérarchie.


    Questions subsidiaires :

    Combien de lignes contient la table THEME ?

    Combien de lignes contient la table TH_TH ?
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  9. #69
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    (Q50) Cet état de fait est-il conforme à ce que vous attendez ?
    La requête R2 devrait afficher un numéro de thème. Le set '30-1' fait partie du thème 'Universal Building Set > Basic Set'.

    (Q51) T01 peut-il à la fois être enfant direct de T02 et T03?
    Oui

    Combien de lignes contient la table THEME ?
    444 lignes

    Combien de lignes contient la table TH_TH ?
    646 lignes

  10. #70
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par Neelix57 Voir le message
    (Q51) T01 peut-il à la fois être enfant direct de T02 et T03?
    Oui
    Donc on a bien un réseau, c’est-à-dire une association 0,N/0,N, en conséquence de quoi la table TH_TH ne peut pas disparaître, sinon la colonne themeId de la table THEME devrait contenir la liste des themeId parents directs du thème enfant (viol de la première forme normale).


    Citation Envoyé par Neelix57 Voir le message
    La requête R2 devrait afficher un numéro de thème. Le set '30-1' fait partie du thème 'Universal Building Set > Basic Set'.
    Puisque R2 est vide, c’est que la construction de TH_TH s’est mal passée. Il faudrait que vous me transmettiez le contenu de vos tables THEME et TH_TH (format .txt, dans un .zip) pour que je fasse un état des lieux (envoyez par message privé si vous préférez).
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  11. #71
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Voilà, ci-joint, le zip des tables THEME ET TH_TH.
    Fichiers attachés Fichiers attachés

  12. #72
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Merci pour le zip.

    Table THEME :

    La table THEME comporte effectivement 444 lignes, et les valeurs prises par la colonne themeId vont de 1 à 444. Mais la table est-elle complète ? En effet, la table TH_TH fait référence à des thèmes dont les themeId ont des valeurs > 444.

    Table TH_TH :

    L’intégrité référentielle par rapport à THEME n’a pas été respectée !

    Moralité :

    — 24 lignes dans TH_TH pour lesquelles la colonne themeId_enfant a une valeur > 444 (alors que la colonne themeId_parent a une valeur ≤ 444) ;

    — 32 lignes dans TH_TH pour lesquelles la colonne themeId_parent a une valeur > 444 (alors que la colonne themeId_enfant a une valeur ≤ 444) ;

    — 150 lignes dans TH_TH pour lesquelles la colonne themeId_enfant et la colonne themeId_parent ont une valeur > 444 (ou la valeur 0 en ce qui concerne la colonne themeId_parent).

    Pour que vous constatiez cela, vous pouvez utiliser les requêtes suivantes (pour mes tests, j’ai renommé THEME en THEME_BRUT et TH_TH en TH_TH_BRUT) :

    ------------------------------------
    -- Les enfants inconnus 
    -- (les parents sont connus)
    -----------------------------------                        
    select x.themeId_enfant, x.themeId_parent, y.themeName
    from TH_TH_BRUT as x
    join THEME_BRUT as y on x.themeId_parent = y.themeId
    where  not exists (select * 
                       from THEME_BRUT as z 
                       where x.themeId_enfant = z.themeId)
    order by x.themeId_enfant, x.themeId_parent
    ;
    ------------------------------------
    -- Les enfants sont connus 
    -- (les parents sont inconnus)
    -----------------------------------                        
    
    select x.themeId_enfant, y.themeName, x.themeId_parent
     from TH_TH_BRUT as x
    join THEME_BRUT as y on x.themeId_enfant = y.themeId  
    where  not exists (select * 
                       from THEME_BRUT as z 
                       where x.themeId_parent = z.themeId)
    order by x.themeId_enfant, x.themeId_parent
    ;
    ------------------------------------
    -- Les enfants sont inconnus 
    -- les parents sont inconnus
    -----------------------------------                        
    
    select x.themeId_enfant, x.themeId_parent
     from TH_TH_BRUT as x
     where  not exists (select * 
                        from THEME_BRUT as z 
                        where x.themeId_enfant = z.themeId)
    and
       not exists (select * 
                   from THEME_BRUT as z 
                   where x.themeId_parent = z.themeId)
    order by x.themeId_enfant, x.themeId_parent
    ;
    
    Quand le post #63 vous dites que 'Space' est enfant de 'Service Packs', mais selon la table TH_TH,, 'Space' est enfant de 'Town Plan'... Vérifiez avec cette requête :


    SELECT y.themeId as enfant, y.themeName, z.themeId as parent, z.themeName, '' AS 'Space'
    FROM TH_TH_BRUT as x
    JOIN THEME_BRUT as y on x.themeId_enfant = y.themeId 
    JOIN THEME_BRUT as z on x.themeId_parent = z.themeId
    where y.themeName = 'Space' 
    ;
    

    La table TH_TH que vous m'avez transmise est-elle la bonne ?

    A suivre...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  13. #73
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Effectivement, il y avait un soucis avec mes tables. Je les ai recrées et les ai vérifiées à l'aide des requêtes que vous m'avez fournies. Cette fois, elle sont fonctionnelles. Je les joins à ce post à titre indicatif.
    Fichiers attachés Fichiers attachés

  14. #74
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir Neelix,

    J’ai exécuté à nouveau les requêtes de contrôle :

    — Pas d’orphelin ;

    — 'Space' est bien enfant de 'Service Packs'.

    Je réfléchis à une solution pour mieux traiter du problème que vous avez posé :

    Citation Envoyé par Neelix57 Voir le message
    Si un thème T01 a pour ascendant T02 et T03. Comment sait-on que le set recherché fait partie du thème 'T02 > T01' et non du set 'T03 > T01' ?
    En effet, comme on l’a vu, on pourrait s’en sortir par de la redondance déguisée, mais ça n’est pas bien élégant...



    Mes derniers posts ne vous ont pas aidé ? Il ne sont pas liked...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  15. #75
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Mes derniers posts ne vous ont pas aidé ? Il ne sont pas liked...
    Et pourtant si. J'ai tendance à ne pas penser à liker et m'en excuse. Vous le méritez bien.

  16. #76
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Bonjour,

    J'ajoute une petite précision.

    - Un thème peut ne pas avoir d'enfant. Par exemple le set 75823-1 fait partie du thème Angry Birds, qui ne contient pas de sous-thème.

    - Une set peut également appartenir à un thème qui est parent d'un autre, mais à aucun de ses sous-thèmes. Par exemple, le set 42070-1 fait partie du thème Technic, qui est parent de plusieurs autres thèmes, mais il n'appartient à aucun des enfants du thème Technic.

    J’espère avoir été suffisamment clair et m'excuse de n'avoir pas pensé à cet aspect des choses plus tôt.

  17. #77
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir Neelix,

    Citation Envoyé par Neelix57 Voir le message
    le set 42070-1 fait partie du thème Technic, qui est parent de plusieurs autres thèmes, mais il n'appartient à aucun des enfants du thème Technic.
    Mais le set 42070-1 pourrait-il légalement appartenir à au moins un enfant du thème Technic ?
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  18. #78
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Je reviens sur votre interrogation :

    Citation Envoyé par Neelix57 Voir le message
    Si un thème T01 a pour ascendant T02 et T03. Comment sait-on que le set recherché fait partie du thème 'T02 > T01' et non du set 'T03 > T01' ?
    Un scénario de solution pourrait être le suivant :

    Attacher à la table LEGO_SET une table précisant le nom du thème ascendant que l’on souhaite pour le thème référencé par un set donné. Cette table ne concernerait que les sets pour lesquels on aurait besoin d’avoir cette précision. Appelons THEME_ASCENDANT cette table.

    Par exemple, dans la table LEGO_SET, le set s09 fait référence au thème T01, et dans la table THEME_ASCENDANT on lui associe son thème ascendant T02 (ça fait un peu thème astrologique...). Ainsi on a le moyen de faire référence à T02 sans faire référence à T03.

    Travaux pratiques :

    Soit les thèmes suivants :

    INSERT INTO THEME (themeId, themeName)
    VALUES
        (1, 'thème 1'), (2, 'thème 2'), (3, 'thème 3')
      , (11, 'thème 11'), (12, 'thème 12'), (13, 'thème 13')
      , (14, 'thème 14')
      , (20, 'thème 20')
      , (120, 'thème 120')
      , (130, 'thème 130')
      , (1100, 'thème 1100')
      , (1200, 'thème 1200')
      , (1300, 'thème 1300')
    ;
    Au résultat

    SELECT * 
    FROM THEME 
    ORDER BY themeId ;
    =>

    themeId   themeName 
    1         thème 1      
    2         thème 2      
    3         thème 3      
    11        thème 11      
    12        thème 12      
    13        thème 13      
    14        thème 14      
    20        thème 20      
    120       thème 120      
    130       thème 130      
    1100      thème 1100      
    1200      thème 1200      
    1300      thème 1300      
    
    Soit La forêt (réseau) TH_TH :

    INSERT INTO TH_TH (themeId_enfant, themeId_parent)
    VALUES
        (1, 11), (1,12), (2, 12)
      , (2, 20) 
      , (12, 120), (13, 120), (13, 130)  
      , (14, 120)   
      , (2, 13), (3, 13)
      , (120, 1200), (130, 1200)  
      , (120, 1100), (130, 1300)  
    ;
    Au résultat

    SELECT themeId_parent, themeId_enfant
    FROM TH_TH 
    ORDER BY themeId_parent DESC ;
    
    =>

    themeId_parent   themeId_enfant
    1300             130      
    1200             130      
    1200             120      
    1100             120      
    130              13      
    120              14      
    120              13      
    120              12      
    20               2      
    13               3      
    13               2      
    12               2      
    12               1      
    11               1      
    
    Le thème qui va nous intéresser est le 'thème 13' qui a pour ascendants les thèmes 'thème 120' et 'thème 130' (en rouge ci-dessus).

    Passons au niveau des sets.

    Le set 's09' (table LEGO_SET) fait référence au thème 'thème 13' et on voudrait l’associer seulement à son ascendant 'thème 120'.

    On déclare la table THEME_ASCENDANT :

    CREATE TABLE THEME_ASCENDANT
    (
            set_num          VARCHAR(20)  NOT NULL
          , themeId_parent   INT          NOT NULL
        , CONSTRAINT THEME_ASCENDANT_PK PRIMARY KEY (set_num)
        , constraint THEME_ASCENDANT_LEGO_SET_FK 
              FOREIGN KEY (set_num)
              REFERENCES LEGO_SET (set_num)
        , CONSTRAINT THEME_ASCENDANT_THEME_FK 
              FOREIGN KEY (themeId_parent)
              REFERENCES THEME (themeId)
    ) ;
    Insérons une ligne pour le set 's09' :

    INSERT INTO THEME_ASCENDANT
    SELECT
     's09', (SELECT x.themeId 
             FROM   THEME as x
             WHERE themeName = 'thème 120'
             )
     ;
    Au résultat :

    SELECT * FROM  THEME_ASCENDANT ;
    =>

    set_num   themeId_parent  
    s09       120 
    
    Pour utiliser les noms des attributs naturels :

    SELECT DISTINCT x.set_num, setName
         , t.themeName, v.themeName as themeAscendant
    FROM LEGO_SET as x
    JOIN THEME_ASCENDANT as y ON x.set_num = y.set_num
    JOIN TH_TH as z ON x.themeId = z.themeId_parent
    JOIN THEME as t ON z.themeId_parent = t.themeId
    JOIN TH_TH as u ON y.themeId_parent = u.themeId_parent
    JOIN THEME as v ON u.themeId_parent = v.themeId
    WHERE x.set_num = 's09'
    ;
    =>

    set_num   setName   themeName   themeAscendant
    s09       set 9     thème 13    thème 120
    
    Il faudrait bien sûr blinder un peu les contrôles de cohérence, mais il n’y a pas le feu.

    Par ailleurs, plus important, le thème ascendant 'thème 120' a lui-même deux ascendants, 'thème 1100' et 'thème 1200', ce qui complique un peu les choses (la forêt devient jungle...). Ce genre de situation existe-t-il pour vous ?

    Ce scénario vous convient-il ?


    Pour information, mon post Requêtes récursives et son suivant (utiles, car bien likés) pourraient vous apporter des éclairages...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  19. #79
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Tout d'abord, je réponds à votre question du post #13.
    Mais le set 42070-1 pourrait-il légalement appartenir à au moins un enfant du thème Technic ?
    Les exemples que je cite dans mon post précédent sont bien réels, donc, non, ce set ne peut faire partie d'un enfant du thème Technic.

    Par ailleurs, plus important, le thème ascendant 'thème 120' a lui-même deux ascendants, 'thème 1100' et 'thème 1200', ce qui complique un peu les choses (la forêt devient jungle...). Ce genre de situation existe-t-il pour vous ?
    Oui, elle existe.

    Pour vous faire une idée de ce réseau, je joins un fichier texte contenant l'arborescence des thèmes, récupérée à partir des anciennes tables.

    Ce scénario vous convient-il ?
    Bien qu'il soit intéressant, je le trouve un peu compliqué à mon niveau de connaissances. Ce n'est pourtant pas faute d'avoir consultés les posts que vous mentionnez.

    De mon côté, j'ai longuement réfléchit au problème. Je voyais une solution qui consisterait à ajouter une colonne dans la table TH_TH, identifiant les paires parent/enfant à partir de la colonne 'themeId' de la table LEGO_SET.
    Mais en retravaillant mon MCD sous Looping, il semble que ce soit plus compliqué que ça. En effet, Looping me donne le SQL suivant :

    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
    26
    27
    CREATE TABLE THEME(
       themeId INT,
       themeName VARCHAR(40) NOT NULL UNIQUE,
       PRIMARY KEY(themeId)
    );
    
    CREATE TABLE TH_TH(
       themeId_parent INT,
       themeId_enfant INT,
       themeId INT,
       PRIMARY KEY(themeId_parent, themeId_enfant, themeId),
       FOREIGN KEY(themeId_parent) REFERENCES THEME(themeId),
       FOREIGN KEY(themeId_enfant) REFERENCES THEME(themeId)
    );
    
    CREATE TABLE LEGO_SET(
       setId INT,
       setNum VARCHAR(12),
       setName VARCHAR(255) NOT NULL,
       setYear INT NOT NULL,
       setNumParts INT NOT NULL,
       themeId_parent INT NOT NULL,
       themeId_enfant INT NOT NULL,
       themeId INT NOT NULL,
       PRIMARY KEY(setId),
       FOREIGN KEY(themeId_parent, themeId_enfant, themeId) REFERENCES TH_TH(themeId_parent, themeId_parent, themeId)
    );
    Fichiers attachés Fichiers attachés

  20. #80
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir Neelix,

    Pourriez-vous me transmettre la table THEME ancienne version ?

    Merci
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

Discussions similaires

  1. Quels logiciels de modélisation pour une base de données ?
    Par octopus dans le forum Décisions SGBD
    Réponses: 7
    Dernier message: 11/06/2023, 16h20
  2. [AC-2000] Modélisation d'une Base de données de suivi de facturation
    Par Malick dans le forum Modélisation
    Réponses: 74
    Dernier message: 03/01/2015, 12h36
  3. [AC-2007] modélisation d'une base de données
    Par nounours4 dans le forum Modélisation
    Réponses: 6
    Dernier message: 13/10/2014, 15h59
  4. Besoin d'aide pour la modélisation d'une base de donnée
    Par brifa14 dans le forum Modélisation
    Réponses: 7
    Dernier message: 07/01/2014, 18h25
  5. modélisation d'une base de données
    Par kaiser21 dans le forum Méthodes
    Réponses: 1
    Dernier message: 10/03/2012, 18h46

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