Page 1 sur 1

Varchar primary key

Posté : 31 oct. 2007, 16:43
par Invité
Bonjour @tous !

Je souhaitais simplement poser une question sur les primary key de type varchar ? Cela à t'il une incidence sur l'indexation du champ définit comme tel ? La rapidité d'accès aux données dans le cas de clés étrangères (jointures) ?

Merci d'avances pour vos réponses

Posté : 31 oct. 2007, 16:50
par Sékiltoyai
Tu voudrais savoir de varchar par rapport à quel autre type ?
Si c'est par rapport à entier, varchar fera souvent des clés plus petites donc plus faciles à parcourrir. Si c'est par rapport au type char, je ne pense pas que la différence soit conséquente, il faut juste préciser lors de la création de l'index s'il y a une partie de l'index particulièrement intéressante à prendre en compte (plus représentative).

Posté : 31 oct. 2007, 16:54
par Sékiltoyai
La doc mysql sur les index.

Posté : 31 oct. 2007, 17:24
par Invité
Merci bien pour cette info

Posté : 01 nov. 2007, 01:23
par Hubert Roksor
Si c'est par rapport à entier, varchar fera souvent des clés plus petites donc plus faciles à parcourrir.
Euh, un INT prend seulement 4 octets, je doute qu'aucun VARCHAR puisse faire plus court que ça, c'est pourquoi les INT sont plus rapides pour à peu près toutes les opérations. Ou alors on ne parle pas de la même chose ? Peut-être avec des données plutôt redondantes grâce à la compression de préfixe le stockage pourrait être moindre, mais pour l'exécution je préfèrerais un INT.

Concernant les indices partiels, s'il s'agit d'une clé primaire ça veut dire que les n premiers caractères ne pourront être identiques, e.g. si l'index porte sur les 4 premiers caractères on ne pourra pas avoir "abcd1" et "abcd2".
Cela à t'il une incidence sur l'indexation du champ définit comme tel ? La rapidité d'accès aux données dans le cas de clés étrangères (jointures) ?
Cela a une très grande incidence et dépend étroitement du type de données/requêtes, mais comment répondre à ce genre de question très vague avec si peu d'informations. Pire encore, pourquoi répondre à une question si vague ? Si tu ne prends pas la peine d'expliquer ton problème je doute que ça motive quiconque de s'en occuper à ta place.

Posté : 01 nov. 2007, 01:27
par Sékiltoyai
Si c'est par rapport à entier, varchar fera souvent des clés plus petites donc plus faciles à parcourrir.
Euh, un INT prend seulement 4 octets, je doute qu'aucun VARCHAR puisse faire plus court que ça, c'est pourquoi les INT sont plus rapides pour à peu près toutes les opérations. Ou alors on ne parle pas de la même chose ? Peut-être avec des données plutôt redondantes grâce à la compression de préfixe le stockage pourrait être moindre, mais pour l'exécution je préfèrerais un INT.
oui, je voulais dire le contraire, ca m'étonne de ne pas m'être relu…

Posté : 01 nov. 2007, 13:17
par Invité
Je posais cette question dans le cadre du développement d'une appli qui gère un ensemble d'utilisateur qui n'ont pas la possibilité d'avoir le même pseudo (identifiant unique, alphanumérique sans caractères spéciaux, sur 20 caractères maximum, 3 minimum). Je voulais faire de ce pseudo une clé dans ma base pour mes jointures. Mais selon vos réponses il est apparemment préférable d'attribuer un matricule à chaque enregistrements.

Posté : 01 nov. 2007, 13:40
par zeus
Salut,

De manière générale, il vaut mieux que la clé primaire ne soit pas une donnée visible par l'utilisateur, qui plus est le pseudo.
Non seulement, il va falloir te trimbaler un varchar plutôt qu'un int, comme ça a déjà été dit, mais en plus, une donnée visible par l'utilisateur est soumise à modification.

Imagine un de tes membres qui te demande de modifier son pseudo (c'est pas si idiot que ça ;) ) ... tu va être obligé de modifier toutes tes tables où le pseudo est une clé étrangère. :?

Posté : 01 nov. 2007, 16:12
par Sékiltoyai
Imagine un de tes membres qui te demande de modifier son pseudo (c'est pas si idiot que ça ;) ) ... tu va être obligé de modifier toutes tes tables où le pseudo est une clé étrangère. :?
[avocat du diable]
Ya le ON UPDATE CASCADE :D
[/avocat du diable]

En effet le pseudo peut (et vaut mieux) être une clé UNIQUE, mais l'utiliser pour les jointures serait assez couteux en ressources. Le coup de l'identifiant PRIMARY INT AUTOINCREMENT c'est souvent la meilleure chose à faire, surtout lorsque tu utilises des jointures ou des clés étrangères. (A la rigueur on peut s'en passer pour une table qui n'est liée à aucune autre et sur laquelle on fera peu de modifications)…

Posté : 01 nov. 2007, 16:16
par Sékiltoyai
Si tu veux des structures bien faites, renseigne toi sur MCD, ya un cours par exemple sur cette page.