Varchar primary key

Invité
Invité n'ayant pas de compte PHPfrance

31 oct. 2007, 16:43

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

ViPHP
ViPHP | 5924 Messages

31 oct. 2007, 16:50

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).

ViPHP
ViPHP | 5924 Messages

31 oct. 2007, 16:54

La doc mysql sur les index.

Invité
Invité n'ayant pas de compte PHPfrance

31 oct. 2007, 17:24

Merci bien pour cette info

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

01 nov. 2007, 01:23

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.

ViPHP
ViPHP | 5924 Messages

01 nov. 2007, 01:27

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…

Invité
Invité n'ayant pas de compte PHPfrance

01 nov. 2007, 13:17

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.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

01 nov. 2007, 13:40

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. :?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 5924 Messages

01 nov. 2007, 16:12

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)…

ViPHP
ViPHP | 5924 Messages

01 nov. 2007, 16:16

Si tu veux des structures bien faites, renseigne toi sur MCD, ya un cours par exemple sur cette page.