Question

Fond

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              |
+-------------------------+

aéroport_code est le IATA (International Air Transport Association) Code de l'aéroport , vous pouvez les voir dans vos balises de bagages lorsque vous voyagez en avion.

Entrez la description de l'image ici

Country_Code est le ISO 3166-1 A3 Pays standard Code , vous pouvez les voir aux Jeux olympiques.

Entrez la description de l'image ici

monnaie_code est le IS0 417 Code de devise Standard 3-caractères , vous pouvez les voir dans des planches d'affichage de change internationales.

Entrez la description de l'image ici

Questions

sont-ils suffisamment bons?

utilise des normes respectées dans le monde, qui sont acceptées par des industries entières suffisamment bonnes pour les PKS?

ces tables ont besoin de substituts de substitution quoi que ce soit?

Était-ce utile?

La solution

Non, ils ne le font pas.Ces clés sont certainement assez bonnes!

Ils sont uniques, 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 à propos de PKS étant immuables et numériques-entieurs ne font pas partie du modèle relationnel (CODD) outoute norme SQL (ANSI ou autre).

Autres conseils

Je pense que besoin est un mot très fort, et dans un sens strict, les tables ne sont probablement pas besoin les touches de substitution .

Cependant, si c'était ma base de données, j'ajouterais probablement des clés de substitution de toute façon. Je ne veux peut-être pas nécessairement que ma conception de base de données dépendra d'un groupe de tiers (IATA, ISO), peu importe la stabilité de leurs normes. Ou, je ne voudrais peut-être pas dépendre d'une norme particulière du tout (existe-t-il d'autres normes de code monétaire? Je ne sais pas). Je manquerais probablement mes tables avec des clés de substitution comme SO:

+-------------------------+  +------------------------+
|Airport                  |  |Country                 |
|-------------------------|  |------------------------|
|airport_id       int (PK)|  |country_id     int (PK) |
|iata_airport_code string |  |iso_country_code string |
|icao_airport_code string |  +------------------------+
|faa_identifier    string |  
|address           string |  
|name              string |  
+-------------------------+

+-------------------------+
|Currency                 |
|-------------------------|
|currency_id int (PK)     |
|iso_currency_code string |
|name string              |
+-------------------------+

En d'autres termes, à moins que ces codes standard de l'industrie soient inhérents à mon application, je ne les utiliserais pas comme la PK de mes tables. Ils sont juste des étiquettes. La plupart de mes autres tables auront probablement des clés de substitution de toute façon, et cette configuration ajouterait la cohérence à mon modèle de données. Le coût de "Ajout" Les clés de substitution sont minimes.

mise à jour en fonction de certains des commentaires:

Sans connaître le contexte des exemples de tables, il est impossible de savoir à quel point les codes de l'aéroport d'IATA sont à l'aide de l'application à l'aide de la base de données. Évidemment, si les codes IATA sont centralement importants pour et utilisent de manière omniprée sur toute la demande, il pourrait s'agir de la bonne décision, après une analyse appropriée, d'utiliser les codes comme pk de la table.

Cependant, si la table est juste une table de recherche qui est utilisée dans quelques coins de l'application, l'importance relative des codes IATA peut ne pas justifier une place aussi importante dans l'infrastructure de la base de données. Bien sûr, vous devrez peut-être faire une jointure supplémentaire dans quelques questions ici et là, mais cet effort pourrait être trivial par rapport à l'effort qu'il faudrait pour faire la recherche pour que vous compreniez parfaitement les conséquences de la fabrication des codes IATA la Champ de clé primaire. Dans certains cas, je ne me soucie pas seulement, mais Je ne veux pas avoir à m'occuper de sur les codes IATA. Le commentaire de Snell ci-dessous @ James Snell est un exemple parfait de quelque chose que je ne voudrais peut-être pas avoir à vous soucier d'affecter la PK de mes tables.

En outre, la cohérence de la conception est importante. Si vous avez une base de données avec des dizaines de tables conçues toutes les clés de substitution conçues systématiquement, puis quelques tables de recherche utilisant des codes tiers en tant que PK, qui introduit une incohérence. Ce n'est pas tout à fait mauvais, mais cela nécessite une attention supplémentaire dans la documentation et de telle sorte que cela ne soit pas justifié. Ils sont tables de recherche pour l'amour de la bonté, il suffit d'utiliser une clé de substitution pour la cohérence est parfaitement bien.

mise à jour basée sur de nouvelles recherches:

OK, la curiosité mordonne-moi et j'ai décidé de faire des recherches sur les codes de l'aéroport de l'IATA pour le plaisir, en commençant par les liens fournis dans la question.

Comme il s'avère, les codes de l'IATA ne sont pas aussi universels et faisant autorité que la question les rend les choses. Selon Cette page :

La plupart des pays utilisent quatre caractères codes ICAO , non codes IATA, dans leur Publications aéronautiques officielles.

En outre, les codes IATA et les codes ICAO sont distincts de codes d'identifiant de la FAA , qui sont encore une autre façon d'identifier des aérodromes.

Mon point dans la mise en place n'est pas de commencer un débat sur lequel les codes sont meilleurs ou plus universels ou plus autonomes ou plus exhaustifs, mais de montrer exactement pourquoi la conception de votre structure de base de données autour d'un identifiant 3ème partie arbitraire n'est pas quelque chose que je voudrais Choisissez de faire, sauf s'il y avait une raison d'entreprise spécifique de le faire .

Dans ce cas, Je sens ma base de données serait mieux structurée, plus stable et plus flexible, par des codes de l'IATA (ou de tout code tiers potentiellement changeant) en tant que candidat clé primaire et utilisez une clé de substitution. Ce faisant, je peux renoncer à tous les pièges potentiels pouvant atteindre la sélection principale de la clé.

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 effectuerez beaucoup de jointures et que la clé de substitution d'un type numérique peut faciliter la prise en charge de la base de données, c'est-à-dire que la taille de la page d'index sera plus petite et plus rapide pour rechercher un 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 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. Petite échelle, projet de démonstration, 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 par jour. Quelque chose que vous construiriez pour une entreprise nationale / internationale avec une énorme base d'utilisateurs.

Habituellement, ce qui se passe est un certain nombre d'enregistrements sont souvent sélectionnés et que 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 la page d'index. (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 Varchar 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 le serveur étant déjà occupé à gérer des milliers et des milliers de questions par seconde, il doit désormais perdre du temps à 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 non optimisée, prenez le DW à titre d'exemple où il y a aussi peu de jointures que possible pour accélérer la récupération des données). En outre, si vous utilisez UTF capable de gâcher avec le moteur de base de données également (j'ai vu des cas).

Personnellement, de ma propre expérience, un indice 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 d'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 varchar / char qui occupera plus d'espace. Cela revient à économiser sur l'espace disque, à accroître les performances et à la structure générale 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 d'IATA ne sont certainement pas. Ils peuvent être changés au caprice de l'IATA.

En prenant cela en considération, préférez-vous avoir à mettre à jour 1 enregistrement qui est lié à un numéro, vs ayant à mettre à jour celui-ci et à mettre à jour celui-ci, plus tous les enregistrements du tableau sur lesquels vous adhérez.

Si vous prenez l'approche «J'utilise des clés de substitution tout le temps», vous devez contourner ce type de préoccupation. Ce n'est peut-être pas une bonne chose parce qu'il est important de donner à vos données une pensée, mais cela sauve certainement beaucoup de temps, d'engération et d'effort. Si quelqu'un adoptait une activité à cette règle, les exemples énumérés se qualifient certainement parce que cela prend un "acte de congrès" presque pour faire le changement.

Les requêtes ad hoc d'une base de données avec ces clés naturelles sont certainement utiles. Créer des vues qui font la même chose en incluant les tables de recherche peuvent également fonctionner aussi bien. Les bases de données modernes font un bien meilleur travail avec ce type de choses au point où cela n'a probablement pas d'importance.

Il y a des cas spécifiques aux États-Unis, où les normes ont été modifiées de manière drastique: le code postal s'est élargi de 5 à 9 chiffres, des abréviations d'État à une 2 lettres cohérentes et de se débarrasser de la période (rappelez-vous lorsque l'Illinois était malade.), et la plupart des monde ont obligé de traiter avec Y2K. Si vous avez une application en temps réel avec des données diffusées dans tout le monde contenant des milliards de documents, les mises à jour de cascade ne sont pas la meilleure idée, mais ne devrions-nous pas tous travailler dans des endroits qui font face à de tels défis? Avec cet ensemble de données, vous pouvez le tester pour vous-même et proposer une réponse plus différentielle.

Licencié sous: CC-BY-SA avec attribution
scroll top