Perché memorizzare flags / enum in un database come stringhe anziché come numeri interi?

21

Ho sfogliato dump SQL di alcuni famosi CMS, tra cui Drupal 7, Wordpress (una versione abbastanza vecchia) e alcune applicazioni personalizzate basate su Python.

Tutti questi dump contenevano dati con flag di stringa invece di quelli interi. Ad esempio, lo stato di un post è stato rappresentato come published , closed o inherit anziché 1 , 2 o 3 .

Ho un'esperienza piuttosto limitata nella progettazione di database e non ho mai passato a SQL semplici, ma mi è sempre stato insegnato che dovrei usare flag numerici / interi per dati come questo. È ovvio che tinyint consuma molto meno spazio in un database rispetto, ad esempio, a varchar(9) .

Quindi cosa mi manca? Non è uno spreco di archiviazione dei dati e una ridondanza dei dati? La navigazione, la ricerca e l'indicizzazione non sarebbero più veloci se queste colonne usassero numeri interi anziché stringhe?

    
posta trejder 21.05.2015 - 11:18
fonte

2 risposte

37

Sì, memorizzare stringhe anziché numeri può utilizzare più spazio. La ragione per cui le pltform di alto profilo lo fanno comunque è che pensano che i benefici di tale soluzione siano superiori al costo.

Quali sono i vantaggi? È possibile leggere facilmente un dump del database e capire di cosa si tratta senza memorizzare le tabelle di enumerazione, e anche le GUI semi-ufficiali potrebbero semplicemente utilizzare i valori stessi piuttosto che trasformare il record che ottengono. (Questa è una forma base di spazio su disco / compromesso del tempo di elaborazione.)

E il costo? La capacità di archiviazione dei dati non è stata il collo di bottiglia di CMS per molto tempo, poiché i dischi sono diventati così grandi e così economici. Il tempo del programmatore, d'altro canto, di solito diventa più costoso, quindi tutto ciò che commercia lo sforzo di sviluppo per lo spazio su disco è anche una buona cosa, dal punto di vista del business.

    
risposta data 21.05.2015 - 11:25
fonte
5

Sì, la memorizzazione di elementi come yes o true richiederà più spazio di un minuscolo. Questo non dovrebbe essere una sorpresa. Inoltre rende l'indicizzazione e quindi rende meno efficiente il database. Ha anche la penalità di una possibile confusione per quale sia il valore corretto ( yes vs y ).

Tuttavia, ci sono molti approcci che sembrano simili all'archiviazione di stringhe nel database (in particolare MySQL) che sono efficienti.

In primo luogo, MySQL ha un tipo enum ( documenti ) che può sembrare molto simile a un set booleano o ristretto di stringhe quando impostato in questo modo. Applica anche solo i valori validi inseriti. Questo è spesso molto più utile della memorizzazione di 1 , 2 o 3 come valore poiché l'informazione che significa è trasmessa. L'enum viene fornito con la penalità che è necessaria una modifica dello schema per aggiungere o rimuovere i tipi.

Questo ci porta a una tabella figlio ea chiavi esterne (applicabile a tutti i database). Sì, stai memorizzando un valore come chiave (torna a 1 , 2 o 3 ) e il valore di published , closed e inherit sono memorizzati in un'altra tabella. Utilizzando una vista ( documenti ) è quindi possibile farlo sembrare come tabella contiene la stringa piuttosto che la chiave. Questo ha il vantaggio che non è richiesta alcuna modifica dello schema per aggiungere o rimuovere le voci dalla tabella figlia.

Il modo esatto in cui le cose vengono archiviate richiederebbe di esaminare il DDL effettivo dello schema per determinare quale metodo viene utilizzato e ottenere qualche suggerimento su quali trade off hanno selezionato.

    
risposta data 21.05.2015 - 22:33
fonte

Leggi altre domande sui tag