Wie behandeln Aufzählungen ohne enum-Felder in einer Datenbank?
Wie würde ich das umsetzen, ein enumeration-Feld in einer Datenbank, der nicht mit den Aufzählungen? (z.B. SQLite)
Die Felder müssen einfach durchsuchbar mit "field
= ?" so mit jeder Art von Daten-Serialisierung ist eine schlechte Idee.
- Falls dieser ein Duplikat ist, bitte schön. Ich habe mir für die Antwort auf StackOverflow, bevor ich fragte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit einem Fremdschlüssel für die lookup-Tabelle ist der Ansatz, den ich verwenden. In der Tat, benutze ich dieses auch wenn ich eine Datenbank verwenden, die unterstützt ENUM (z.B. MySQL).
Einfachheit halber, kann ich überspringen, das allgegenwärtige "
id
" für die lookup-Tabelle, und verwenden nur den tatsächlichen Wert, den ich brauche in meiner Haupt-Tabelle als Primärschlüssel der lookup-Tabelle. So dass Sie nicht brauchen, zu verknüpfen, zu erhalten die Wert.Zugegeben, die Speicherung von strings nimmt mehr Platz als der MySQL-Implementierung von
ENUM
, aber wenn die Tabelle in Frage, hat Millionen von Zeilen, es spielt eigentlich kaum eine Rolle.Andere Vorteile der lookup-Tabelle sind, dass Sie können hinzufügen oder entfernen Sie einen Wert aus der Liste mit einem einfachen
INSERT
oderDELETE
, in der Erwägung, dass mitENUM
verwenden SieALTER TABLE
neu zu definieren in der Liste.Versuchen Sie auch das Abfragen der aktuellen Liste der zulässigen Werte in einer
ENUM
zum Beispiel zum füllen einer pick-Liste in der Benutzeroberfläche. Es ist ein großes ärgernis! Mit einer lookup-Tabelle ist es ganz einfach:SELECT status from BugStatus
.Auch Sie können andere Attribut-Spalten, die lookup-Tabelle, wenn Sie (z.B. zu mark Entscheidungen, die nur für Administratoren verfügbar). In einem
ENUM
Sie kann nicht kommentieren die Einträge, Sie sind nur einfache Werte.Weitere option neben einer lookup-Tabelle zu verwenden
CHECK
Einschränkungen (sofern die Datenbank diese unterstützt -- MySQL nicht unterstützt, PRÜFEN Sie, bis die version 8.0.16):Aber diese Nutzung
CHECK
Einschränkung leidet unter dem gleichen Nachteile wie dieENUM
: schwer zu ändern, die Liste der Werte, ohneALTER TABLE
schwer Abfrage der Liste der erlaubten Werte, schwer zu kommentieren-Werte.PS: die Geschlechter-Vergleich-operator in SQL ist eine einzige
=
. Die Doppelzimmer==
hat keine Bedeutung in SQL.Beschränken die möglichen Werte, die ich benutzen würde ein Fremdschlüssel auf eine Tabelle, enthält die enumeration der Elemente.
Wenn Sie nicht Mitglied werden wollen, um Ihre sucht dann den Schlüssel vom Datentyp varchar, wenn JOINS sind nicht ein problem, dann die Taste INT und nicht beitreten, es sei denn, Sie brauchen, um eine Suche in diesem Feld.
Beachten Sie, dass Sie setzen Ihre Aufzählungen in die DB schließt compile-Zeit-Prüfung der Werte in Ihrem code sein (es sei denn, Sie duplizieren die Aufzählung im code.) Ich habe festgestellt, dass dies ein großer Nachteil.
Haben Sie grundsätzlich zwei Optionen :
verwenden Sie ein integer-Feld
verwenden Sie ein varchar-Feld
Würde ich persönlich befürworten die Verwendung von varchars, weil Sie nicht etwas zu brechen, wenn Sie Ihre enum - + die Felder sind für Menschen lesbar, aber int-Werte haben einige pro aswell, nämlich Leistung (die Größe der Daten ist ein offensichtliches Beispiel)
Dies ist, was ich getan habe vor kurzem
In meinem hibernate gemappt POJO - ich hielt die Art der die der member als String und es ist vom Datentyp VARCHAR in der Datenbank.
Setter dafür dauert ein enum
Es ist ein weiterer setter, die dauert String - das ist aber privat (oder Sie können die Karte das Feld direkt - wenn es das ist, was Sie bevorzugen.)
Nun die Tatsache, die ich mit String gekapselt wird, von allen. Für den rest der Anwendung - mein domain-Objekte für die Verwendung von enum.
Und soweit der Datenbank betrifft - ich bin mit String.
Wenn ich verpasst Ihr Frage - ich entschuldige mich.
Ich mit einem varchar. Ist dies nicht eine option für Sie?