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 :

Stocker un tableau dynamique dans une base de données relationnelle


Sujet :

Schéma

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Stocker un tableau dynamique dans une base de données relationnelle
    Bonjour,

    Je cherche la meilleure solution pour stocker en base des tableaux mis en forme par l'utilisateur. Le nom et le nombre de colonnes est donc inconnu. En plus de la structure des tableaux des utilisateurs, je dois stocker leur contenu.

    La première solution à laquelle j'ai pensé est de créer une table dans la base pour chaque nouveau tableau créé par l'utilisateur. Ca semble intuitif mais je n'aime pas l'idée que la structure de ma base ne soit pas statique.

    Pour conserver une structure statique j'ai ensuite pensé à utiliser quatre tables :
    une table "tableaux", une table "colonnes", une table "lignes" et une table "enregistrement". Chaque enregistrement représente une case dans un tableau. Il est reliée à une ligne et une colonne.

    Avez-vous des pistes sur ce type de problème ?
    Est-ce problématique que le schéma de bdd ne soit pas fixe ?
    Est-ce que la deuxième idée que je propose ous semble tirée par les cheveux ?

    Merci d'avance pour votre aide,

    Vincent

  2. #2
    Membre confirmé
    Avatar de Bibeleuh
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2010
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2010
    Messages : 209
    Points : 542
    Points
    542
    Par défaut
    Salut,

    Personnelement sans étant expert, je préfère largement la solution 2 que de créer une table par tableau mis en forme...
    Sinon pour ne pas avoir affaire à plusieurs tables dans ta solution 2, tu pourrais peut être enregistrer les tableaux des users dans une seule colonne qui serait de type XML?
    Ca te permettrait d'avoir la structure + les données en une colonne

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci pour ta réponse Bibeleuh. Je penche aussi plus pour la solution 2 pour le moment.

    Par contre, tous mes éléments doivent être atomiques (première forme normale), donc un champ ne contiendra surtout pas de tableau xml ou autre donnée complexe. J'aurai effectivement besoin d'accéder aux champs des tableaux un par un pour des traitements en backend.

    D'autres avis ?

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Vous prendrez bien un peu de Merise ?

    Règles de gestion :
    1) Un tableau est composé de une à plusieurs colonnes et une colonne fait partie d'un seul tableau.
    2) Une colonne peut contenir plusieurs valeurs et une valeur est contenue dans une seule colonne.

    MCD :
    tableau -1,n----composer----(1,1)- colonne -0,n----contenir----(1,1)- valeur

    Tables :
    tableau (tab_id, tab_nom...)
    colonne (cln_id_tableau, cln_position, cln_libelle...)
    valeur (vlr_id_tableau, vlr_position_colonne, vlr_num_ligne, vlr_valeur...)

    La table des lignes ne me semble pas nécessaire. Elle ne contiendrait que des numéros de lignes, ce qui ne me semble pas utile.
    Cependant, ne pas mettre en oeuvre un mécanisme d'auto-incrémentation des numéros de lignes sinon les valeurs n'auraient pas les bonnes positions dans le tableau s'il y a des cellules vides.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci CinePhil,

    Voici un début de solution que j'étais en train de développer. J'ai intégré la table ligne (mais suis prêt à changer d'avis) car:

    - elle pourrait posséder plus d'un simple id à terme.
    - je préfère effacer une ligne plutôt qu'effacer toutes les cellules d'une ligne (géré en cascade par le sgbd)
    - je fonctionnerai probablement avec l'ORM Doctrine2 et il me semble plus naturel de pouvoir manipuler un objet ligne et pouvoir stocker ses éventuelles propriétés en base.
    - permet de gagner un attribut dans la table cellule (la clé étrangère vers la table tableau est stockée dans la table ligne) -> argument faible ceci dit.

    6 Tables :
    - Utilisateur
    - Categorie
    - Colonne
    - Tableau
    - Ligne
    - Cellule

    Un utilisateur s'abonne à 0,n catégorie(s)
    Une catégorie possède 0,n utilisateurs

    Un utilisateur créé 0,n tableau(x)
    Un tableau est créé par 1 utilisateur

    Une catégorie contient 0,n tableau(x)
    Un tableau est caractérisé par 1 catégorie

    Une catégorie est caractérisée par 0,n colonne(s)
    Une colonne appartient à une catégorie

    Un tableau possède 0,n lignes
    Une ligne appartient à 1 tableau

    Une ligne possède 0,n cellules
    Une cellule appartient à 1 ligne

    Une colonne possède 0,n cellules
    Une cellule appartient à 1 colonne

    Voici le type de code PHP5 que je pourrai utiliser :

    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
    echo '<table><thead>';
    foreach($tableau->getCategorie()->getColonnes() as $colonne){
      echo '<th>'.$colonne.'</th>';
    }
    
    echo '</thead><tbody>';
    
    foreach($tableau->getLignes() as $ligne){
      echo '<tr>';
      foreach($tableau->getCategorie->getColonnes() as $colonne){
        echo '<td>'.$ligne->getCellule($colonne).'</td>';
      }
      echo '</tr>';
    }
    echo '</tbody></table>';
    la classe Ligne :

    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
    class Ligne{
    
      ...
    
      public function getCellule($colonne){
        $cellules = $this->getCellules();
        $res = NULL;
        foreach($cellules as $cellule){
          if($cellule->getColonne() == $colonne){
            $res = $cellule
            break;
          }
        if(NULL === $res){
          throw new Exception();
        }
        return $res;
      }
    
    }

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Un utilisateur s'abonne à 0,n catégorie(s)
    Une catégorie possède 0,n utilisateurs
    utilisateur -0,n----abonner----0,n- categorie

    Un utilisateur créé 0,n tableau(x)
    Un tableau est créé par 1 utilisateur
    utilisateur -0,n----créer----1,1- tableau

    Une catégorie contient 0,n tableau(x)
    Un tableau est caractérisé par 1 catégorie
    categorie -0,n----contenir----1,1- tableau

    Une catégorie est caractérisée par 0,n colonne(s)
    Une colonne appartient à une catégorie
    categorie -0,n----caracteriser----1,1- colonne

    => Les colonnes ne sont-elles pas plutôt à associer aux tableaux ?

    Un tableau possède 0,n lignes
    Une ligne appartient à 1 tableau
    tableau -0,n----posséder----1,1- ligne

    Une ligne possède 0,n cellules
    Une cellule appartient à 1 ligne
    ligne -0,n----posséder----1,1- cellule

    Une colonne possède 0,n cellules
    Une cellule appartient à 1 colonne
    colonne -0,n----posséder----1,1- cellule

    Il faudrait que tu représentes ça sur un vrai MCD fraphique qu tu peux réaliser avec un logiciel de modélisation (Open Modelsphere, AnalyseSI, JMerise, PowerAMC...).

    Je pense qu'il doit y avoir des risques d'erreurs ou de boucles piégeuses avec tel modèle brut.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    => Les colonnes ne sont-elles pas plutôt à associer aux tableaux ?
    Non, les colonnes sont bien associées aux catégories. Les utilisateurs qui s'abonnent à une catégorie créent tous des tableaux avec des colonnes identiques.

    Il faudrait que tu représentes ça sur un vrai MCD fraphique qu tu peux réaliser avec un logiciel de modélisation (Open Modelsphere, AnalyseSI, JMerise, PowerAMC...).
    Je le fais sur papier pour le moment. Mais j'utilise ArgoUML pour le boulot, je peux poster une image du MCD, on gagnera certainement en clarté effectivement.

    Je pense qu'il doit y avoir des risques d'erreurs ou de boucles piégeuses avec tel modèle brut.
    Tu penses à quoi par exemple ?

    Merci encore pour ton aide,

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Voici le MCD :

    Images attachées Images attachées  

Discussions similaires

  1. [Conception] Insertion de champs d'un tableau dynamique dans une base de données
    Par loreleï85 dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 12/05/2011, 15h39
  2. stocker un fichier xml dans une base de données en sql
    Par yidboulmane dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/09/2008, 10h55
  3. [SQL] Modification de champs d'un tableau dynamique dans une base de données
    Par loreleï85 dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 27/06/2006, 17h55
  4. Réponses: 1
    Dernier message: 23/06/2006, 12h19
  5. [Conception] Stocker des fichiers multimédia dans une base de données
    Par haifa84 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 11/03/2006, 18h47

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