web-dev-qa-db-fra.com

Touches étrangères - Lien à l'aide de la clé de substitution ou de la clé naturelle?

Existe-t-il une meilleure pratique pour savoir si une clé étrangère entre les tables doit être liée à une clé naturelle ou à une clé de substitution? La seule discussion que j'ai réellement trouvée (à moins que mon Google-Fu ne manque) est Réponse de Jack Douglas dans cette question , et son raisonnement me semble sain. Je suis au courant de la discussion au-delà de cela que les règles changent, mais ce serait quelque chose qui devrait être pris en compte dans n'importe quelle situation.

La principale raison de demander est que j'ai une application héritée qui utilise des utilisations de FKS avec des clés naturelles, mais il existe une forte poussée de DevLopers pour passer à un ou/m dans notre cas) et une fourchette a déjà produit certains Modifications de rupture, je cherche donc à les repousser sur la piste en utilisant la clé naturelle ou déplacez l'application Legacy pour utiliser les touches de substitution pour le FK. Mon intestin dit de restaurer l'original FK, mais je ne sais honnêtement pas si c'est vraiment le bon chemin à suivre.

La majorité de nos tables ont déjà à la fois une clé de substitution et naturelle déjà définie (bien que des contraintes uniques et de la PK), de sorte qu'à ajouter des colonnes supplémentaires est un non-numéro pour nous dans cet introduction. Nous utilisons SQL Server 2008, mais j'espère que cela est suffisamment générique pour tout DB.

14
Chris J

Ni SQL ni le modèle relationnel ne sont perturbés par des clés étrangères qui font référence à une clé naturelle. En fait, la référencement des clés naturelles améliore souvent considérablement la performance. Vous seriez surpris à quelle fréquence les informations dont vous avez besoin sont totalement contenues dans une clé naturelle; Référencement que la clé transmet une jointure à une table plus large (et réduit par conséquent le nombre de lignes que vous pouvez stocker sur une page).

Par définition, les informations dont vous avez besoin sont Toujours entièrement contenue dans la clé naturelle de chaque table de "recherche". (Le terme Table de recherche est informel. Dans le modèle relationnel, toutes les tables ne sont que des tables. Une table des codes postaux américains peut avoir des rangées qui ressemblent à ceci : {AK, Alaska}, {Al, Alabama}, {AZ, Arizona}, etc. La plupart des gens appelleraient cette table de recherche.)

Sur les gros systèmes, il n'est pas inhabituel de trouver des tables qui possèdent plus d'une clé candidate. Il n'est également pas inhabituel pour les tables qui servent une partie de l'entreprise à faire référence à une clé candidate et aux tableaux qui servent une autre partie de l'entreprise à référencer une clé candidate différente. C'est l'une des forces du modèle relationnel et fait partie du modèle relationnel que SQL soutient plutôt bien.

Vous rencontrez deux problèmes lorsque vous référencez des clés naturelles dans des tables qui ont également une clé de substitution.

Tout d'abord, vous surprendrez les gens. Bien que je puissiez faire pression fortement pour le principe de la moins surprise , c'est une situation où cela ne me dérange pas de gens surprenants. Lorsque le problème est que les développeurs sont surpris par l'utilisation logique des clés étrangères, la solution est une éducation, pas la refonte.

Deuxièmement, les ormes ne sont généralement pas conçus autour du modèle relationnel et incarnent parfois des hypothèses qui ne reflètent pas les meilleures pratiques. (En fait, ils semblent souvent être conçus sans jamais avoir d'avis d'un professionnel de la base de données.) Exiger un numéro d'identification dans chaque table est l'une de ces hypothèses. Un autre suppose que l'application ORM "possède" la base de données. (Donc, il est libre de créer, déposer et renommer des tables et des colonnes.)

J'ai travaillé sur un système de base de données qui a servi de données à des centaines de programmes d'application rédigés dans au moins deux douzaines de langues sur une période de 30 ans. Cette base de données appartient à l'entreprise, pas à une ormission.

Une fourchette qui introduit des changements de rupture devrait être un bouchon de spectacle.

J'ai mesuré la performance avec des clés naturelles et des clés de substitution lors d'une entreprise que j'ai utilisée. Il y a un point de basculement sur lequel les touches de substitution commencent à surperformer les clés naturelles. (En supposant que non supplémentaire effort de maintien des performances de clé naturelles élevées, telles que partitionnement, index partiels, index basé sur des fonctions, espaces de table supplémentaires, à l'aide de disques d'état solide, Etc.) par mes estimations pour cette société, ils atteindront ce point de basculement d'environ 2045. Entre-temps, ils obtiennent une meilleure performance avec des clés naturelles.

Autres réponses pertinentes: dans le schéma de base de données déroutant

La raison principale que je prends en charge les clés de substitution est que les clés naturelles sont souvent sujettes à modification et que, ce qui signifie que toutes les tables correspondantes doivent être mises à jour, ce qui peut mettre une charge assez de charge sur le serveur.

De plus, dans les 30 ans, j'ai utilisé une variété de bases de données sur de nombreux sujets, la vraie clé naturelle est souvent assez rare. Les choses sont censées être uniques (SSN) ne le sont pas, des choses uniques à un moment donné peuvent devenir non uniques plus tard et certaines choses telles que les adresses de courriels et les numéros de téléphone peuvent être uniques, mais ils peuvent être réutilisés pour différentes personnes plus tard. Date. Bien sûr, certaines choses n'ont tout simplement pas un bon identifiant unique comme des noms de personnes et de sociétés.

En évitant les jointures en utilisant une clé naturelle. Oui, cela peut accélérer les affirmations de sélection qui n'ont pas besoin de jointures, mais cela provoquera les endroits où vous avez toujours besoin que les jointures soient plus lentes car les jointures sont généralement plus rapides. Il ralentira également probablement des inserts et supprime et entraînera des problèmes de performance sur les mises à jour lorsque la clé change. Les requêtes complexes (qui sont plus lentes de toute façon) seront encore plus lentes. Des requêtes simples sont donc plus rapides, mais des requêtes complexes et complexes et de nombreuses actions contre la base de données peuvent être plus lentes. C'est un acte d'équilibrage qui peut convenir d'une manière ou d'une autre en fonction de la manière dont votre base de données est interrogée.

Donc, il n'y a pas une seule taille. Cela dépend de votre base de données et de la manière dont il sera interrogé et quel type d'informations est stockée. Vous devrez peut-être faire des tests pour savoir ce qui fonctionne mieux dans votre propre environnement.

5
HLGEM