it-swarm.it

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

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

È meglio che il tipo di dati di questa colonna sia int/bool (1 o zero) o che usi ENUM con i valori che sono enabled e 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?

117
Jake Wilson

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

Anche senza l'articolo, lo so

73
RolandoMySQLDBA

Bene, prima di tutto abbiamo il 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 spostarsi da 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.

39
Derek Downey

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 anche 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.
20
BillThor