web-dev-qa-db-fra.com

Puis-je utiliser VARCHAR comme clé primaire?

J'ai une table pour stocker les coupons/réductions et je souhaite utiliser la colonne coupon_code comme clé primaire, qui est une VARCHAR.

Mon raisonnement est que chaque coupon aura un code unique et que les seules commandes que je lancerai sont SELECT ... FROM ... WHERE coupon_code='..'

Je ne ferai ni jointure ni indexation et je ne vois pas plus de quelques centaines d'entrées dans cette table.

Il me semble que tout ira bien, mais je ne sais pas si quelque chose me manque ou si je n'y pense pas.

41
Mike Brady

Bien sûr, vous pouvez le faire, dans la mesure où votre SGBDR vous permettra de le faire. La réponse à une question de savoir si vous le faites ou non {devriez _ le faire est différente, cependant: dans la plupart des situations, les valeurs qui ont une signification en dehors de votre système de base de données devraient _ {pas} _ être choisies comme clé primaire.

Si vous savez que la valeur est unique dans le système que vous modélisez, il est approprié d'ajouter un index unique ou une contrainte unique à votre table. Toutefois, votre clé primaire doit généralement comporter une valeur "sans signification", telle qu'un nombre auto-incrémenté ou un GUID.

La raison en est simple: des erreurs de saisie de données et des changements peu fréquents dans des choses apparemment non modifiables se produisent. Ils deviennent beaucoup plus difficiles à fixer sur des valeurs qui sont utilisées comme clés primaires.

91
dasblinkenlight

Cela dépend du cas d'utilisation spécifique.

Si votre table est statique et ne contient qu'une courte liste de valeurs (et qu'il y a juste une petite chance que cela change pendant une durée de vie de DB), je recommanderais cette construction:

CREATE TABLE Foo 
(
    FooCode VARCHAR(16), -- short code or shortcut, but with some meaning.
    Name NVARCHAR(128), -- full name of entity, can be used as fallback in case when your localization for some language doesn't exist
    LocalizationCode AS ('Foo.' + FooCode) -- This could be a code for your localization table... 
)

Bien sûr, lorsque votre table n’est pas statique, utilisez la cléINTcomme clé primaire.

2
Tomino

dans ce contexte, j'utiliserais de préférence Unique au lieu de la clé primaire, pour éviter les erreurs de saisie de données ou pour mettre à jour le code du code de réduction, etc.

0
Imran Younas

C'est ok pour vous. Avec seulement quelques centaines d'entrées, ce sera rapide.

Vous pouvez ajouter un identifiant unique en tant que clé primaire (auto-incrémentation int) et définir votre coupon_code comme unique. Donc, si vous avez besoin de faire une requête dans d’autres tables, il vaut mieux utiliser int que varchar

0
guikk