web-dev-qa-db-fra.com

Quelles sont les meilleures pratiques concernant les tables de recherche dans les bases de données relationnelles?

Tables de recherche (ou tables de code, comme certains les appellent) sont généralement une collection des valeurs possibles qui peuvent être données pour une certaine colonne.

Par exemple, supposons que nous ayons une table de recherche appelée party (destinée à stocker des informations sur les partis politiques) qui comporte deux colonnes:

  • party_code_idn, qui contient des valeurs numériques générées par le système et (manquant domaine d'activité de sens) fonctionne comme un substitut pour la vraie clé.
  • party_code, est la clé réelle ou "naturelle" de la table car elle conserve des valeurs qui ont une connotation domaine professionnel.

Et disons que ce tableau conserve les données qui suivent:

 +----------------+------------+
 | party_code_idn | party_code |
 +----------------+------------+
 |              1 | Republican |
 |              2 | Democratic |
 +----------------+------------+

Le party_code La colonne, qui conserve les valeurs 'Republican' et 'Democratic', étant la vraie clé de la table, est configurée avec une contrainte UNIQUE, mais j'ai éventuellement ajouté le party_code_idn et l'a défini comme le PK de la table (bien que, logiquement, party_code peut fonctionner en tant que CLÉ PRIMAIRE [PK]).

Question

Quelles sont les meilleures pratiques pour pointer vers recherche les valeurs de tables de transaction? Dois-je établir des références FOREIGN KEY (FK) soit (a) directement vers la valeur naturelle et significative ou (b ) pour remplacer les valeurs?

Option (a) , par exemple,

 +---------------+------------+---------+
 | candidate_idn | party_code |  city   |
 +---------------+------------+---------+
 |             1 | Democratic | Alaska  |
 |             2 | Republican | Memphis |
 +---------------+------------+---------+

a les propriétés suivantes 1 :

  1. Lisible pour l'utilisateur final (+)
  2. Facile à import-export à travers les systèmes (+)
  3. Difficile de changer la valeur car elle doit être modifiée dans tous les tableaux référents (-)
  4. L'ajout de nouvelle valeur n'est pas coûteux (=)

Je pense que c'est presque comme " passer par valeur ", pour tirer une analogie de appel de fonction dans le jargon de programmation d'application .

Option (b) , par exemple,

 +---------------+----------------+---------+
 | candidate_idn | party_code_idn |  city   |
 +---------------+----------------+---------+
 |             1 |              1 | Alaska  |
 |             2 |              2 | Memphis |
 +---------------+----------------+---------+

a les propriétés ci-dessous:

  1. Non lisible pour l'utilisateur final (-)
  2. Difficile de import-export car nous devons le dé-référencer (-)
  3. Facile à modifier les valeurs, car nous stockons uniquement les références dans tables de transactions (+)
  4. L'ajout de nouvelle valeur n'est pas coûteux (=)

Il est très similaire à " passer par référence ", si on le compare à appel de fonction dans le langage de programmation d'application.

Import-Export peut également être fait d'une manière différente, c'est-à-dire en remplissant simplement la table de recherche puis re-seed la colonne de substitution. J'espère que je comprends bien, c'est quelque chose que je viens d'entendre comme une possibilité.

1. Notez que +, - et = indique l'avantage de ces propriétés.

Question

Assez important: y a-t-il une différence entre une table recherche (ou code) et une référence FK si nous voulons simplement utiliser cette dernière approche? Je pense qu'ils fonctionnent tout de même.

Ressources associées

14
Nishant

Par IDN, je suppose que vous entendez un IDENTITY, SEQUENCE ou AUTO_INCREMENT champ? Vous devriez jeter un oeil ici et ici .

Remarque, section 5 (Utilisation abusive des valeurs de données comme éléments de données) de la première référence, sous la figure 10

Bien sûr, vous pouvez avoir une table distincte pour les commerciaux, puis la référencer à l'aide d'une clé étrangère, de préférence avec une simple clé de substitution telle que sales_person_id, comme indiqué ci-dessus.

Ainsi, cet expert pense que vous devez "déférer" les clés de substitution. C'est vraiment une technique SQL de base et ne devrait pas causer de problèmes dans votre SQL quotidien. Il semble qu'il y ait une erreur dans la figure 10 - le vendeur dans SalesData devrait être une clé de substitution (c'est-à-dire un nombre), pas du texte. Je déduis cela de la citation ci-dessus.

Ce que vous devez éviter à tout prix, c'est la tentation (très courante pour les programmeurs de bases de données novices) de commettre l'erreur décrite dans la section (1) Tables de recherche communes. Ceci est communément appelé l'approche MUCK ( Massively Unified Code Key ) (pas par accident :-) notamment par Joe Celko , également sarcastique connue sous le nom de OTLT - One True Lookup Table ) et conduit à toutes sortes de difficultés. Les programmeurs débutants semblent estimer qu'une seule table de code/recherche/autre est "plus propre" et sera plus efficace quand rien ne pourrait être plus éloigné de la vérité.

De la deuxième référence ci-dessus:

La normalisation élimine les données redondantes, ce qui simplifie considérablement la tâche d'application de l'intégrité des données, mais le processus de création d'un MUCK est une tout autre chose. comme je vais le démontrer, moins de tableaux n'est pas synonyme de simplicité.

Vous voudrez peut-être également jeter un coup d'œil au paradigme EAV ( Entity Attribute Value ) auquel je fais face ici .

10
Vérace

Il existe une troisième approche qui présente certains des avantages de vos deux options - mettre un code réel dans la table de code. J'entends par là une courte séquence de caractères qui capture l'essence de la pleine valeur et est unique. Pour votre exemple donné, il peut être

Idn: 1
Name: Democrats
Code: D      (or DEM)

Le code est transposé dans les tables transactionnelles comme une clé étrangère. Elle est courte, intelligible et quelque peu indépendante des données "réelles". Les modifications incrémentielles de n nom ne suggéreraient pas de changement de code. Si les républicains decamp en masse , cependant, un changement de code peut être nécessaire, avec les problèmes qui en découlent qu'un identifiant de substitution serait pas encourir.

Ce style a été appelé codage d'abréviations. Je peux recommander l'écriture de Celko à ce sujet. Google books en contient plusieurs exemples. Recherchez "Codage Celko".

Autres exemples: encodages à 2 ou 3 lettres pour les pays, encodage à 3 lettres (GBP, USD, EUR) pour les codes de devise. Court, explicite et ne change pas (et il y a un ISO pour eux).

10
Michael Green