Was sind die Best Practices für Nachschlagetabellen in relationalen Datenbanken?

14

Nachschlagetabellen (oder Codetabellen , wie sie manche nennen) sind normalerweise eine Sammlung der möglichen Werte, die für eine bestimmte Spalte angegeben werden können.

Angenommen, wir haben eine Nachschlagetabelle mit dem Namen party(die Informationen über politische Parteien speichern soll), die zwei Spalten enthält:

  • party_code_idn, das vom System generierte numerische Werte enthält und (ohne Bedeutung für die Geschäftsdomäne ) als Ersatz für den realen Schlüssel fungiert.
  • party_codeist der eigentliche oder „natürliche“ Schlüssel der Tabelle, da Werte mit Geschäftsdomänen- Konnotationen beibehalten werden .

Angenommen, eine solche Tabelle enthält die folgenden Daten:

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

Die party_codeSpalte, in der die Werte "Republikanisch" und "Demokratisch" als der eigentliche Schlüssel der Tabelle beibehalten werden, ist mit einer EINZIGARTIGEN Einschränkung eingerichtet, die ich jedoch optional hinzugefügt party_code_idnund als PK der Tabelle definiert habe (logischerweise) , party_codekann als PRIMARY KEY ([PK]) fungieren.

Frage

Was sind die Best Practices für den Verweis auf Nachschlagewerte aus Transaktionstabellen ? Sollte ich Verweise auf FOREIGN KEY (FK) erstellen, entweder (a) direkt auf den natürlichen und aussagekräftigen Wert oder (b) auf Ersatzwerte?

Option (a) , zum Beispiel

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

hat die folgenden Eigenschaften 1 :

  1. Lesbar für den Endbenutzer (+)
  2. Einfach systemübergreifend zu importieren und exportieren (+)
  3. Es ist schwierig, den Wert zu ändern, da er in allen Verweistabellen geändert werden muss (-)
  4. Das Hinzufügen eines neuen Werts ist nicht teuer (=)

Ich denke, es ist fast so , als würde man einen Wert übergeben, wenn man eine Analogie aus dem Funktionsaufruf in der Fachsprache der Anwendungsprogrammierung zieht .

Option (b) zum Beispiel

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

hat die folgenden Eigenschaften:

  1. Nicht lesbar für den Endbenutzer (-)
  2. Schwierig zu importieren und zu exportieren, da wir die Referenzierung aufheben müssen (-)
  3. Einfach zu ändern, da wir nur Referenzen in Transaktionstabellen speichern (+)
  4. Das Hinzufügen eines neuen Werts ist nicht teuer (=)

Im Vergleich zum Funktionsaufruf in der App-Programmiersprache ähnelt es sehr dem Begriff „ Referenzübergabe “ .

Das Importieren und Exportieren kann auch auf andere Weise erfolgen, z. B. durch erneutes Auffüllen der Nachschlagetabelle und anschließendes erneutes Setzen der Ersatzspalte. Ich hoffe, dass ich das richtig hinbekomme, das ist etwas, was ich gerade als Möglichkeit gehört habe.

1. Beachten Sie, dass +, -und =geben Sie den Vorteil dieser Eigenschaften.

Frage

Ganz wichtig: Gibt es einen Unterschied zwischen einer Nachschlagetabelle (oder einer Code- Tabelle) und einer FK-Referenz, wenn wir nur den letzteren Ansatz verwenden? Ich denke, sie funktionieren genauso.

Ähnliche Resourcen

Nishant
quelle

Antworten:

10

Durch IDN, nehme ich an meinen Sie ein IDENTITY, SEQUENCEoder AUTO_INCREMENTFeld? Sie sollten hier und hier einen Blick darauf werfen .

Beachten Sie Abschnitt 5 (Datenwerte als Datenelemente missbrauchen) der ersten Referenz unter Abbildung 10

Natürlich können Sie eine separate Tabelle für die Verkäufer haben und diese dann mit einem Fremdschlüssel referenzieren, vorzugsweise mit einem einfachen Ersatzschlüssel wie sales_person_id (siehe oben).

Dieser Experte ist daher der Meinung, dass Sie Ersatzschlüssel "respektieren" sollten. Es ist wirklich eine recht einfache SQL-Technik und sollte in Ihrem täglichen SQL keine Probleme verursachen. In Abbildung 10 ist anscheinend ein Fehler aufgetreten. Bei sales_person in SalesData sollte es sich um einen Ersatzschlüssel (dh eine Zahl) und nicht um Text handeln. Ich schließe dies aus dem obigen Zitat.

Was Sie unbedingt vermeiden sollten, ist die Versuchung (sehr häufig bei unerfahrenen Datenbankprogrammierern), den in Abschnitt (1) Gemeinsame Nachschlagetabellen beschriebenen Fehler zu begehen. Dies wird allgemein als MUCK-Ansatz ( Massively Unified Code Key ) bezeichnet (nicht zufällig :-), insbesondere von Joe Celko , auch sarkastisch als OTLT - One True Lookup Table bezeichnet ) und führt zu allen möglichen Schwierigkeiten. Anfänger scheinen der Meinung zu sein, dass ein einzelner Code / Lookup / eine beliebige Tabelle "sauberer" und effizienter ist, wenn nichts weiter von der Wahrheit entfernt sein könnte.

