Wie soll ich einen Aufzählungstyp in einer relationalen Datenbank darstellen?

12

Ich arbeite an der Entwicklung einer relationalen Datenbank, die Transaktionen auf einem Gerät protokolliert, an dem ich für mein Unternehmen arbeite. Es gibt verschiedene Arten von Transaktionen, die auf dem Gerät ausgeführt werden können. Daher haben wir ein "trans_type" -Feld in einer unserer Hauptdatensatztabellen. Meine Gruppe hat beschlossen, den Typ dieses Feldes als Ganzzahl zu definieren und ihn als Aufzählungstyp zu behandeln. Meine Intuition sagt mir, dass es eine bessere Idee wäre, dieses Feld zu einer Zeichenfolge zu machen, damit unsere Datenbankdaten besser lesbar und benutzerfreundlicher sind. Meine Mitarbeiter scheinen besorgt zu sein, dass dies mehr Ärger verursachen würde, als es wert ist. Dass Zeichenkettenvergleiche zu kostspielig sind und die Möglichkeit von Tippfehlern zu groß ist, ist ein Hindernis.

Wenn Sie sich also mit einem Feld in einer relationalen Datenbank befassen, bei dem es sich im Wesentlichen um einen Aufzählungswert handelt, ist es Ihrer Meinung nach eine bessere Entwurfsentscheidung, dieses Feld als Ganzzahl oder als Zeichenfolge zu definieren? Oder gibt es eine andere Alternative, die ich übersehen habe?

Hinweis: Explizite Aufzählungstypen werden von der von uns verwendeten Datenbank nicht unterstützt. Und die Software, die wir entwickeln, um mit dieser Datenbank zu kommunizieren, ist in C ++ geschrieben.

c.hughes
quelle
Betrifft es irgendjemanden so lange wie überfällig, es einfach zu einer geprüften Typdefinition in der create table zu machen? So etwas wie: CREATE TABLE hit (ip varchar (40), ip_class ENUM (0, "IPv4", 1, "IPv6")); Es sollte Ihnen ermöglichen, = <und> entweder mit der Ordnungszahl oder mit der Zeichenfolge (die der Ordnungszahl zugeordnet ist) zu überprüfen.
Dlamblin

Antworten:

26

Aufzählungstypen sollten eine separate Tabelle in Ihrer Datenbank sein, die eine ID-Nummer, einen Zeichenfolgennamen und andere Spalten enthält, die Sie möglicherweise nützlich finden. Dann existiert jeder Typ als Zeile in dieser Tabelle. Anschließend zeichnen Sie in Ihrer Tabelle die Transaktionen auf. Das Feld "trans_Type" sollte ein Fremdschlüssel für den Schlüssel dieser Referenztabelle sein. Dies ist eine Standardpraxis bei der Datenbanknormalisierung.

Auf diese Weise haben Sie die eine offizielle Namenszeichenfolge gespeichert, können Zahlenvergleiche für die Leistung verwenden und haben die referenzielle Integrität, dass jede Transaktion einen gültigen Typ hat.

Ryathal
quelle
1
Ja, und wenn Sie entscheiden, 'O' in 'Open' zu ändern, müssen Sie nur eine Zeile ändern.
Daniel Kaplan
+1. Eine einfache int / string-Tabelle ist der beste Weg, um Enums in einer relationalen Datenbank darzustellen.
mike30
Wahrscheinlich finden es die nächsten Besucher, die nach einer Java-Lösung suchen , nützlich
Jauhien
2
Dies. Für zusätzliches Guthaben - Wenn das Entwicklerteam die Ganzzahlen in einer Java / C # -Enumeration oder einer ähnlichen definiert hat, können Sie einen Test schreiben, der prüft, ob die Definition der Code-Enumeration von der Nachschlagetabelle abweicht. Es besteht immer die Gefahr, dass durch Hinzufügen eines Elements außerhalb der Reihenfolge die Synchronität verloren geht und Sie erst erkennen, dass ein Live-Datensatz falsch aussieht.
Julia Hayward
4

Es ist üblich, eine trans_typesTabelle zu erstellen und sie dann von Ihrer Haupttabelle mit einem Fremdschlüssel referenzieren zu lassen trans_type_id. Dadurch wird sichergestellt, dass Ihre Datensätze nur auf gültige Aufzählungstypen verweisen.

Beispiel:

trans_type
----------
  Ich würde
  Name

Transaktionen
------------
  Ich würde
  trans_date
  Einzelheiten
  trans_type_id (FK zu trans_type.id)

Beispieldaten:

trans_type

ID | NAME
----------
1 | EINREICHEN
2 | STORNIEREN


Transaktionen

ID | trans_date | trans_type_id
---------------------------------
1 | 2012-12-31 | 1
2 | 2013-01-09 | 2
FrustratedWithFormsDesigner
quelle
3

Wenn die Werte als Ganzzahlen in die Datenbank eingehen, speichern Sie sie auf diese Weise. Das Konvertieren in Zeichenfolgen ist beim Schreiben in die Datenbank nicht erforderlich. Sie können sich immer auf eine Nachschlagetabelle mit den Zeichenfolgen- / Textwerten beziehen (normalisierter).

Dies hat den zusätzlichen Vorteil, dass der Zeichenfolgewert an einem einzelnen Speicherort aktualisiert wird, anstatt eine Art Aktualisierungsroutine auszuführen. Anstelle von 1 = 'Rot' könnte es auch 'Wirklich Rot' sein

Dies ist nicht ideal für die Berichterstellung, da nur eine Tabelle mit Zeichenfolgenwerten (denormalisiert) benötigt wird. Ein Index für dieses Feld würde die Leistung gut genug machen.

Die meisten RDBMS bieten ausreichend Leistung. Obwohl Ihre Idee, die Tabelle in ihrer einfachen Datenform "lesen" zu können, ist der Beitritt zu einer Tabelle keine große Sache. Gewöhnen Sie sich einfach an, eine Ansicht oder ein ähnliches Objekt zu verwenden.

JeffO
quelle
2

Ich muss mit den anderen Antworten auf diese Frage, die den Ansatz der getrennten Aufzählungstabelle befürworten, nicht einverstanden sein.

Ich bin jedoch auf jeden Fall dafür, das Gesagte nicht zu wiederholen, und beziehe mich einfach auf die akzeptierte Antwort auf (mehr oder weniger) dieselbe Frage zum Stapelüberlauf: /programming//a/229919 / 114626

Eyal Roth
quelle
+1 für die verknüpfte Antwort. Für diese Frage scheint Ihre verknüpfte Antwort die richtige zu sein. Aber natürlich wäre eine Referenztabelle viel besser, wenn der Fragesteller Flexibilität bei den aufgezählten Typen wünscht.
Harke