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

Administration MySQL Discussion :

Transfert de données après rétro-conception d'une base de données


Sujet :

Administration MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2009
    Messages : 141
    Par défaut Transfert de données après rétro-conception d'une base de données
    Bonjour,

    Dans le cadre de mon projet actuel, il m'est demandé de recoder une application qui utilise une base de données MySQL.
    La base de données en question comporte 120 tables et ce nombre va augmenter légèrement dans la nouvelle version de l'application, toutefois la majeure partie des tables seront identiques.
    J'ai déjà effectué le modèle Entité-Relation de l'ancienne base sous MySQL Workbench et je suis en train de créer celui de la nouvelle (qui va sans doute évoluer régulièrement au cours du développement).

    Les données de l'ancienne application doivent être transférées de l'ancienne application vers la nouvelle, je me suis donc dis que j'allais écrire un script de transfert de données. Après réflexion je me suis dis qu'en procédant de cette manière à chaque modification de la nouvelle base j'aurai deux choses à maintenir (script de transfert + schéma entité-relation).

    Donc je viens vers vous pour solliciter votre expertise :
    - existe-t-il des outils permettant d'automatiser ce type de transfert?
    - sinon, si quelqu'un ayant déjà effectué ce genre de travail pouvait me conseiller sur les bonnes pratiques pour ne pas perdre son temps, je lui en serait très reconnaissant.

    Merci d'avance.

    Glen.

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    J'ai eu à faire ce travail pour une application de l'INRA.
    L'ancien schéma de données n'était pas normalisé et j'ai donc remodélisé complètement les données.

    J'ai d'abord fait le nouveau schéma puis j'ai importé les données de l'ancien schéma dans le nouveau à coup de requêtes SQL, mais aussi un peu de PHP car certains transferts étaient impossibles ou trop complexes à faire en SQL.

    Après réflexion je me suis dis qu'en procédant de cette manière à chaque modification de la nouvelle base j'aurai deux choses à maintenir (script de transfert + schéma entité-relation).
    Oui effectivement mais je pense que tu n'as pas le choix, sinon celui de construire un modèle complet et normalisé en béton avant toute procédure de transfert.

    - existe-t-il des outils permettant d'automatiser ce type de transfert?
    Je n'en connais pas et ma petite expérience me dit qu'il serait utopique de vouloir en faire un universel tellement les cas sont variés.

    Lors du transfert des données, je me suis aperçu que l'ancien modèle a permis la conservation de données mortes, inexploitables, incohérentes que bien sûr je n'ai pas importées dans la nouvelle BDD.

    120 tables, ça commence à faire beaucoup !
    Commence par vérifier si le schéma actuel est normalisé et, quitte à le modifier, normalise-le. Tu obtiendras peut-être moins de tables mais de meilleures performances.

    Ensuite, pour importer les données dans le nouveau schéma, tu commences par les tables sans clé étrangère puis petit à petit tu arrives vers les tables en ayant le plus grand nombre.

    Et à chaque fois, avec des requêtes de test, tu vérifies que les données à importer sont les mêmes que les données anciennes et si ce n'est pas le cas, tu en cherches la cause. C'est là que tu peux trouver des données mortes.

    Un petit exemple...

    Imaginons que tu aies une tables des personnes avec leur adresse, y compris la ville en texte :
    personne (id, nom, prenom, rue, code_postal, ville)

    Le nouveau schéma donnera par exemple une table de référence des villes et une clé étrangère dans la table des personnes.
    personne_prs (prs_id, prs_id_ville, prs_nom, prs_prenom, prs_rue, prs_code_postal)

    Tu peux remplir la table des villes à partir d'une source fiable, par exemple l'INSEE qui te donnera les 36000 et quelques communes de France avec leur orthographe et code officiels, leur appartenance à leur canton, leur département et leur région.

    Commence par chercher les villes de la table personne actuelle qui n'existent pas dans la table de référence des communes françaises :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT p.id, p.ville
    FROM personne p
    LEFT OUTER JOIN commune_cmn c ON c.cmn_nom = p.ville
    WHERE c.cmn_nom IS NULL
    Tu vas peut-être trouver par exemple St. Etienne ou Ste Livrade au lieu de Saint-Étienne et Sainte-Livrade. Tu pourras alors corriger les données en cherchant la bonne orthographe de la ville dans la table de référence.

    Une fois les données corrigées, tu peux vérifier que toutes les lignes de la table personne actuelle sont imortables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COUNT(*) AS N
    FROM personne p
    INNER JOIN commune_cmn c ON c.cmn_nom = p.ville
    Si le nombre N est égal au nombre de lignes de la table actuelle, tu peux importer. Sinon, il faut chercher quelles lignes ne sont pas importables et pourquoi avec une nouvelle jointure externe.

    Importation des données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO personne_prs (prs_id, prs_id_ville, prs_nom, prs_prenom, prs_rue, prs_code_postal)
    SELECT p.id, c.cmn_id, p.nom, p.prenom, p.rue, p.code_postal
    FROM personne p
    INNER JOIN commune_cmn c ON c.cmn_nom = p.ville
    ORDER BY prs_nom, prs_prenom
    Bon courage !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2009
    Messages : 141
    Par défaut
    Merci pour cette réponse constructive!

    Oui effectivement mais je pense que tu n'as pas le choix, sinon celui de construire un modèle complet et normalisé en béton avant toute procédure de transfert.
    C'est bien mon intention mais malheureusement c'est un peu utopiste à mon niveau de croire que j'arriverai à construire une base de plus de 120 tables de manière parfaite la première fois.

    Je n'en connais pas et ma petite expérience me dit qu'il serait utopique de vouloir en faire un universel tellement les cas sont variés.
    En fait, je travaille aussi avec un outil de Business Intelligence (Business Objects) qui permet de mapper une base de données de manière visuelle (appelé univers de données) en appliquant des règles de mappage (bien sûr un peu limitées) et je me demandais si ce principe existait dans un outil pour base de données car cela est possible. C'est un peu la tare des informaticiens (ou seulement la mienne) de chercher un outil qui permette de faire tout le travail à leur place...

    En tout cas merci beaucoup pour l'explication des bonnes pratiques que vous avez mis en place, je vais pouvoir m'en inspirer pour réaliser ce travail.

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par glen1789 Voir le message
    C'est bien mon intention mais malheureusement c'est un peu utopiste à mon niveau de croire que j'arriverai à construire une base de plus de 120 tables de manière parfaite la première fois.
    Comme dit dans mon précédent message, 120 tables, ça commence à faire beaucoup. Peut-être que le modèle actuel a créé plus de tables que nécessaire.

    Par exemple, si tu as des tables par année ou par catégories mais qui ont exactement la même structure, tu réunis tout dans une seule table.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2009
    Messages : 141
    Par défaut
    Bonjour,

    Oui mais malheureusement la base est normalisée (120 tables c'est beaucoup mais dans le domaine médical j'ai l'impression que c'est une quantité courante). La refonte totale vient du fait qu'elle a été crée du temps ou InnoDB n'existait pas dans MySQL et que de nouvelles fonctionnalités de la future application nécessitent des changements dans le cœur du modèle.

    Merci pour ton implication.

Discussions similaires

  1. [AC-2013] Conception d'une base de données dans le cadre d'une salle de sport
    Par h4cktaas dans le forum Modélisation
    Réponses: 5
    Dernier message: 14/10/2014, 13h36
  2. Conception d'une base de données
    Par yousron dans le forum Modélisation
    Réponses: 7
    Dernier message: 22/11/2006, 12h06
  3. [Conception] Connexion à une base de données AS400
    Par mirc00 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 21/07/2006, 22h27
  4. Conception d'une base de données
    Par petitloup71 dans le forum Modélisation
    Réponses: 6
    Dernier message: 07/07/2006, 17h08
  5. [Conception] Modifier une base de données
    Par fabrice88 dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 09/06/2006, 09h21

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