Utiliser des INT ou des VARCHAR dans une table associative ?

Petit nouveau ! | 6 Messages

09 avr. 2015, 15:29

Bonjour,

Je vais poser une question sans doute bête et naïve :oops: , mais je n’ai pas trouvé de réponse claire (et je débute, merci d’être indulgent !).

Admettons que j’aie 2 tables :
Termes (id_terme, terme)
Synonymes (id_syn, synonyme)

Les champs id_terme et id_syn sont des INT.
Les champs terme et synonyme sont des VARCHAR.

Etant donné qu’il y a une relation n,n entre les 2 tables, je vais créer une table associative faisant correspondre les ID des 2 tables : Assoc(id_terme, id_syn)

Jusque là OK.

Et là, tout à coup, je me dis : mais après tout, qu’est-ce qui m’empêche de créer une table associative contenant les termes et les synonymes ? Ce sera peut-être moins performant (un peu, beaucoup, je ne sais pas… :?: ), mais en cas de problème, j’y verrais plus clair. Ca donnerait ça : Assoc(terme, synonyme)

Est-ce que c’est vraiment une solution à proscrire totalement (en termes de performances) ou pas forcément ?

Merci pour vos réponses.
Pascal

ViPHP
ViPHP | 928 Messages

10 avr. 2015, 14:09

Ta question n'est pas bête, bien au contraire.

Dans l'absolu, il vaut mieux utiliser des INT pour les clefs, c'est plus performant pour les jointures. Cependant, pour les tables comme celles que tu présentes, utiliser des varchar peut être mieux dans certains cas puisque ça diminuera le nombre de jointures dont tu auras besoin.

Par exemple, imagines que tu as une table "user" contenant tes utilisateurs, et une table "country" contenant une liste de pays. Si pour tes utilisateurs tu stockes l'ID du pays, tu seras obligé à chaque fois de faire une jointure pour savoir quel est l'iso (fr, en, etc..) du pays dans lequel habite l'utilisateur, alors que si tu utilises directement l'iso comme clef, tu éviteras la jointure.

Saches cependant que ces problématiques n'ont réellement un sens que si tu as beaucoup de données.

Petit nouveau ! | 6 Messages

10 avr. 2015, 14:24

Merci pour ta réponse.

Cela rejoint un peu ce qu'une autre personne m'a répondu sur un autre forum, en me disant qu'il ne fallait pas se préoccuper uniquement de la cohérence du schéma relationnel, mais aussi des requêtes que l'on sera amené à faire (par exemple, il vaut parfois mieux laisser quelques redondances si cela facilite ultérieurement les requêtes, plutôt que de vouloir tout "normaliser" à tout prix).

Quand tu écris "Ces problématiques n'ont réellement un sens que si tu as beaucoup de données", qu'entends-tu exactement par "beaucoup" ?

Pour info, j'ai environ 4000 termes anglais (avec leurs traductions dans 10 autres langues, et des définitions dans 2 langues), mais la table dont je parle, c'est quelques milliers d'entrées au maximum.

Merci !
Pascal

ViPHP
ViPHP | 928 Messages

10 avr. 2015, 14:32

C'est difficile de te donner un chiffre, car ça dépend de pas mal de choses (ton hardware, tes autres tables, etc..). Mais clairement 4000 termes c'est négligeable, je pense que tu pourras commencer à t'inquiéter à partir de de plus de 30 000 entrées. Mais encore une fois ça dépend aussi du reste. Par exemple si tu es chez un hébergeur gratuit ou si tu as un serveur dédié.

Petit nouveau ! | 6 Messages

10 avr. 2015, 15:19

Ok merci pour tes précisions.
Bon WE.