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]).
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 :
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:
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.
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.
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 .
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).