Aus dem zweiten Hinweis oben:

Durch die Normalisierung werden redundante Daten beseitigt, wodurch die Durchsetzung der Datenintegrität erheblich vereinfacht wird. Der Prozess der Erstellung eines MUCK ist jedoch etwas ganz anderes. Mit MUCK werden redundante Daten nicht beseitigt, sondern es wird vermieden, was als redundante Tabellen wahrgenommen wird Wie ich zeigen werde, sind weniger Tabellen nicht gleichbedeutend mit Einfachheit.

Vielleicht möchten Sie auch einen Blick auf das zugehörige EAV- Paradigma ( Entity Attribute Value ) werfen, mit dem ich mich hier befasse .

Vérace
quelle
Mit IDN meine ich den automatisch generierten Fremdschlüssel. Ich verwende keine allgemeinen Nachschlagetabellen. Sind Sie sich nicht sicher, wie ich das verwendet habe? Wir verwenden tatsächlich wie Hunderte von Codetabellen. Es scheint wirklich seltsam, dass jemand dies an einem einheitlichen Tisch tun würde. Aber es ist gut zu wissen, dass ein solches Muster existiert und vermieden werden sollte. EAV scheint interessant zu sein. Der Konsens ist also, dass ich mit IDN, dh Ersatzschlüssel, dereferenzieren sollte?
Nishant
1
Die "Dereferenzierungs" -Stratagem scheint sicherlich der Mehrheitsansatz zu sein. Warum nicht ein bisschen experimentieren und sehen, wie es dir geht? Wählen Sie einige natürliche Schlüssel aus und sehen Sie, wie Ihr SQL-Code funktioniert. Geben Sie dann einen Ersatz an und spielen Sie eine Weile damit herum. Celko und Pascal würden in der SQL / Relational-Welt respektiert, aber ich habe gesehen, wie Leute mit ihnen argumentierten, dass ihr Ansatz zu doktrinär und puristisch ist - und dass "reale" Systeme Ersatzschlüssel verwenden müssen. Wenn Ihr natürlicher Schlüssel aus drei Feldern besteht und das in einer FOREIGN KEYanderen Tabelle steht, kann es ziemlich chaotisch werden, aber YMMV.
Vérace
Ja, ich hatte dieses puristische Denken und ich war der Meinung, warum ich Ersatzschlüssel benutze! Und dann schienen einige Anwendungsfälle in der puristischen Welt wirklich schwierig zu handhaben. Ich hatte das Gefühl, dass der Ersatzansatz einfacher ist, obwohl Sie einige Nachteile beim Importieren und Exportieren haben. In der Tat kann das Kombinationsszenario schwieriger sein. BTW-Code-Tabellen unterscheiden sich nicht wesentlich von Fremdschlüsseln im Ersatzszenario, oder? Ich meine, die logische Unterscheidung existiert, aber es ist nichts als ein Fremdschlüssel.
Nishant
1
Sie können Ihre natürlichen Schlüssel über UNIQUE CONSTRAINTs und NOT NULLs erzwingen. Nun , Ihre Codetabelleneinträge befinden sich FOREIGN KEYin den Tabellen, die sie verwenden / auf sie verweisen. Die Konzepte sind also verwandt, aber nicht gleich. Der Ersatzschlüssel der Codetabelle ist das Feld, das in der "Kind" -Tabelle erscheint - sicherlich weniger lesbar, aber INTnicht sehr groß - nicht viel Platz erforderlich, was ein Vorteil von Ersatzschlüsseln ist.
Vérace
10

Es gibt einen dritten Ansatz, der einige der Vorteile Ihrer beiden Optionen bietet: Fügen Sie einen tatsächlichen Code in die Codetabelle ein. Damit meine ich eine kurze Zeichenfolge, die das Wesentliche des vollen Wertes erfasst und einzigartig ist. Für Ihr gegebenes Beispiel kann es sein

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

Der Code wird als Fremdschlüssel in Transaktionstabellen übertragen. Es ist kurz, verständlich und von den "realen" Daten einigermaßen unabhängig. Inkrementelle Änderungen am a-Namen deuten nicht auf eine Codeänderung hin. Sollten sich die Republikaner jedoch massenhaft auflösen , kann eine Änderung des Codes mit den damit verbundenen Problemen erforderlich sein, die nicht durch eine Ersatz-ID verursacht würden.

Dieser Stil wurde als Abkürzungscodierung bezeichnet. Ich kann Celko empfehlen, darüber zu schreiben. Google Bücher enthält mehrere Beispiele. Suchen Sie nach "Celko Encoding".

Weitere Beispiele: 2- oder 3-Buchstaben-Codierung für Länder, 3-Buchstaben-Codierung (GBP, USD, EUR) für Währungscodes. Kurz, selbsterklärend und unverändert (und es gibt eine ISO für sie).

Michael Green
quelle