Il y a de nombreux compromis ici. En fait, j'utilise fréquemment des clés de chaîne, mais j'inclus souvent des clés secondaires de substitution pour les jointures (ce serait évidemment l'inverse si j'utilisais MySQL). Il y a des cas où je n'en ai pas cependant.
Tout d'abord, je suis un fan de déclarer les clés naturelles comme la clé primaire où la base de données peut bien gérer cela (PostgreSQL par exemple). Cela aide à la normalisation et permet une conception plus claire de la base de données. Les touches de substitution facilitent la connexion.
Il y a deux raisons pour lesquelles j'ajoute généralement des clés de substitution:
On ne sait pas toujours ce qu'est une clé naturelle. Parfois, ceux-ci doivent être modifiés. Changer une clé composite naturelle lorsqu'elle est utilisée pour les jointures et l'intégrité référentielle est compliqué et sujet aux erreurs.
Les performances de jointure sur les clés composites sont problématiques et une fois que vous suivez la route des clés naturelles, vous y êtes coincé.
Dans les cas où une clé naturelle est une définition, une seule colonne et du texte, cependant, je joins généralement la clé de chaîne. Ma raison est que cela évite souvent les jointures lors de la recherche. L'utilisation la plus courante consiste à fournir une conception de base de données appropriée autour du cas d'utilisation des types d'énumération. Dans la plupart des cas, ceux-ci ne nécessitent pas la jointure supplémentaire pour les requêtes de routine. Donc, lorsque c'est le cas, les clés de chaîne en tant que clés de jointure ont un sens parfait.
Par exemple, dans LedgerSMB, nous stockons les catégorisations de compte. Celles-ci sont identifiées par une référence de chaîne et d'autres données sont stockées avec la référence de chaîne qui est utilisée pour appliquer les règles concernant les combinaisons de catégorisations qui peuvent affecter un compte. La seule fois où la logique est nécessaire est lors de l'enregistrement d'un ensemble de catégorisations, nous nous joignons donc à la clé de chaîne.
Quant à savoir pourquoi la valeur par défaut serait des clés entières, je ne pense pas que ce soit juste une question de taille d'index. Un gros problème est la gestion des clés. Étant donné que la clé est arbitraire et que vous pouvez avoir affaire à des millions d'enregistrements, vous devez avoir un moyen de générer des chaînes uniques. Il y a des cas où les gens utilisent des UUID pour cela, mais il y a une chance non nulle de collision UUID, et où des milliards d'enregistrements sont stockés, cette chance devient suffisamment élevée que l'on pourrait réellement voir tandis que la probabilité de collision avec des types entiers incrémentés est nulle par définition.