web-dev-qa-db-fra.com

VARCHAR comme clé étrangère / clé primaire dans la base de données bonne ou mauvaise?

Est-il préférable d'utiliser l'ID nr: s au lieu de VARCHARS comme clés étrangères? Et est-il préférable d'utiliser l'ID nr: s au lieu de VARCHARS comme clés primaires? Par numéro d'identification, je veux dire INT!

C'est ce que j'ai maintenant:

category table:
cat_id ( INT ) (PK)
cat_name (VARCHAR)

category options table:
option_id ( INT ) (PK)
car_id ( INT ) (FK)
option_name ( VARCHAR ) 

JE POURRAIS AVOIR CELA JE PENSE:

category table:
cat_name (VARCHAR) (PK)

category options table:
cat_name ( VARCHAR ) (FK)
option_name ( VARCHAR ) ( PK )

Ou est-ce que je pense complètement faux ici?

36
user188962

Le problème avec VARCHAR utilisé pour n'importe quelle CLÉ est qu'ils peuvent contenir WHITE SPACE. Les espaces blancs sont constitués de N'IMPORTE QUEL caractère non lisible à l'écran, comme les tabulations d'espaces, les retours chariot, etc. de leurs clés.

Bien sûr, vous POUVEZ utiliser VARCHAR, mais vous devez être très prudent avec l'entrée et la sortie. Ils occupent également plus d'espace et sont probablement plus lents lors d'une requête.

Les types entiers ont une petite liste de 10 caractères valides, ,1,2,3,4,5,6,7,8,9. Ils sont une bien meilleure solution à utiliser comme clés.

Vous pouvez toujours utiliser une clé basée sur des nombres entiers et utiliser VARCHAR comme valeur UNIQUE si vous souhaitez bénéficier des avantages de recherches plus rapides.

30
Armstrongest

Quand je fais du travail de conception, je me demande: ai-je quelque chose dans ces données que je peux garantir va être non NULL, unique et immuable? Si c'est le cas, c'est un candidat pour être la clé primaire. Sinon, je sais que je dois générer une valeur clé à utiliser. En supposant, alors, que ma clé candidate se trouve être un VARCHAR, je regarde les données. Est-il raisonnablement court (c'est-à-dire 20 caractères ou moins)? Ou le champ VARCHAR est-il assez long? Si elle est courte, elle est utilisable comme clé - si elle est longue, il vaut peut-être mieux ne pas l'utiliser comme clé (bien que si elle est considérée comme la clé primaire, je vais probablement devoir l'indexer de toute façon). Au moins une partie de ma préoccupation est que la clé primaire devra être indexée et sera peut-être utilisée comme clé étrangère à partir d'une autre table. Les comparaisons des champs VARCHAR ont tendance à être plus lentes que la comparaison des champs numériques (en particulier les champs numériques binaires tels que les entiers), donc l'utilisation d'un champ VARCHAR long comme clé peut entraîner des performances lentes. YMMV.

Mes 2 cents:

Du point de vue des performances, l'utilisation de CHAR ou VARCHAR comme clé primaire ou index est un cauchemar.

J'ai testé des clés primaires composées (INT + CHAR, INT + VARCHAR, INT + INT) et de loin INT + INT a été la meilleure performance (chargement d'un entrepôt de données). Disons environ deux fois plus de performances si vous ne conservez que les clés/index primaires numériques.

12
jrvidotti

Si vous faites le nom de la catégorie dans l'ID, vous aurez un problème si vous décidez de renommer une catégorie.

4
SorcyCat

Je dirais que c'est bien d'utiliser [~ # ~] varchar [~ # ~] comme les deux PRIMARY et CLÉS ÉTRANGÈRES .

Le seul problème que je pourrais prévoir est que si vous avez une table, disons Instruments (partager des instruments) et vous créez le CLÉ PRIMAIRE/ÉTRANGÈRE as [~ # ~] varchar [~ # ~] , et il arrive que le Le code [~ # ~] [~ # ~] change.

Cela se produit sur les bourses, et vous obligerait à renommer toutes les références à ce code [~ # ~] [~ # ~] , où en tant que L'identifiant n ° ne vous le demandera pas.

Donc, pour conclure, je dirais que cela dépend de votre utilisation prévue.

MODIFIER

Quand je dis CODE, je veux dire le Code Ticker pour permet de dire GOOG, ou tout autre partage. Il est possible que ces codes changent au fil du temps, disons que vous regardez les instruments Dirivative/Future.

3
Adriaan Stander

avec un int, vous pouvez stocker jusqu'à 2 milliards en 4 octets avec varchars vous ne pouvez pas avoir besoin d'avoir 10 octets ou plus pour stocker cela, si vous utilisez varchars il y a aussi une surcharge de 2 octets

alors maintenant vous ajoutez les 6 octets supplémentaires dans chaque PK et FK + la surcharge varchar de 2 octets

3
SQLMenace

Il n'y a rien de mal avec l'une ou l'autre approche, bien que cette question puisse lancer l'argument habituel qui est le meilleur: les clés naturelles ou de substitution.

Si vous utilisez CHAR ou VARCHAR comme clé primaire, vous finirez par l'utiliser comme clé forign à un moment donné. En fin de compte, comme le dit @astander, cela dépend de vos données et de la façon dont vous allez les utiliser.

2
Tony