Postgres ENUM Datentyp oder CHECK CONSTRAINT?
Ich habe die Migration einer MySQL-db zu Pg (9.1), und wurden die Emulation von MySQL ENUM-Datentypen durch erstellen eines neuen Datentyps in Pg, und dann mit, dass, wie die definition für die Spalte. Meine Frage-könnte ich, und würde es besser sein, verwenden Sie eine CHECK-EINSCHRÄNKUNG statt? Die MySQL ENUM-Typen sind implementiert, um die Durchsetzung bestimmter Werte, die Einträge in den Zeilen. Könnte man das nicht mit einer CHECK-EINSCHRÄNKUNG? und, wenn ja, wäre es besser (oder schlechter)?
InformationsquelleAutor der Frage punkish | 2012-06-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Basierend auf die Kommentare und Antworten hier, und einige rudimentäre Forschung, habe ich die folgende Zusammenfassung zu bieten für die Kommentare aus der Postgres-erati. Wirklich zu schätzen Ihre Eingabe.
Gibt es drei Möglichkeiten zum einschränken der Einträge in einer Postgres-Datenbank-Tabelle-Spalte. Betrachten Sie eine Tabelle zum speichern von "Farben", wo Sie wollen, nur 'rot', 'grün' oder 'blau' werden gültige Einträge.
Aufgelisteten Datentyp
Vorteile sind, dass der Typ kann einmal definiert werden und dann wieder in so viele Tabellen wie erforderlich. Eine standard-Abfrage kann eine Liste aller Werte für einen ENUM-Typ, und kann verwendet werden, um Anwendung, form-widgets.
Nachteile sind, der ENUM-Typ ist gespeichert in der system-Kataloge, so eine Abfrage wie oben erforderlich ist, um die Ansicht seiner definition. Diese Werte sind nicht sichtbar, wenn die Anzeige der Tabellendefinition. Und, da ein ENUM-Typ ist eigentlich ein Datentyp getrennt von den eingebauten NUMERISCHEN und TEXT-Datentypen, die regelmäßige numerische und string-Operatoren und-Funktionen arbeiten nicht auf. So kann man nicht eine Abfrage wie
Check-Einschränkungen
Zwei Vorteile sind, dass man, "was Sie sehen ist was Sie erhalten," das heißt, die gültigen Werte für die Spalte aufgezeichnet werden direkt in der Tabelle definiert, und zwei, alle nativen string-oder numerischen Operatoren arbeiten.
Fremdschlüssel
Im wesentlichen das gleiche wie das erstellen eines ENUM-Typ, außer die native numerische oder string-Operatoren funktionieren, und einen nicht-Abfrage-system-Kataloge entdecken die gültigen Werte. Ein join ist erforderlich, um die Verknüpfung der
color_id
den gewünschten text Wert.InformationsquelleAutor der Antwort punkish
Andere Antworten weisen darauf hin, check-Einschränkungen haben Flexibilität Probleme, aber die Einstellung eines Fremdschlüssels auf eine Ganzzahl-id-erfordert der Beitritt während des lookups. Warum nicht einfach die erlaubten Werte als natürlichen Schlüssel in der Referenz-Tabelle?
Anpassung des Schemas von Punk ' s Antwort:
Werte gespeichert werden inline in der check-Einschränkung Fall, so gibt es keine Verknüpfungen, sondern neue gültige Wert Optionen können leicht Hinzugefügt werden und bestehende Werte-Instanzen aktualisiert werden kann, über
ON UPDATE CASCADE
(z.B. wenn es ist entschieden, "rot" sollte eigentlich "Rot", updatevalid_colors
entsprechend und die änderung überträgt automatisch).InformationsquelleAutor der Antwort Gord Stephen
PostgreSQL hat enum-Typenfunktioniert wie es sollte. Ich weiß nicht, ob ein enum ist "besser" als eine Einschränkung, dass Sie eben beide arbeiten.
InformationsquelleAutor der Antwort Frank Heikens
Einer der großen Nachteile von Fremdschlüsseln vs Check constraints ist, dass jede Berichterstattung oder der Benutzeroberfläche angezeigt wird, führen Sie einen join zu lösen, die id an den text.
In einem kleinen system, das ist keine große Sache, aber wenn Sie ein HR-oder ein ähnliches system mit sehr vielen kleinen lookup-Tabellen, dann kann dies eine sehr große Sache mit vielen Verknüpfungen stattfinden, nur um den text.
Meine Empfehlung wäre, dass, wenn die Werte sind wenige und nur selten ändern, dann verwenden Sie eine Einschränkung auf ein Textfeld, andernfalls verwenden eine lookup-Tabelle mit einem integer-id-Feld.
InformationsquelleAutor der Antwort tomo7
Ich hoffe jemand Glockenspiel mit eine gute Antwort aus dem PostgreSQL-Datenbank-Seite, warum man vielleicht besser als die anderen.
Vom software-Entwickler-Sicht habe ich eine leichte Präferenz für die Verwendung von check-Einschränkungen, da PostgreSQL enum erfordern eine Besetzung in der SQL ein update/insert, wie:
wo "myenum" ist der enum-Typ angegeben werden in PostgreSQL.
Diese sicherlich macht das SQL nicht tragbar (die nicht eine große Sache für die meisten Menschen), aber auch nur noch ein weiteres Sache, die Sie zu bewältigen haben, während die Entwicklung von Anwendungen, so dass ich lieber mit VARCHARs (oder andere typische "primitive") mit check-Einschränkungen.
Als seitliche Anmerkung, ich habe bemerkt, dass die MySQL-Enumerationen, die nicht benötigen diese Art der Besetzung, so ist dies etwas, insbesondere PostgreSQL in meiner Erfahrung.
InformationsquelleAutor der Antwort quux00