Questa risposta è per SQL standard ISO/IEC/ANSI e include i migliori SQL pretend-freeware.
Primo problema: hai identificato due categorie, non una, quindi non possono essere confrontate in modo ragionevole.
A. Categoria Uno
(1) (4) e (5) contengono più valori possibili e sono una categoria. Tutto può essere facilmente ed efficacemente utilizzato nella clausola WHERE. Hanno la stessa memoria, quindi né la memoria né le prestazioni di lettura sono un problema. Pertanto la scelta rimanente si basa semplicemente sul tipo di dati effettivo per lo scopo della colonna.
ENUM non standard; il metodo migliore o standard consiste nell'utilizzare una tabella di ricerca; quindi i valori sono visibili in una tabella, non nascosti e possono essere enumerati da qualsiasi strumento di report. Le prestazioni di lettura di ENUM subiranno un piccolo problema a causa dell'elaborazione interna.
B. Categoria Due
(2) e (3) sono due valori elementi: Vero/Falso; Maschio femmina; Morto vivo. Quella categoria è diversa dalla categoria uno. Il trattamento sia nel modello di dati che in ogni piattaforma è diverso. BOOLEAN è solo un sinonimo di BIT, sono la stessa cosa. Legalmente (SQL-saggio) ci sono gestiti lo stesso da tutte le piattaforme compatibili con SQL, e non ci sono problemi nell'utilizzarlo nella clausola WHERE.
La differenza di prestazioni dipende dalla piattaforma. Sybase e DB2 comprano fino a 8 bit in un byte (non che lo storage contenga qui) e mappano la power-of-two al volo, quindi le prestazioni sono davvero buone.Oracle fa cose diverse in ogni versione, e ho visto i modellisti usare CHAR (1) invece di BIT, per superare i problemi di prestazioni. La SM andava bene fino al 2005, ma l'hanno interrotta con il 2008, poiché i risultati sono imprevedibili; quindi la risposta breve potrebbe essere quella di implementarlo come CHAR (1).
Naturalmente, il presupposto è che non si fanno cose stupide come pacchetto di 8 colonne separate in uno TINYINT. Non è solo un grave errore di normalizzazione, è un incubo per i programmatori. Mantieni ciascuna colonna discreta e del tipo di dati corretto.
C. multipli Indicatore & colonne Nullable
Questo non ha nulla a che fare con, ed è indipendente, (A) e (B). Quello che le colonne correggono Datatype è, è separato da quanti ne hai e se è Nullable. Nullable significa (di solito) la colonna è facoltativa. In sostanza non hai completato l'esercizio di modellizzazione o normalizzazione. Le dipendenze funzionali sono ambigue. se completi l'esercizio di Normalizzazione, non ci saranno colonne Nullable, nessuna colonna opzionale; o esistono chiaramente per una relazione particolare, o non esistono. Ciò significa utilizzare la struttura relazionale ordinaria dei sottotipi Supertipo.
Certo, questo significa più tavoli, ma non Null. Enterpise DBMS non ha problemi con più tabelle o più join, è per questo che sono ottimizzati. banche dati normalizzati eseguono molto meglio di quelli denormalizzati o denormalizzato, e possono essere estesi senza "re-factoring'. Si può alleviare l'utilizzo fornendo una visualizzazione per ogni sottotipo.
Se volete maggiori informazioni su questo argomento, guarda Se hai bisogno di aiuto con la modellazione, chiedere a questo question/answer. si prega di una nuova domanda. al vostro livello di interrogatorio, vorrei consigliare che si bastone con 5NF.
D. prestazioni di Null
separatamente, se le prestazioni è importante per te, quindi escludi i valori Null. Ogni colonna Nullable viene archiviata come lunghezza variabile, che richiede un'ulteriore elaborazione per ogni riga/colonna. s usa una gestione "differita" per tali file, per consentire il logging, ecc. per spostare le code pensate senza ostacolare le righe fisse. In particolare, non usare mai colonne di lunghezza variabile (che comprende colonne Nullable) in un indice: che richiede spacchettamento sul ogni accesso.
E. sondaggio
Infine, non vedo il punto in questione essendo un sondaggio. E 'abbastanza giusto che si ottengono risposte tecniche, e anche opinioni, ma i sondaggi sono per gare di popolarità, e la capacità tecnica di responder al SO copre una gamma molto, quindi le risposte più popolari e le risposte più tecnicamente corretto sono a due diversi estremità dello spettro.
Potrebbe includere un link o ulteriori informazioni su come "MS andava bene fino al 2005, ma hanno rotto con 2008, come nei risultati sono imprevedibili" e se si è rotto in 2K8R2 –
@RC. Non ho collegamenti, ho esperienza. Wiki non ne ha ancora sentito parlare. I risultati del contesto specifico sopra, e alcuni altri, non tutti i contesti, sono imprevedibili; se avessi codice che ha funzionato bene nel 2005. Ho pubblicato diverse altre specifiche: rimozione delle pagine di overflow e danneggiamento di tutte le prestazioni sugli indici Clustered, ecc. Sentiti libero di leggerle. Non risolto in Rev 2. Non è possibile che questi elementi vengano corretti fino al Rev 4 almeno. Ci sono voluti MS in 3 anni per fissare il 2005. – PerformanceDBA