23 votes

SQL clé primaire: integer vs varchar

L'équipe avec laquelle je travaille a décidé de créer une table avec une colonne varchar clé primaire. Ce tableau est référencé par un autre tableau sur cette clé primaire.

J'ai l'habitude de créer un integer primary key, à la suite de ce que j'ai appris à l'université. J'ai lu qu'il y est un gain de performances à l'aide integer primary key.

Le fait est que je ne connais pas d'autre raison pour la création d'un nombre entier de clé primaire. Avez-vous des conseils?

21voto

Remus Rusanu Points 159382

VARCHAR vs INT ne pas dire beaucoup. Qu'importe, c'est le modèle de l'accès.

Sur l'absolu, un élargissement de la clé sera toujours pire qu'un étroit clé. Le type de porte absolument aucune importance, est la largeur qui compte. En comparaison avec INT cependant, quelques types de battre INT dans l'étroitesse, de sorte INT gagne cet argument uniquement par le fait que c'est seulement de 4 octets.

Mais ce qui vraiment important est le choix du cluster clé. Souvent confondue avec la clé primaire, les deux représentent les différentes notions et sont pas tenus de se chevaucher. Voici amore discussion détaillée dois-je concevoir une table avec une clé primaire de type varchar ou int? Le choix de la clé cluster est juste au sujet de la décision la plus importante dans la conception de tableau, et l'application mécanique d'un INT identity(1,1) sur il est peut-être la plus grande erreur que l'on peut faire. C'est là que la question de l'accès des schémas vient:

  • quels sont les plus fréquentes interrogations sur la table?
    • quelles colonnes sont projetées?
    • ce que les prédicats sont appliquées?
    • ce que les plages sont recherchés?
    • ce que les jointures sont exécutées?
    • ce agrégations se produire?
  • comment les données sont insérées dans la table?
  • comment les données sont mises à jour dans la table?
  • comment est vieux de données supprimés de la table, si jamais?
  • combien de non-clustered index existent?
    • quelle est la fréquence des colonnes incluses dans le NC index (clé ou feuille) sont mises à jour?

Dans l'ensemble, il existe de nombreux modèles d'accès qui peut être ruiné par l'aide d'un INT IDENTITÉ clé cluster. Donc, avant de sauter à appliquer un emporte-pièce de solution, peut-être un peu d'analyse est nécessaire...

Certains plus des lignes directrices générales:

Vous voyez il n'y a pas de Clé Primaire de directives de conception, parce que la clé Primaire n'est pas un problème de conception du stockage, mais un problème de modélisation et est entièrement pilotée par domaine.

19voto

Mark Byers Points 318575

La clé primaire est censé représenter l'identité de la ligne et ne devrait pas changer au fil du temps.

Je suppose que le type varchar est une sorte de clé naturelle - comme le nom de l'entité, une adresse email ou un numéro de série. Si vous utilisez une clé naturelle, alors il peut parfois arriver que la clé doit changer parce que par exemple:

  • Les données ont été saisies de façon incorrecte et doit être corrigé.
  • L'utilisateur change de leur nom ou de l'adresse e-mail.
  • La gestion soudainement décider que tous les clients des numéros de référence doit être changé pour un autre format, pour des raisons qui semblent tout à fait illogique de vous, mais ils insistent sur le changement même après vous expliquer les problèmes qu'il vous fera.
  • Peut-être même un pays ou un état décide de changer l'orthographe de son nom est très peu probable, mais pas impossible.

En utilisant une clé de substitution vous éviter les problèmes causés par le fait d'avoir à changer les clés primaires.

12voto

onedaywhen Points 24594

j'ai été un peu déçu parce que j'ai l'habitude de créer un nombre entier primaire clé (à la suite de ce que certains professeur a dit moi à l'université). J'ai lu beaucoup de choses de la documentation sur la performance boost entier à l'aide de la clé primaire.

Il y a un terme pour cela: le biais de confirmation:

"aussi appelé biais de confirmation ou myside le biais de gens ont tendance à privilégier les informations qui confirment leurs idées préconçues ou des hypothèses, indépendamment de savoir si elles sont vraies. Ainsi, les personnes de manière sélective la collecte de nouveaux éléments de preuve, l'interprétation des éléments de preuve de façon biaisée, ou de manière sélective rappelant les informations de la mémoire."

Bien sûr, votre première réaction sera de dire "Mais ce n'est pas vrai!" Oui, vous pouvez dire que 'cos vous êtes partial ;) [langue fermement ancrée dans la joue]

Voici un exemple classique: dire que vous avez été informé par votre professeur de zoologie que tous les cygnes sont blancs, et, bien sûr, tous les cygnes vous et vos amis avez jamais rencontré en blanc. Disons maintenant que plus tard dans la vie d'un collègue, a exprimé l'opinion que peut-être il ya une telle créature comme un cygne noir. Quoi?! Ce n'est pas ce qu'on vous a enseigné. Votre monde est secoué! Vous immédiatement sortir et de faire un saut de l'enquête et vous comptez de 1 000 cygnes blancs et nuls cygnes noirs. La preuve! Si vous aviez trouvé 10 000 cygnes blancs alors l'hypothèse "Tous les cygnes sont blancs" serait dix fois plus vrai, non?

Une autre approche serait d'oublier cygnes blancs pour le moment et essayer de chercher un cygne noir. Peut-être prendre des vacances en bord de mer dans la ville ensoleillée de Dawlish?

Je ne veux pas paraître irrespectueux; vous admettre à la lecture de beaucoup de choses sur ce que vous avez dit et que gagne mon respect. Voici donc un défi: essayer de trouver des cas où l'ajout d'une colonne de type integer pour une table est inutile.

Voici quelques conseils et spoilers: les tables qui ne sont pas référencés par d'autres tables; seule colonne 'toutes les clés des tables de choix; les "petites" tables qui ne sont pas interrogé beaucoup :)

Voici quelques autres sujets connexes comme vous pouvez étudier:

Le mot "primaire" dans "la clé primaire' a plus beaucoup de sens ou sont toutes les clés dans une table donnée, de l'égalité?

Quelles sont les qualités d'un " bon " clé? (par exemple si une clé de valeurs immuables ou une stabilité de la "bonne" assez?)

Est une colonne de type integer ajoutée à la table comme une artificielle clé (perhpas parce que la disposition naturelle de la clé n'est pas "bon"), ou comme une clé de substitution (peut-être pour améliorer les performances d'une "bonne" clé naturelle)?

Lorsqu'une clé de substitution est ajouté à une table sur la performance des motifs, c'est pour de réel effet mesuré ou simplement pour effet (c'est à dire l'optimisation prématurée)?

Devrait clés de substitution apparaissent dans la logique du modèle d'affaires ou sont-ils seulement la mise en œuvre?

Est-ce une bonne idée de toujours faire quelque chose (par exemple, ajouter une colonne de type integer pour une table), sans engager le cerveau à chaque fois? ;)

[Disclaimer: je suis d'un naturel défenseur clé et shun mères porteuses. Pour moi, ils sont comme la dénormalisation: il vous suffit de le faire lorsque vous devez, en général pour une question de performance (spécifique et démontrable), où la faute est ailleurs (moche SQL de la version du produit, logique défaut de conception qui ne peut être fixé à ce moment, etc). Les mères porteuses ne doit jamais apparaître dans la logique du modèle d'affaires. J'ai parfois besoin d'un identificateur artificiel (j'ai même été connus pour utiliser l'IDENTITÉ, mais jamais un GUID) et ils ont été, depuis, dûment montrer logiques du modèle d'affaires.]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X