Considérez qu'il existe un tas de tables qui relient des tables «pays» ou «monnaies». P>
Pour que les données facilitent la lecture des données, je voudrais faire un champ de charcuterie avec code de pays (US, GB, UA) et Code de devises (USD, AUD) une clé principale dans chacune de ces 2 tables et toutes les autres tables utiliseront Ce caractère en tant que clé foregine. P>
La base de données est MySQL avec un moteur Innodb. P>
Est-ce que cela va causer des problèmes de performance? Est-ce quelque chose que je devrais éviter? P>
3 Réponses :
Le lien de James Skidmore est important à lire. P>
Si vous vous limitez aux codes de pays et de devises (2 et 3 caractères, respectivement), vous pouvez très bien être capable de vous éloigner des colonnes Char (2) et de Char (3). P>
Je suppose que cela ne serait pas un non-non. Si vous utilisez un codage de caractères de 8 bits, vous regardez des colonnes de la taille de la petite ou moyenne moyenne, respectivement. P>
La performance n'est pas vraiment le problème principal, du moins pas pour moi. Le problème est plus sur les touches de substitution de substitution. P>
Les codes de pays ne sont pas statiques. Ils peuvent et font changer. Les pays changent de noms (par exemple, l'Éthiopie à l'Érythrée). Ils entrent en train d'être (par exemple, la rupture de la Yougoslavie ou de l'Union soviétique) et cessent d'exister (par exemple, ouest et l'Allemagne de l'Est). Lorsque cela se produit, les modifications du code standard ISO. p>
plus dans Nom change depuis 1990: pays, villes et plus p>
Les touches de substitution ont tendance à être meilleures car lorsque ces événements se produisent, les touches ne changent pas, seules les colonnes de la table de référence font. P>
Pour cette raison, je serais plus enclin à créer des tables de pays et de devises avec une clé primaire int. p>
Cela étant dit, les champs clés de Varcharner utiliseront plus d'espace et disposeront de certains inconvénients de la performance qui ne seront probablement pas un problème, sauf si vous effectuez un grand nombre de requêtes. P>
Pour complétude, vous voudrez peut-être vous référer à Erreurs de développement de la base de données faites par AppDéveloppeurs . P>
L'Éthiopie a changé son nom?!?
Bon sang le téléphone, m'a fait me lever au milieu de taper cette réponse exacte. Bien dit!
@Seanja: Selon ce lien, oui. Cela aurait pu être un changement temporaire.
Encore plus important encore, des choses qui, selon la définition doivent être uniques, ne sont pas (numéros de sécurité sociale, numéros de passeport, etc.)
Eh bien, si le code de pays est renommé, vous le modifiez simplement dans une table et que toutes les tables sont mises à jour via la gâchette (ou le pire que vous devez le faire vous-même si des déclencheurs non pris en charge), mais c'est une question mineure.
@Alexeit: Si vous utilisez des touches de substitution, vous n'avez pas à tirer des déclencheurs qui mettront à jour potentiellement des millions de lignes sur un changement.
L'Abyssinie est devenue en Éthiopie; L'Érythrée s'est rompu de l'Éthiopie et est maintenant un pays distinct.
Ma réponse est qu'il n'y a pas de réponse claire. Il suffit de choisir une approche au sein de votre projet et soyez cohérent. Les deux ont leurs plus et leurs minus. P>
@ClTeus fait un bon point sur l'utilisation des touches générées, mais lorsque vous rencontrez une situation dans laquelle les données sont relativement statiques, comme des codes de pays, l'introduction d'une clé générée pour eux semble trop complexe. Malgré la politique mondiale réelle, les codes de pays apparaissent et disparaissent ne seront pas vraiment une question pour la plupart des problèmes d'entreprise (mais si vos données concernent activement tous les 190-210 pays, suivez ce conseil). P>
Utiliser des clés de substitution universellement est une stratégie bonne et populaire. Mais rappelez-vous que cela répond à la modélisation de bases de données en utilisant des clés naturelles pour tout. ACK! Ouvrez un livre de base de données de 15 ans. Utiliser des clés naturelles partout dans des situations difficiles, car la compréhension initiale des domaines problématiques se révèle faux. Vous voulez avoir une cohérence dans vos pratiques de modélisation, mais utiliser différentes techniques pour des situations clairement différentes, c'est d'accord. P>
Je soupçonne que les performances pour la plupart des bases de données modernes sur Var (2) clés étrangères seront les mêmes (ou meilleures) que des champs int. Les bases de données ont pour des années les clés étrangères textuelles prises en charge des années. P>
Étant donné que nous n'avons aucune autre information sur le projet, si vous préférez utiliser les codes de pays comme des clés étrangères et que vous avez la possibilité de le faire, je dirais que c'est OK. Ce sera plus facile de travailler avec les données. C'est un peu contre les pratiques actuelles, mais-- dans cette affaire-- Cela ne va pas vous soutenir dans un coin. P>
-1 C'est vraiment faux. Comme indiqué sur forums.mysql.com/read.php? 153,243809,243818 # MSG-243818 par James, il y a des choses mySQL (la base de données en question) ne fait pas avec Varcharars qu'il fait avec les touches int.
Je devinais que depuis des bases de données cela depuis des années, il serait optimisé. Ne serait pas la première fois que l'hypothèse s'est révélée fausse! Mais ce post est une question légèrement différente ("utilise Varchar (45) un bon choix pour une clé primaire?") Ce problème est char (2) sur une table de 200 rangs (nombre de pays). Malheureusement, ce poste ne discute pas de performance de l'indice FK en général, et si le char (2) va être plus efficace que Varcharate (2) et je ne pouvais pas la creuser. Merci pour le lien.
Je suis d'accord, il discute de la manière dont il est difficile d'avoir 45 octets de char, car il est 4 à 5 fois plus grand que la normale int, mais avec de la char (2) ou de la char (3), il n'y aura pas beaucoup de différence sage.