Normaliser une base de donnée

Fermé
gregof - 4 oct. 2004 à 16:21
 johnny cash - 5 déc. 2004 à 03:21
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

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
teebo Messages postés 33491 Date d'inscription jeudi 14 octobre 2004 Statut Modérateur Dernière intervention 24 février 2011 1 793
5 oct. 2004 à 09:26
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
blux Messages postés 26144 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 juin 2024 3 293
5 oct. 2004 à 10:35
Boyce-Codd, mon teebo, Boyce-Codd... :-)

A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
0
teebo Messages postés 33491 Date d'inscription jeudi 14 octobre 2004 Statut Modérateur Dernière intervention 24 février 2011 1 793
4 oct. 2004 à 16:50
Salut,

Faudrait peut etre dire quelle norme tu veux :o)

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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
0
teebo Messages postés 33491 Date d'inscription jeudi 14 octobre 2004 Statut Modérateur Dernière intervention 24 février 2011 1 793
5 oct. 2004 à 10:37
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   \_/
0
blux Messages postés 26144 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 juin 2024 3 293
5 oct. 2004 à 11:05
Voui !!!

http://fr.wikipedia.org/wiki/Boycott

A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
0
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?
0
teebo Messages postés 33491 Date d'inscription jeudi 14 octobre 2004 Statut Modérateur Dernière intervention 24 février 2011 1 793
8 oct. 2004 à 07:41
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   \_/
0
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 :)
0
teebo Messages postés 33491 Date d'inscription jeudi 14 octobre 2004 Statut Modérateur Dernière intervention 24 février 2011 1 793
11 oct. 2004 à 10:22
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
\_/ 
0
blux Messages postés 26144 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 juin 2024 3 293
11 oct. 2004 à 10:36
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"
0
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. +
0