J'ai ces tables
+-------------------------+ +------------------------+
|Airport | |Country |
|-------------------------| |------------------------|
|airport_code string (PK) | |country_code string (PK)|
|address string | |name string |
|name string | +------------------------+
+-------------------------+
+-------------------------+
|Currency |
|-------------------------|
|currency_code string (PK)|
|name string |
+-------------------------+
Airport_Code est le IATA (International Air Transport Association)Code de l'aéroport , vous peut les voir dans vos balises de bagages lorsque vous voyagez en avion.
Country_Code est le ISO 3166-1 A3 Code de pays standard , vous pouvez les voir dans les Jeux olympiques.
Devise_Code est le IS0 417 Standard 3-caractères Code de devise , vous pouvez les voir dans des planches d'affichage internationales de change.
Ces PKS naturelles sont-elles assez bonnes?
utilise des normes respectées dans le monde, qui sont acceptées par des industries entières suffisamment bonnes pour les PKS?
Faites ces tables besoin de substituts, peu importe quoi?
Non, ils ne le font pas. Ces clés sont certainement assez bonnes!
Ils sont uniques, ne pas rarement va changer, et significatif, qui est une étape sur une clé de substitution. C'est à peu près la définition d'un bon pk.
Les restrictions sur les PKS étant immuables et numériques-entier ne font pas partie du modèle relationnel (CODD) ou toute norme SQL (ANSI ou autre).
Tout en ayant des clés de substitution sur les champs, c'est bien et qu'il n'ya rien de mal à ce que quelque chose à considérer pourrait être la taille de la page d'index elle-même.
Comme il s'agit d'une base de données relationnelle, vous ferez beaucoup de jointures et que la clé de substitution d'un type numérique peut faciliter la prise de la base de données de la base. La taille de la page d'index sera plus petite et donc plus rapide pour rechercher le creux. S'il s'agit d'un petit projet, cela n'aura pas d'importance et vous n'obtiendrez pas de problèmes, mais plus l'application est plus importante, plus vous voudrez réduire les goulots d'étranglement.
Avoir un Bigint, Int, Smallint, Tinyint ou quel que soit le type de données d'entier, vous pouvez vous éviter des problèmes.
Juste mes 2 cents
Mise à jour :
Petit projet - utilisé par quelques-uns, peut-être même quelques dizaines de personnes. Projet de démonstration de petite échelle, projet d'utilisation personnelle, quelque chose à ajouter à un portefeuille lors de la présentation de vos compétences sans expérience, etc.
Grand projet - utilisé par milliers, dizaines de milliers, des millions d'utilisateurs quotidiennement. Quelque chose que vous construiriez une entreprise nationale/internationale avec une base d'utilisateur énorme.
Habituellement, ce qui se passe est un certain nombre des enregistrements obtenus souvent, et le serveur met en cache les résultats pour un accès rapide, mais de temps en temps, vous devez accéder à un enregistrement moins utilisé, à quel point le serveur devait plonger dans l'index. page. (Dans l'exemple ci-dessus avec les noms d'aéroport, les gens volent souvent des compagnies aériennes domestiques, disent Chichago -> Los Angeles, mais à quelle fréquence les gens volent-ils de Boston -> Zimbabwe)
Si Varcharne est utilisé, cela signifie que l'espacement n'est pas uniforme, à moins que les données ne soient toujours la même longueur (à laquelle une valeur de caractère est plus efficace). Cela facilite la recherche de l'indice plus lent et avec le serveur étant déjà occupé à gérer des milliers et des milliers de questions par seconde, il doit désormais perdre du temps à passer un abreuvoir un index non uniforme et faire la même chose sur les joinilles (qui est plus lente que Sélectionne régulièrement sur une table des ONU OPTIMISÉE, prenez le DW à titre d'exemple où il existe aussi peu de jointures que possible pour accélérer la récupération de données). De plus, si vous utilisez UTF capable de vous gâcher avec le moteur de base de données également (j'ai vu certains cas).
Personnellement, de ma propre expérience, un index correctement organisé peut augmenter la vitesse d'une jointure de ~ 70% et faire une jointure sur une colonne entière peut accélérer la jointure jusqu'à environ environ 25% (selon les données). . Au fur et à mesure que les tables principales commencent à se développer et que ces tables s'y sont utilisées, préférez-vous avoir un fichier de données entier occuper la colonne qui comporte quelques octets vs ayant un champ Varcharton/Char qui occupera plus d'espace. Cela revient à économiser sur l'espace disque, à accroître les performances et à la structure globale d'une base de données relationnelle.
En outre, comme James Snell a mentionné:
Les clés primaires doivent également être immuables, quelque chose que les codes de l'aéroport IATA ne sont certainement pas. Ils peuvent être changés à la caprice de l'IATA.
Ainsi, en prenant en compte cela, préférez-vous avoir à mettre à jour 1 enregistrement qui est lié à un numéro, vs ayant à mettre à jour celui-ci et à mettre à jour tous les enregistrements de la table sur lesquels vous adhérez.