Normaliser une base de donnée

Salut a tous,
je voulais savoir comment vous vous y prendriez pour normaliser une table comme celle ci dessous

TABLE
--------
Ch1                      Ch2                      ch3
-----                     -----                    -----
aa                         zzz                      mmmm
aa                         zzz                      ppppp
aa                         kkk                     mmmm
aa                         kkk                     ppppp
aa                         jjj                        mmmm
aa                         jjj                        ppppp
bb                         zzz                      mmmm
bb                         zzz                      ppppp
bb                         kkk                     mmmm
bb                         kkk                     ppppp
bb                         jjj                        mmmm
cc                         zzz                      mmmm
cc                         zzz                      ppppp
cc                         kkk                     mmmm
cc                         kkk                     ppppp
cc                         jjj                        mmmm


si vous avez une idée je suis preneur

11 réponses

  • Votes
  • Date
  • Date décroissante
  1. Ah oui, j'oubliais,
    On effectue les recherches a partir du champ Ch1 et du champ Ch2 pour trouver le champ Ch3

    ainsi que l'on effectue des recherches du Ch1 pour trouver le champ Ch2
    1. Contributeur
      Donc si tu utilises les regles de Codd tu es en 3eme Forme Normal de Boyes and Codd (heu orthographe?) enfin en 3FNBC quoi :o)

      Je ne comprend pas l'interet de tes tables de liaisons 8-) A part de passer de aa a 1 mais ca reste la meme chose... tu peux faire les memes tables de liaisons sans passer par ta traduction du dessus...

      Ce que tu peux faire par contre c'est

      1 aa zzz
      2 aa kkk
      3 aa jjj
      4 bb zzz .......

      et une table

      (1) 1 mmmm
      (2) 1 pppp

      Tu auras donc deux tables avec une cle primaire dans chaque...Si ma memoire est bonne ca devrait marcher mais verifie ca fait un moment que je ne suis plus dans la database...

      *,*  Ce post a été écrit entièrement *,*
      \_/  avec des molécules recyclées   \_/
      1. Modérateur
        Boyce-Codd, mon teebo, Boyce-Codd... :-)

        A+ Blux
         "Les cons, ça ose tout.
        C'est même à ça qu'on les reconnait"
    2. Contributeur
      Salut,

      Faudrait peut etre dire quelle norme tu veux :o)

      *,*  Ce post a été écrit entièrement *,*
      \_/  avec des molécules recyclées   \_/
      1. Salut,
        d'après ma ptite expériance où est la clé primaire.
        à+.
        Merci
        1. teebo :
          ...quelle norme tu veux ...


          Oula, jen sais rien ????
          tu parles de SQL89, SQL92, SQL99 ?
          ca a une incidence a ce niveau?

          Moi je parlais de lui appliquer simplement les regles de Codd

          mohammed : effectivement, c'est justement ca qu'il faut lui appliquer en partie mais je ne sais pas comment m'y prendre pour normaliser tout en gardant a l'esprit que je dois optimiser l'exploitation de la BD (la recherche)

          Sinon pour l'instant jai créé une table 3
          PKCh3.1              Ch3.2
          ----------             --------
          1                            a
          2                            b
          3                            c
          

          jai créé une table 2
          PKCh2.1              Ch2.2
          ----------             --------
          1                            zzz
          2                            kkk
          3                            jjj
          

          jai créé une table 1
          PKCh1.1              Ch1.2
          ----------             --------
          1                            ppppp
          2                            mmm
          


          Ensuite jai créé 2 tables liaisons
          La premiere entre la table 3 et la table 2
          FKCh3.1              FKCh2.1
          ----------             ----------
          1                            1
          2                            1
          1                            2
          2                            2
          1                            3
          2                            3
          


          et la 2eme entre la table 2 et la table 1
          FKCh2.1              FKCh1.1
          ----------             ----------
          1                            1
          2                            1
          3                            1
          1                            2
          2                            2
          3                            2
          1                            3
          2                            3
          3                            3
          


          Mais bon, déja je me demande si cest juste et en plus quand je ferai une recherche a partir de la table 1 (ex champ 1) pour trouver les relations avec la table 3 (ex champ 3) je doute que ce soit hyper optimisé car je devrais passer par la table 2 (ex champ 2)
          Le seul avantage cest que jai supprimer la redondance d'info.
          Quel est votre avis ?

          PS : javais oublié : tout les (ex) champs sont obligatoires
          1. Contributeur
            Je savais bien qu'il y avait un truc qui deconnait aussi :o)
            Boycott tu dis, OK je le note :o)

            *,*  Ce post a été écrit entièrement *,*
            \_/  avec des molécules recyclées   \_/
          2. Salut teebo et les autres

            teebo ta solution cest bien ca ?
            Table 1 
            ---------
            PK_id        ch1        ch2    
            -------       -----       -----
            1                aa           zzz
            2                aa           kkk
            3                aa           jjj
            4                bb           zzz
            5                bb           kkk
            6                bb           jjj
            7                cc            zzz
            8                cc            kkk
            9                cc            jjj
            
            PK_id étant la clef primaire
            
            Table 2 
            ---------
            PK_id        FKT1     ch2    
            -------       -----      -----
            1                1             mmmm
            2                1             ppppp
            3                2             mmmm 
            4                2             ppppp
            5                3             mmmm 
            6                3             ppppp
            7                4             mmmm 
            8                4             ppppp
            9                5             mmmm 
            10              5             ppppp
            .....
            
            

            PK_id étant la clef primaire et FKT1 étant une clef étrangere référent a la clef primaire de la table 1 ?

            parce que dans la table 1, elle peut quand meme etre encore normalisée quand on vois le champ ch1

            pareil quand on voit la table 2 champ ch2 non?

            c'est pour ca que jutilise mes fameuse table liaisons. elles permettent de faire des relation 1->n, 1->n

            je m'explique :

            Table 1 1 - n liaisontable1_2 n - 1Table 2 1 - n liaisontable2_3 n - 1Table 3

            ainsi, on ne répete pas les chaines de caractères tel que aa ou pppp mais plutot des champs uniquement numérique (moins lourd donc plus rapide)

            mais le probleme cest qu'avec mon systeme je dois faire plein de jointures (pas terrible question performance) surtout dans le cas ou quand je fait une recherche dans la table 1 par rapport a la table 3, je suis obligé de passer par la table 2 chose que dans le systeme teebo il ne faut pas

            en gros, je suis un peu perdu :-|

            qu'en pensez vous?
            1. Contributeur
              Bonjour,
              Tres vite (peut etre plus long cet apres midi si j'ai le temps et si j'y penses)

              La normalisation n'a rien a voir avec l'optimisation (enfin rien a voir faut pas exagerer, elle fait partie du processus quand meme), il n'est nulle part question de taille des champs dans la normalisation. Que ce soit un booleen ou une chaine de 250 characteres, ca nous est egal :o)

              Ensuite si tu veux optimiser un peu plus tu peux aussi prendre dans ta table un le champ 1 et 3 par exemple.

              J'ai pas verifie qu'elle etait en 3FNBC j'avoue, c'est un premier jet, et comme je le dis je ne me souvien plus comment rapidement verifie ca, mais il me semble que tu auras du mal a faire mieux de maniere efficace (note que la 3FNBC n'est pas toujours la panacee non plus, ca depend si c'est pour un exo/TP ou si c'est pour la vraie vie ;o) )

              *,*  Ce post a été écrit entièrement *,*
              \_/  avec des molécules recyclées   \_/
              1. bien en fait cest pour la "vraie vie" et ayant un existant, le commenditaire s'attend a une amélioration notable par rapport a l'ancienne version.
                Donc, le but est d'etre le + performant dans la pratique et non dans la théorie :)
                1. Contributeur
                  Le probleme est que je n'ai pas la base sous les yeux :o)
                  Vu les exemples que tu donnes, une base de donnees object pourrait eventuellement arranger les choses...
                  Sinon ca depend aussi des requetes qui sont effectuees, lesquelles sont souvent faites, lesquelles doivent etre rapides,...

                   . . C'est quoi une signure
                  \_/ 
                  1. Modérateur
                    Salut,

                    pour accélerer les requêtes, on peut effectivement "doublonner" des informations, créer des index, voir des tables supplémentaires...

                    Si cela peut accélérer les recherches, cela rend aussi les mises à jour plus longues...

                    De deux maux, il faut choisir le moindre...

                    A+ Blux
                     "Les cons, ça ose tout.
                    C'est même à ça qu'on les reconnait"
                2. citation ::

                  Ah oui, j'oubliais,
                  On effectue les recherches a partir du champ Ch1 et du champ Ch2 pour trouver le champ Ch3

                  ainsi que l'on effectue des recherches du Ch1 pour trouver le champ Ch2

                  loooooooooooooooooooooooool
                  merisement parlant, c'est pô bien du tout ca.
                  en merise ( nomenclature relationnelle , en 2 mots :p ) et bé :
                  A donne B et A + B donnent C est strictement interdit .
                  ca s'appelle la transitivitée .
                  c'est a dire que logiquement si A donne B et A+B donne C alors A donne C .

                  bye
                  ps : dsl g jamais eude dons d'explication. +