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

Modélisation Discussion :

Comment modeliser cette structure ?


Sujet :

Modélisation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 17
    Par défaut Comment modeliser cette structure ?
    Bonjour;

    J'aurais besoin de votre aide pour modéliser la situation suivante :

    Je dois importer un fichier csv vers une base MYSQL, afin d'y effectuer des traitements : CRUD, filtrage....

    Ne connaissant pas le type ni le nombre des colonnes du fichier source, je ne peux pas faire une table statique.

    J'utilise donc, pour le moment, cette solution que je trouve moche :

    Admettons que mon fichier a la structure suivante :

    "Nom", "Prenom", "mail"
    "Dupont", "Fabrice", "fabrice@developpez.com"
    ...

    ------------------------------------------------------------------------

    j'ai une table "mapping" qui décrit les colonnes du fichiers csv.
    elle contient les champs,nom des colonnes, ...

    Table mapping:

    id | colonne_1 | colonne_2 | colonne_3 | ...... jusqu'à 30
    1 | nom::string | prenom::string | mail::email-adress | ....


    Table contacts :

    id | mapping_id | colonne_1 | colonne_2 | colonne_2 | ..... jusqu'à 30
    1 | 1 | Dupont | Fabrice | fabrice@developpez.com |...


    Bien que cette solution fonctionne trés bien, il y des inconveniants :
    - Il faut limiter le nombre de colonnes (30 dans mon cas) alors qu'un fichier peut contenir plus que 30 colonnes !

    - chaque fois que je veux extraire le type d'une colonne, je doit faire 2 requetes + des explodes (PHP)....

    - Je la trouve franchement moche, et je pense qu'on peut faire mieux.



    POUVEZ vous m'aider svp.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 288
    Par défaut
    Une autre solution c'est d'ajouter les champs que tu trouves dans ton .csv dans une table "champ" et dans une autre table tu mets les valeurs que tu trouves dans ton fichier:

    table "champ"
    id_champ | libellé_champ

    table "fichier"
    id_fichier | nom_fichier

    table "valeur_fichier"
    id | id_fichier | id_champ | valeur

    /!\ dans cette solution on stocke les valeurs seulement sous forme de chaîne de caractères

  3. #3
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 17
    Par défaut
    Merci pour ta réponse rapide !

    C'est le schéma qui saute au yeux en effet, mais dans mes fichier csv il y a de 10 000 à 1 000 000 de lignes ! imagine le casse tête pour faire du crud avec ce schéma, en plus le nombre d'enregistrements dans la table "valeur_fichier" sera multiplié par le nombre de champs..

    Nombre d'enregistrements par solution : (fichier de 20 colonnes et 10 000 lignes)

    Solution 1 :
    table mapping : 1
    table contacts : 20 000 !


    Solution 2 :
    table champs : 20
    table fichier : 1
    table valeur_fichier : 200 000 lignes !


    En gros j'ai 2 choix :
    Utiliser une structure horizontale :
    - Limite le nombre de colonnes d'un fichier
    - moche ! (je vois ça comme un inconvénient).

    + Optimise le nombre d'enregistrements
    + CRUD rapide

    ou bien
    Utiliser une structure verticale
    - trop d'enregistrements
    - case tète pour le CRUD.

    + Solution structurée et normalisée (pas moche ).



    Y aurait il une 3éme solution qui combinerait les avantages des 2 premières ?

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 288
    Par défaut
    La 3ème solution, c'est d'avoir une table pour laquelle l'application modifie dynamiquement les colonnes pour en ajouter si nécessaire.
    C'est comme ça que fonctionne Drupal6 (module CCK) pour gérer les types de contenus définis par l'utilisateur.

    Il me semble que dans Drupal7 le choix a été de créer une table pour chaque "attribut" (on est pas loin de la première proposition que j'avais faite sauf qu'au lieu d'avoir 1 table avec n attributs x m valeurs, on a n tables avec m valeurs)
    Drupal6 procède de la même façon seulement pour les attributs multivalués (relation 1..n).

    Bref, il faut voir si une telle architecture est réalisable pour toi et ensuite valider avec des tests de performances...

  5. #5
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 17
    Par défaut
    Merci.

    Pour moi, Il est hors de question de jouer avec les structures des tables.

    j'ai besoin de contrôler ma base, en plus imagine que j'ai 200 clients sur mon système, chaque un se connecte en fin de soirée et importe 5 fichiers de structures différentes.
    Je me lève le matin , allume mon pc, regarde la BDD => crise cardiaque

    Bon je pense que je vais garder ma solution pour le moment, en esperant trouver mieux en terme de normalisation, car en terme de performance, c'est la meilleure solution.


    Encore merci montesq pour ton aide.
    n'hésiter pas à poster vos solutions.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 288
    Par défaut
    Je me suis penché sur la partie "modélisation", mais finalement pas sur l'aspect "besoin".
    En effet, en relisant ton premier post, je ne suis pas sûr de vraiment comprendre ton besoin.
    En effet, supposons que l'on ait 2 utilisateurs différents, le premier envoie son fichier, la 3ème colonne a le libellé "email", le second envoie son fichier, la 4ème colonne a le libellé "mail".
    Au final, en base de données tu as les mails du premier utilisateurs dans la 3ème colonne mais ceux du 2ème utilisateurs dans la 4ème!? A quoi cela va-t'il te servir?

Discussions similaires

  1. Comment représenter au mieux cette structure ?
    Par FloBaoti dans le forum C#
    Réponses: 0
    Dernier message: 03/08/2009, 10h23
  2. Comment faire cette vue ?
    Par jibe74 dans le forum SQL
    Réponses: 3
    Dernier message: 21/10/2005, 16h30
  3. Comment passer cette ligne
    Par Atchoum_002 dans le forum Langage
    Réponses: 3
    Dernier message: 06/10/2005, 15h05
  4. Réponses: 7
    Dernier message: 19/07/2005, 08h31
  5. [débutant][JSci][Matrix]comment utiliser cette classe
    Par Clark dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 10/05/2005, 10h40

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