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

Algorithmes et structures de données Discussion :

Détecter les suppression dans un fichier qui sert à alimenter une BDD


Sujet :

Algorithmes et structures de données

  1. #1
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 304
    Points : 318
    Points
    318
    Par défaut Détecter les suppression dans un fichier qui sert à alimenter une BDD
    Bonjour à tous,

    Un serveur maître exporte des données dans un fichier qu'il envoi à mon serveur WEB pour que je les mette à jour.

    Ma première question consiste à savoir quelle est la terminaison du verbe mettre quand je le conjugue au présent subjonctif à la première personne (que je les met... à jour)

    Ma deuxième question concerne la détection des entrées supprimées du fichier.

    Je vois pour ma part deux approches :

    1. Ajouter une colonne supplémentaire dans ma table qui contiendra un drapeau de suppression.
      en parcourant le fichier, si je trouve l'entreprise dans ma table je baisse le drapeau et je fais les traitements nécessaires pour la détection d'un ajout ou d'une mise à jour. Je fais ensuite une deuxième passe sur ma table et je supprime toutes les entreprises qui ont le drapeau levé.

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      DELETE FROM Table WHERE Suppression = 1
      Il y a un truc qui me gêne dans cette approche c'est que je rajoute une colonne dans ma table qui n'a rien à voir avec mes données donc mon modèle est pourri.


    2. Autre solution, passer par une table de mouvement. Ça consiste à avoir une 2 table identique à ma table originel sauf qu'elle a la fameuse colonne en plus. Cette fois je m'en fou parce que cette table n'est pas une table de données et elle ne fait pas partie de mon modèle. Elle sert juste au traitement. Bref, à chaque fois que je reçois le fichier, je supprime et recrée (ou tronque et rempli) la table mouvement à partir de la table originelle, je décide que la 3 ième colonne a le drapeau levé par défaut, et puis même histoire que la solution 1.

      Ce qui me gêne dans cette solution c'est de devoir écraser la table à chaque fois. Je ne sais pas si MySQL fait ça rapidement ou pas. D'ailleurs, qu'est-ce qui est préférable : supprimer et copier ou tronquer et remplir ?



    Merci pour vous avis éclairés.

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    3. créer une table pour modéliser le contenu du fichier, et jouer avec les JOIN pour trouver les valeurs en plus/en moins/communes entre la table de réference et la table du fichier.

  3. #3
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 304
    Points : 318
    Points
    318
    Par défaut
    Sans oublier que pour la solution 2 il faut ensuite faire l'opération inverse : supprimer la table originelle et la recréer depuis la table des mouvements (sans prendre la 3ième colonne)

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    et pour a)

    "Patientez.. Je met à jour votre Base de Données"

    et en général dans les BDD c'est la solution 1 qui est implantée...

    (modifiée, car il faut garder l'original, tenir compte des modifs et les garder, plus éventuellement la suppression).

  5. #5
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 304
    Points : 318
    Points
    318
    Par défaut
    Bonjour à tous et merci pour vos réponses.

    Je ne penses pas que je vais pouvoir m'en sortir avec des joins car je n'ai pas de clé primaire. Les Id ne sont pas uniques car le fichier que je reçois alimente une table de liens entre deux autres tables.

    Sinon ce document de Jeff Attwood explique visuellement comment ça pourrait marcher avec des join si les clés étaient uniques
    http://www.codinghorror.com/blog/archives/000976.html

  6. #6
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 304
    Points : 318
    Points
    318
    Par défaut
    Ok j'ai pas assez réfléchis avant de poster, en fait il y a bien un moyen de détecter une suppression :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     SELECT T1.ID1,
    FROM T1
    LEFT JOIN T2 
    ON T1.Id1 = T2.Id1
    WHERE T2.id1 IS NULL
    Trouvera les entrées de T1 qui ne sont pas dans T2.

    La notion de mise à jour n'est peut être pas pertinente dans mon cas (c'est une table de lien), donc en fait soit il y a une nouvelle entrée soit il n'y en a pas. Et inversement, soit une entrée existante a disparu soit elle n'a pas disparu. Je suis donc amené à faire de toute façon deux passes : une passe avec le premier bout de code, et une deuxième passe avec le même bout de code mais en intervertissant T1 et T2.

    Si quelqu'un a une meilleur idée je suis bien sure preneur.

  7. #7
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 304
    Points : 318
    Points
    318
    Par défaut
    Ok je dis que des bêtises là parce que ça ne sert à rien de détecter les suppressions sur un seul ID... Je vais d'abord bien réfléchir et faire quelques tests avant de reposter :p

  8. #8
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 304
    Points : 318
    Points
    318
    Par défaut
    Voici l'algo :

    * Détecter les nouvelles entrées (soit de nouvelles entreprises soit de nouveaux liens)
    * Supprimer les anciennes entrées (idem)

    Pour détecter une nouvelle entrée dans la table FICHIERFORMATION non présente dans la table GESTIONFORMATION

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT FF.ID1, FF.ID2
    FROM FICHIERFORMATION FF
    WHERE NOT
    EXISTS (
    SELECT *
    FROM GESTIONFORMATION GF
    WHERE GF.ID1 = FF.ID1
    AND GF.ID2 = FF.ID2
    )
    Pour détecter une entrée dans la table GESTIONFORMATION qui n'est plus présente dans le fichier FICHIERFORMATION

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT GF.ID1, GF.ID2
    FROM GESTIONFORMATION GF
    WHERE NOT
    EXISTS (
     
    SELECT *
    FROM FICHIERFORMATION FF
    WHERE FF.ID1 = GF.ID1
    AND GF.ID2 = GF.ID2
    Par contre je n'ai aucune idée des performances de cette solution (correct, peut mieux faire ou carrément à éviter ?), mais peut être que cette question n'a pas vraiment sa place dans un forum d'algorithmique.

  9. #9
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Pourquoi ca ne marcherait pas avec un "OUTER JOIN" ?

  10. #10
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 304
    Points : 318
    Points
    318
    Par défaut
    Un outer join me sortirai celles qui sont dans T1 et pas dans T2 pour un seul ID.
    Or, j'ai besoin de savoir si les DEUX ID sont on ne sont pas et dans T1 et dans T2.

    A moins que je fasses un outer join sur ID1 et que je rajoute une clause WHERE sur ID2, mais dans ce cas il pourrait y avoir des doublons...

    Voici ce que j'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT FICHIER.ID1, FICHIER.ID2
    FROM FICHIER
    JOIN FORMATION ON FORMATION.ID1 = FICHIER.ID1
    WHERE FICHIER.ID2 != FORMATION.ID2
    Ce code fait bien ce qu'on lui demande mais affiche quelques entrées en plusieurs fois donc j'ai ajouté un distinct juste après le select

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT DISTINCT FICHIER.ID1, FICHIER.ID2
    FROM FICHIER
    JOIN FORMATION ON FORMATION.ID1 = FICHIER.ID1
    WHERE FICHIER.ID2 != FORMATION.ID2
    Cette fois les entrées sont uniques, par contre il ne détecte pas les entrées existant uniquement dans le fichier et pas dans la table. Je me suis dit je vais faire un left join
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT DISTINCT FICHIER.ID1, FICHIER.ID2
    FROM FICHIER
    LEFT JOIN FORMATION ON FORMATION.ID1 = FICHIER.ID1
    WHERE FICHIER.ID2 != FORMATION.ID2
    Mais ça ne trouve toujours pas les nouvelles entrées du fichier.

    Donc je ne vois pas trop comment l'écrire avec un outer join...

  11. #11
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par yacinechaouche Voir le message
    Un outer join me sortirai celles qui sont dans T1 et pas dans T2 pour un seul ID.
    Or, j'ai besoin de savoir si les DEUX ID sont on ne sont pas et dans T1 et dans T2.
    Tu as un ID composite, c'est ca ?

    Je pense que ce que tu veux faire est faisable avec des JOIN. Tu devrais aller voir sur le forum "Langage SQL".

  12. #12
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 304
    Points : 318
    Points
    318
    Par défaut
    Tu as un ID composite, c'est ca ?
    Je ne sais pas trop. Je n'ai pas d'ID en fait. C'est une table de "liens" qui contient deux colonnes avec deux ID. Cette table est sensée représenter les relations entre les entreprises pour dire qui gère qui. donc si j'ai 102,130 dans la table cela voudrait dire que 130 gère 102 (oui l'ordre est inversé dans la table).

    Donc il faut que je détecte : les nouvelles entreprises, les entreprises supprimées, les nouveaux liens, et les liens supprimés.

    Je pense que ce que tu veux faire est faisable avec des JOIN. Tu devrais aller voir sur le forum "Langage SQL".
    Comme on dit chez nous : "okaidi, bonne aidi." :p

  13. #13
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par yacinechaouche Voir le message
    Je ne sais pas trop. Je n'ai pas d'ID en fait. C'est une table de "liens" qui contient deux colonnes avec deux ID. Cette table est sensée représenter les relations entre les entreprises pour dire qui gère qui. donc si j'ai 102,130 dans la table cela voudrait dire que 130 gère 102 (oui l'ordre est inversé dans la table).
    Bah, c'est justement ça un ID composite: un identifiant unique fabriqué a partir de plusieurs champs.

    L'ID d'une entreprise c'est le champ: ID1
    L'ID d'un lien c'est la composition des 2 champs: (ID1,ID2)

    Donc en faisant des "JOIN ON (A.ID1=B.ID1 AND A.ID2=B.ID2)" tu devrais récupérer les les liens qui ont changés entre les tables A et B.

  14. #14
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 304
    Points : 318
    Points
    318
    Par défaut
    Donc en faisant des "JOIN ON (A.ID1=B.ID1 AND A.ID2=B.ID2)" tu devrais récupérer les les liens qui ont changés entre les tables A et B.
    Je viens d'essayer : ça me récupère ceux qui n'ont pas changé uniquement. C'est logique puisque je demande que les 2 ids soient trouvées et là et là.

  15. #15
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par yacinechaouche Voir le message
    Je viens d'essayer : ça me récupère ceux qui n'ont pas changé uniquement. C'est logique puisque je demande que les 2 ids soient trouvées et là et là.
    Bah après il faut utiliser un OUTER et tester si A.* ou B.* est NULL

  16. #16
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 304
    Points : 318
    Points
    318
    Par défaut

    Résolu dans le forum des requêtes MySQL.

    Merci à tous pour votre aide.

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

Discussions similaires

  1. Copier les éléments d'un fichier dans le fichier qui lance la macro
    Par hobine dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/11/2011, 23h27
  2. afficher les lignes d'un fichier qui ne sont pas dans lun autre fichier
    Par israellita dans le forum Shell et commandes GNU
    Réponses: 16
    Dernier message: 11/03/2011, 12h39
  3. Détecter les changements dans un fichier qui alimente une table
    Par yacinechaouche dans le forum Requêtes
    Réponses: 2
    Dernier message: 23/06/2008, 18h56
  4. Réponses: 1
    Dernier message: 24/08/2007, 11h50
  5. Réponses: 4
    Dernier message: 22/12/2003, 12h12

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