Partage
  • Partager sur Facebook
  • Partager sur Twitter

Relation entre tables

Script Python

    14 avril 2021 à 13:03:40

    Bonjour,

    Je vous expose mon problème, je souhaite créer une base de données qui permettrait d'analyser les comptages voiture dans une ville à partir de bornes. Le travail se fait en Python.
    Pour simplifier, j'ai pris des données fictives et supprimé certaines colonnes inutiles pour la lisibilité des données, et juste modifié les noms des id de chaque table pour éviter les ambiguïtés dans mon explication.

    Pour mieux se représenter les choses et comprendre la suite, voici la structure de ma BDD :

    J'ai en gros ces données en entrée, qui proviennent d'un fichier csv, les noms de colonnes, de 0 à 23, correspondent aux heures de la journée et les valeurs aux nombres de voitures détectées :

    J'ai alors créé une table Mesure, un id Mesure correspond à une station à un jour donné, j'ai réalisé un total quotidien par station que j'ai concaténé à un autre fichier (qui ne possédait que les totaux quotidiens et non pas par heure). En bref, le df final, que j'ai exporté en csv puis insérer dans la BDD, ressemble à cela :

    J'aimerais maintenant relier une table 'Découpage_heure' afin d'avoir une granularité horaire pour les mesures qui possèdent cette précision. En bref, j'aimerais que la table 'Découpage_heure' ressemble à cela :

    C'est après réflexion la structure de la BDD qui me semble la plus logique et facile à exploiter.
    Seulement, je rencontre 2 problèmes :
    -Comment récupérer les données horaires initiales (1ère image) et les faire correspondre à l'id_mesure, étant donné que dans la création et l'insertion des données Mesures, j'ai totalement laissé de côté les données horaires pour me concentrer sur les totaux quotidiens ? (Faudrait-il, au lieu de générer un identifiant unique 'id_mesure' dans la table Mesures, créer une double clé primaire associée id_station/date et ajouter ces 2 données comme attributs dans la table Découpage_heure, ainsi il détecterait la station/date correspondante ?)
    -Comment insérer les données horaires dans la table 'Découpage_heure', les 0, 1, 2 ..., 23 passant de nom de colonnes d'un fichier csv à valeur dans une table ?

    J'ai bien conscience que c'est un pavé et peut-être pas clair par moment, je suis tout-à-fait prêt à fournir plus d'explications si besoin.
    En tout cas, un énorme merci à toute personne qui pourra m'aiguiller sur ce sujet.

    Bonne journée !

    • Partager sur Facebook
    • Partager sur Twitter
      14 avril 2021 à 14:00:06

      Bonjour,

      Les copies d'écran ne sont pas toutes passées ...

      Sans les voir et sans répondre à tes questions du coup, si je devais modéliser ce que tu as présenté, je ferai :

      -
      Edité par Benzouye 14 avril 2021 à 14:01:24

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        16 avril 2021 à 10:51:36

        Bonjour,

        Merci beaucoup pour votre réponse.

        Le problème est que vous créez un attribut 'date_heure' dans la table mesure_h alors que la date est un enregistrement de la colonne 'date', et que chaque heure de la journée représente une colonne différente dans le fichier csv.

        De plus, je ne possède la granularité horaire que pour les données à partir de 2020, voilà pourquoi je souhaitais avoir une table 'mesure' avec le total quotidien ainsi qu'une table par heure pour les mesures qui possédaient cette information, ce qui aurait permis de ne pas mélanger différentes infos au sein d'une même table.

        De mon côté, je vois bien toutes les captures, lesquelles vous manque-t-il ? Ce sera peut-être plus simple pour mieux visualiser le problème.

        Encore merci à vous !

        • Partager sur Facebook
        • Partager sur Twitter
          16 avril 2021 à 11:42:39

          simplonien a écrit:

          Le problème est que vous créez un attribut 'date_heure' dans la table mesure_h alors que la date est un enregistrement de la colonne 'date', et que chaque heure de la journée représente une colonne différente dans le fichier csv

          Ce n'est pas un problème, mais un choix de conception plus rigoureux qui permet de respecter la 1ère forme normale ...

          Il faut, au moment de l'import des données en base depuis le CSV, transposer les données des colonnes en lignes distinctes ...

          simplonien a écrit:

          je ne possède la granularité horaire que pour les données à partir de 2020

          Cela signifie simplement qu'il faut mettre une heure par défaut pour les données antérieures à 2020 (minuit par exemple) avec en valeur la totalité de la journée.

          simplonien a écrit:

          De mon côté, je vois bien toutes les captures, lesquelles vous manque-t-il ?

          Je ne vois que la première avec le "pseudo" schéma de base, et la deuxième avec le tableau horaires et ses 24 colonnes (berk :) ).

          -
          Edité par Benzouye 16 avril 2021 à 11:43:14

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            19 avril 2021 à 14:41:02

            Bonjour, merci pour votre réponse.

            Pour voir toutes les captures d'écran, elles sont sur ce lien : https://forum.clubic.com/t/jointure-entre-tables/446448/3

            Concernant le schéma de base, la seule différence est que j'avais ajouté une table Mesure qui donnaient simplement les données principales de chaque mesure (jour, id_station, comptage total de la journée). N'ayant un niveau de précision plus important (que ce soit pour les heures ou le type de véhicule) uniquement pour la dernière année, sur des données de 7 années, ces informations seront vraiment minoritaires, et je souhaitais éviter non seulement de mélanger dans une même colonne des mesures quotidiennes et horaires en laissant une colonne 'heure' vide sur la grande majorité des lignes, mais également, lorsque je ne possède que les données quotidiennes, sans hure ni type, pourquoi mettre ces enregistrements plutôt dans la table mesures_h plutôt que dans mesures_t ?

            Cela permettait également d'avoir les totaux quotidiens directement dans les tables, sans devoir refaire systématiquement le calcul dans mes requêtes SQL dès que j'en aurai besoin.

            Pensez-vous que ce schéma soit si impertinent ?

            Merci et bonne journée

            • Partager sur Facebook
            • Partager sur Twitter
              19 avril 2021 à 15:20:56

              Dans les copies d'écran on ne voir pas la notion de type ...

              Mais ce que j'en comprends c'est que désormais toutes tes mesures comprennent une heure et un type, alors qu'avant tu n'avais que des mesures globales journalières.

              Si c'est bien cela, alors le modèle se simplifie :

              Et oui, je te conseille de laisser id_type et heure à NULL pour les anciennes mesures ...

              Cela te permettra de facilement faire le distinguo entre tes anciennes mesures et les nouvelles, tout en étant capable de faire des taux par date ou période de dates.

              -
              Edité par Benzouye 19 avril 2021 à 15:21:17

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                19 avril 2021 à 15:29:15

                Pour résumer, dans la grande majorité de mes enregistrements (2014 à 2020), je ne possédais que des valeurs quotidiennes, sans plus de détail. Depuis 2020, certains enregistrements (présents dans un fichier csv A) possèdent les données par heure (avec les 24 colonnes ^^) et d'autres enregistrements (présents dans un fichier csv B) possèdent les données par type de véhicule, réparties dans plusieurs colonnes également; mais ces enregistrements sont totalement différents, et prises sur des stations différentes, donc totalement indépendantes l'une de l'autre. Selon moi, on ne peut pas faire de liens entre le type et l'heure.

                Initialement, je comptais également créer une table Type, mais on m'a conseillé préciser directement le type dans la table Mesure_type, en mettant une constante (par exemple, écrire directement 'Véhicule électrique comme valeur plutôt qu'un identifiant sui sera rapporté à une autre table Type).

                Merci !

                -
                Edité par yoann_lv 19 avril 2021 à 15:31:52

                • Partager sur Facebook
                • Partager sur Twitter
                  19 avril 2021 à 16:02:10

                  Ok.

                  Donc si tu es absolument sûr que les mesures avec type sont absolument distinctes des mesures horodatées, tu peux te faire deux programmes d'import distincts pour traiter chacun des deux types de fichier. Les deux programmes auront pour but de transformer les colonnes en lignes, mais le premier traitera des heures et le second des types ...

                  Concernant le fait de stocker du texte pour les types au lieu d'un identifiant unique, c'est à toi de voir en effet, mais pour le coup en stockant tout ce petit monde dans une table unique mesure, cela oblige à répéter X fois la même valeur texte ce qui sera plus gourmand en espace qu'avec un simple id auto incrémenté. D'autant que je suppose que les types ne sont pas trop variables et extensibles ...

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    4 mai 2021 à 11:51:00

                    Encore merci à toi !

                    Au fait, simple question, quel logiciel utilises-tu pour réaliser ta modélisation ? Je la trouve très propre :

                    Benzouye a écrit:

                    Bonjour,

                    Les copies d'écran ne sont pas toutes passées ...

                    Sans les voir et sans répondre à tes questions du coup, si je devais modéliser ce que tu as présenté, je ferai :

                    -
                    Edité par Benzouye 14 avril 2021 à 14:01:24



                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 mai 2021 à 23:48:43

                      Ici c'est MoCoDo. Mais lorsque c'est plus complexe j'utilise Looping.

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

                      Relation entre tables

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown