Vor- und Nachteile der Verwendung von ENUM im Vergleich zu Integer-Typen?


110

Nehmen wir an, Sie haben in einer zufälligen Tabelle eine Spalte mit dem Namen status . Die Werte der realen Welt sind entweder aktiviert oder deaktiviert .

Ist es besser, wenn der Datentyp dieser Spalte ein int / bool (1 oder Null) ist oder ENUMwenn die Werte enabledund sind disabled? Was sind die Vor- oder Nachteile?

Nehmen wir an, Sie haben 4 oder 10 oder sogar mehr als zwei gültige Status. Schwanken die Vor- und Nachteile je nach Anzahl der erforderlichen Werte?


5
Diese Frage sollte von allen MySQL-Entwicklern mit einem Lesezeichen versehen werden, da sie zu einem Herzschmerz oder Triumph führen kann. +1 !!!
RolandoMySQLDBA

Antworten:


70

Ich fand einen sehr bizarren, aber informativen Artikel über 8 Gründe, warum man ENUM nicht verwenden sollte.

Auch ohne den Artikel weiß ich Bescheid


1
Obwohl die anderen Antworten in diesem Thread sehr informativ sind, markiere ich diese aufgrund des sehr hilfreichen Artikels als Antwort.
Jake Wilson

6
+1 Sie können die Mitgliederliste einer ENUM-Spalte nicht in anderen Tabellen wiederverwenden. ENUM ist nur eingeschränkt auf andere DBMS übertragbar.
am

Was kann ich tun, wenn ein Feld Beziehungen zu anderen Datensätzen derselben Tabelle hat? Angenommen, ein unitsModell für einen Shopartikel, bei dem jeder Datensatz Eigenschaften für die zugehörigen Einheiten haben soll composition. dh Ton, Kg,
gm

Nichts Bizarres an diesem Artikel - es ist großartig! Ich denke, es war dieser Beitrag, der mich dazu brachte, warum sie schlecht sind! Ich habe +1 gegeben!
Vérace

1
Der Artikel schlägt vor, eine gute alte Tabelle anstelle von ENUM-Typen zu verwenden. Sollen wir dies zur Antwort hinzufügen?
Utku

39

Nun, zuerst haben wir die Speicheranforderungen . Ich gehe davon aus, dass Sie eine winzige Zahl (anstelle von int) gemeint haben.

  • ENUM benötigt 1 Byte (bei Werten unter 255) oder 2 Byte (bis zu maximal 65.535)
  • TinyInt benötigt 1 Byte (maximal 255 Werte)
  • Boolean ist ein Synonym für TinyInt

An der Oberfläche sind sie also alle gleich. ENUM nimmt jedoch einige Metadaten für den damit verbundenen String-Wert auf ( älteres src )

Ich würde jedoch sagen, wenn Sie mehr Werte hinzufügen, schwankt jeder Vorteil davon weg ENUM. Insbesondere, wenn Sie die Werte hinzufügen, nachdem die Tabelle bereits verwendet wird, da Sie die Tabellenstruktur ändern müssen, um sie anzupassen.

Was ist der Vorteil der Verwendung von ENUM? Eine Zeichenfolgendarstellung, was der Wert bedeutet. So weit ich weiß. Wie wertvoll das ist, hängt von Ihrer Anwendung ab.


4
+1 für die Erwähnung des einzigen echten Vorteils: Zeichenfolgendarstellung. Alles andere ist eine Wäsche für die Zukunft.
RolandoMySQLDBA

19

Ich finde, ENUM ist eine Kurzformdefinition einer Codetabelle. Der Hauptvorteil besteht darin, dass der zum Beitreten und Anzeigen der Codebeschreibung erforderliche Code vermieden wird. Es erleichtert auch das Festlegen der Werte, wenn sie in Zeichenfolgenform eingehen.

Ich finde es hat folgende Nachteile:

  • Keine Möglichkeit für zusätzliche Metadaten zum Code.
  • Es ist schwierig, Werte hinzuzufügen oder zu deaktivieren. (Deaktivierungscodes können mit einem Trigger- und einem Ablauffeld ausgeführt werden.)
  • I18n in der Datenbank kann nicht durchgeführt werden.
  • Nicht über Tabellen hinweg wiederverwendbar.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.