Partage
  • Partager sur Facebook
  • Partager sur Twitter

Structure de table

    29 novembre 2011 à 7:21:36

    Bonjour à tous!

    Je suis en train de construire un site mais je colle au niveau PHP. Plus précisément à la création de ma BDD.
    Disons que j'ai 6 familles de produit, que chacune d'elle comporte un nombre de sous famille variée et enfin que dans ces dernières se trouvent les produits.

    Voici un petit schéma:

    Famille 1 > Sous Famille 1.1 > produit 1.1.1
    --------------------------------> produit 1.1.2
    --------------------------------> produit 1.1.3
    ------------> Sous Famille 1.2 > produit 1.2.1
    --------------------------------> produit 1.2.2
    --------------------------------> produit 1.2.3

    Famille 2 > Sous Famille 2.1 > produit 2.1.1
    --------------------------------> produit 2.1.2
    --------------------------------> produit 2.1.3
    ------------> Sous Famille 2.2 > produit 2.2.1
    --------------------------------> produit 2.2.2
    --------------------------------> produit 2.2.3
    ... etc, etc

    Comment me conseilleriez vous de construire cette BDD et avec combien de table? Je colle...

    Merci d'avance pour votre aide!
    • Partager sur Facebook
    • Partager sur Twitter
      29 novembre 2011 à 7:36:44

      C'est très dangereux de mettre le nombre de famille en dure dans la table, donc pour conserver la souplesse, je jouerais sur la profondeur de ton arborescence.

      Table famille: id,…
      Table ssFamille: id,idFamille,…
      Table produit: id, idSsFamille,…

      Comme ça peut importe le nombre de famille, de sous famille…
      par contre Un produit n'appartien qu'a une ssFamille, et une ssFamille qu'a une famille. Si tu as besoin souvant d'avoir des produits qui sont dans plusieurs ssFamille, cette architecture ne marche pas. Si c'est exceptionnel, il faudra gérer des doublons.

      Si tu dois souvents avoir des produits appartenant à plusieurs ssFamille, il faudra faire une table de liaison
      Table liaison: id, idSsFamille, idProduit
      • Partager sur Facebook
      • Partager sur Twitter
        29 novembre 2011 à 7:41:48

        Bonjour
        Pour ma part, je ferais 2 tables:
        - Familles: idFamille, idParent, nom, ... avec idParent qui indique la famille de référence ou 0 si c'est une famille qui est à la racine
        - produits: idProduit, idFamille, nom, ... avec idFamille qui pointe vers la famille associée

        Ce type de structure te premettrait de ne pas être limité à seulement 2 niveaux, si un jour tu veux en rajouter un troisième il n'y a pas de soucis. Et tes produits peuvent être rattaché à une famille ou une sous-famille sans problème.

        • Partager sur Facebook
        • Partager sur Twitter
          29 novembre 2011 à 7:48:15

          C'est une solution moins limpide, mais plus souple. Je +
          • Partager sur Facebook
          • Partager sur Twitter
            29 novembre 2011 à 8:02:20

            L'habitude de travailler avec des gens qui changent d'avis tout le temps... Je n'opte jamais pour la solution la plus simple sur le moment, mais sur celle qui m'apporte le plus de souplesse (même si parfois, j'en ch... parfois à les mettre en place)

            Ta solution est parfaite dans un structure qui est totalement statique et qui ne va pas bouger. Malheureusement pour moi je ne suis jamais tombé sur un client qui ne changeait pas d'avis à un moment ou à un autre (en général à la fin du projet quand tu as presque tout fini...)
            • Partager sur Facebook
            • Partager sur Twitter
              29 novembre 2011 à 8:46:50

              Merci pour le lien. Je constate que je dois encore retourner sur les bancs de l'école...
              • Partager sur Facebook
              • Partager sur Twitter
                29 novembre 2011 à 12:05:33

                Le mieux est d'utiliser un arbre comme conseillé par belsion, c'est la solution choisie par la plupart des logiciels de e-commerce, car c'est la plus flexible.

                Ensuite, si tu as une BDD puissante (toutes sauf mysql) qui supporte les requêtes récursives (WITH RECURSIVE), la gestion est simple ; si tu as postgres c'est encore plus simple puisqu'il y a un type "arbre" ; sous mysql tu seras obligé de te prendre le chou avec une représentation intervallaire (à base d'entiers si tu es masochiste, sinon à base de path matérialisé sous forme de texte) et des triggers ou bien des requêtes récursives en php...

                • Partager sur Facebook
                • Partager sur Twitter
                  30 novembre 2011 à 2:01:50

                  Merci à tous pour vos réponses. Je découvre des choses intéressantes.

                  Notamment ce système de représentation intervallaire suggéré par xtaZy.
                  C'est peut être ce qui serai adapté pour ce que je souhaite faire, mais comme tu le
                  dis Lord Casque Noir, je vais devoir me prendre le chou car j'utilise mysql!

                  Voici un scéma de ce que je compte faire :

                  Image utilisateur

                  Si quelqu'un pouvait m'indiquer un tutoriel en ligne qui me permettrait de ma dépatouiller
                  ce serai le top!

                  Encore merci à vous :)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    30 novembre 2011 à 8:34:13

                    La représentation intervallaire à base d'entiers, ça va bien si ton schéma de catégories ne change jamais, mais quand il faut en ajouter une, ça chlingue.

                    Il y a beaucoup plus simple :

                    id    nom                     parent_id     chemin
                     1    racine                  null          01
                     2      bricolage             1             01.02
                     3        menuiserie          2             01.02.03
                     4          scie circulaire   3             01.02.03.04
                     5        électricité         2             01.02.05


                    tu rajoutes une colonne "path" (ou "chemin" si tu es académicien) et tu fourres dedans le chemin sous forme de liste des ids des parents (terminé par l'id de la ligne courante, éventuellement).

                    En gros c'est exactement comme un système de fichiers, le chemin d'un fichier est /répertoire/fichier ; ici le chemin d'une catégorie est une suite d'ids.

                    Mets un index sur cette colonne...

                    Il vaut mieux représenter les ids sur toujours le même nombre de chiffres (rajoute des zéros). Dans ce cas, ça donne une représentation intervallaire*, mais beaucoup plus pratique.

                    Quels sont tous les descendants de "bricolage" ?

                    => path LIKE "01.02.%"

                    Pas besoin de requête récursive.

                    * = oui, la représentation est intervallaire, car tout enfant de l'élément de path "01.02" vérifie "01.02" < path < "01.03", c'est d'ailleurs ce qui permet d'indexer le LIKE.

                    De même pour afficher en haut de la page "bricolage > électricité > chaise électrique" tu n'as besoin que d'une seule requête, puisque récupérer le produit te donne son path ; un explode() et tu as la liste d'ids du chemin, donc la liste de catégories à récupérer.

                    Inconvénient : si un produit peut être dans plusieurs catégories, ton arbre devient un graphe et cela ne fonctionne plus si simplement.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      30 novembre 2011 à 14:09:33

                      Lord Casque Noir, ta solution me plait beaucoup mais j'aimerai tellement la comprendre :p hehe

                      Si je dois utiliser ta solution, que j'aimerai vraiment, je vais devoir trouver un tuto ou un mode d'emploi!
                      Je viens tout juste de me mettre à PHP et voilà que je tombe sur un problème plus gros que moi.

                      Sur le croquis que j'ai affiché plus haut, je pourrais le résumer plus simplement.
                      Les 2 premières colonnes bleu et grise sont des familles et sous familles.
                      La colonne en jaune contient uniquement des photos.
                      Je sais comment insérer des photos en PHP, les introduire dans ma BDD mais pas contre
                      je plante quand à sa structure.

                      Si je ne trouve pas de tuto pour la solution de Lord Casque Noir, que feriez vous?
                      Comme ça je verrai une BDD par familles et sous familles ce qui me fait pour mon croquis euhhhh....
                      7 tables!!!!! aaaaaAAAHhhhhhhhh!!! :waw: PLEASE HELP! :'(

                      Non sérieux je suis vraiment à la rue, je vois pas comment faire :-°

                      En espérant que quelqu'un aura la bonté d'âme de me guider sur le droit chemin :)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        30 novembre 2011 à 14:35:32

                        non non, tu n'as que 2 table:
                        une pour tes produits
                        et une pour tes familles et sous-familles
                        • Partager sur Facebook
                        • Partager sur Twitter
                          30 novembre 2011 à 15:00:21

                          Merci belsion, je vais créer les deux tables avec jointures, je vais relire mes cours pour trouver ça. J'espère que c'est ce que je cherche.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Structure de table

                          × 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