Vantaggi e svantaggi dell'utilizzo dei tipi ENUM vs Integer?


110

Diciamo in una tabella casuale, hai una colonna chiamata status . I suoi valori del mondo reale sarebbero abilitati o disabilitati .

È meglio che il tipo di dati di questa colonna sia int / bool (1 o zero) o da usare ENUMcon i valori essere enablede disabled? Quali sono i vantaggi o gli svantaggi?

Diciamo invece che solo due stati validi, ne hai 4 o 10 o anche di più? I vantaggi e gli svantaggi oscillano da una parte o dall'altra all'aumentare del numero di valori richiesti?


5
Questa domanda dovrebbe essere aggiunta ai segnalibri da tutti gli sviluppatori MySQL perché può diventare una fonte di dolore o di trionfo. +1 !!!
RolandoMySQLDBA,

Risposte:


70

Ho trovato un articolo molto bizzarro ma informativo su 8 motivi per cui non si dovrebbe usare ENUM.

Anche senza l'articolo, lo so


1
Anche se le altre risposte in questo thread sono molto istruttive, lo segnerò come risposta a causa dell'articolo molto utile.
Jake Wilson,

6
+1 Non è possibile riutilizzare l'elenco dei membri di una colonna ENUM in altre tabelle. ENUM ha una portabilità limitata ad altri DBMS.
Onedayquando il

Cosa potrei fare se ho un campo con relazioni con altri record della stessa tabella? Ad esempio, supponiamo che il unitsmodello di articoli di un negozio in cui ogni record dovrebbe avere proprietà per le sue unità correlate composition. cioè Ton, Kg, gm
SaidbakR,

Niente di strano in quell'articolo - è fantastico! Penso che sia stato questo post a farmi capire perché sono cattivi! Gli ho dato un +1!
Vérace,

1
L'articolo suggerisce di usare un buon vecchio tavolo, invece dei tipi ENUM. Dovremmo aggiungere questo alla risposta?
Utku,

39

Bene, prima di tutto abbiamo i requisiti di archiviazione . Presumo che tu abbia inteso un minuscolo (invece di int).

  • ENUM richiede 1 byte (se inferiore a 255 valori) o 2 byte (fino a un massimo di 65.535
  • TinyInt richiede 1 byte (massimo 255 valori)
  • Boolean è sinonimo di TinyInt

Quindi, in superficie, sono tutti uguali. ENUM utilizza alcuni metadati per il valore di stringa associato ad esso ( src precedente )

Direi che se aggiungi altri valori, ogni vantaggio inizia a svanire ENUM. Soprattutto se si aggiungono i valori dopo che la tabella è già in uso, perché è necessario modificare la struttura della tabella per adattarla.

Qual è il vantaggio di usare un ENUM? Una rappresentazione in forma di stringa del significato del valore. Questo è tutto, per quanto mi riguarda. Quanto prezioso dipende dalla tua applicazione.


4
+1 per menzionare l'unico vero vantaggio: la rappresentazione di stringhe. Tutto il resto è un lavaggio in avanti.
RolandoMySQLDBA,

19

Trovo che ENUM sia una definizione abbreviata di una tabella di codici. Il suo principale vantaggio è che evita il codice richiesto per unirsi e mostrare la descrizione del codice. Facilita inoltre l'impostazione dei valori se arrivano in forma di stringa.

Trovo che abbia i seguenti svantaggi:

  • Nessuna capacità per metadati aggiuntivi sul codice.
  • Difficile aggiungere o disabilitare valori. (La disabilitazione dei codici può essere eseguita con un campo trigger e di scadenza.)
  • I18n nel database non può essere eseguito.
  • Non riutilizzabile su tutti i tavoli.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.