NULL o NOT NULL per impostazione predefinita?


41

In MySQL, è meglio consentire sempre valori null a meno che non si sappia che un campo è richiesto o utilizzare sempre a Not Nullmeno che non si sappia che un campo conterrà valori null? O non importa?

So che in alcuni DBMS dicono di usare Not Nullil più possibile perché consentire i null richiede un bit extra (o byte?) Per record per memorizzare lo stato Null.


1
Dovresti consentire NULLse e solo se il NULLvalore ha un'interpretazione per ciò che stai modellando.
jameshfisher,

Risposte:


25

Nella maggior parte dei DB una NOT NULLcolonna sarà più efficiente in termini di dati memorizzati per il motivo indicato, e anche più efficiente per eseguire query e indicizzare, quindi a meno che non si desideri consentire NULL in una colonna, è necessario vietarli esplicitamente.

Ci sarà una leggera implicazione sulle prestazioni, poiché i NOT NULLvincoli extra dovranno essere controllati per ogni riga interessata con qualsiasi INSERT o AGGIORNAMENTO ma poiché la maggior parte dei database sono relativamente chiari in scrittura e in lettura, questo probabilmente non è un problema (il piccolo è improbabile che si verifichino comunque tempi supplementari in quanto si tratta di un'operazione legata alla CPU in cui il resto dell'operazione di inserimento / aggiornamento sarà legato all'IO e quindi un collo di bottiglia molto più significativo) e ti dà un po 'di "libero" "controllo dei dati in modo che il tuo codice (o il codice di altre persone) non possa inserire accidentalmente NULL in cui altri codici non li prevedono e quindi potrebbero dare risultati errati in loro presenza.

Modifica: Come sottolinea Peter nel suo commento, quanto sopra è un generalismo e potrebbe non essere vero per tutti i DMBS, anche se sono abbastanza sicuro che lo faccia per mysql e mssql. Altre complicazioni nell'area potrebbero includere funzionalità come tabelle sparse (come ad esempio MSSQL 2008 implementato) che altereranno la dinamica delle prestazioni delle colonne (non) nullable.


8
Questo non è necessariamente vero in PostgreSQL. Le colonne Null risparmiano spazio, il che può migliorare la velocità e il tempo di elaborazione dovrebbe essere più o meno lo stesso.
Peter Eisentraut,

4
Questo non è vero anche per Oracle. Inoltre, a differenza di MySql, Oracle non indicizza i null, quindi è possibile ridurre le dimensioni degli indici utilizzandoli. Vedi stackoverflow.com/questions/289001/does-mysql-index-null-values
Leigh Riffel

8

Dovresti lasciare che la progettazione dello schema e i requisiti dell'applicazione guidino questa decisione. Le differenze di prestazioni non sono probabilmente evidenti in entrambi i casi nella maggior parte dei casi.


3
Ancora una volta, il modo migliore per sapere con certezza è la profilazione e il testing.
jcolebrand

Starei attento con affermazioni così ampie: se stai scrivendo 10 milioni di righe a notte in una tabella tramite un processo ETL e quella tabella ha un sacco di campi vincolati Not Null, vedrai gli impatti sulle prestazioni.
ScottCher,

1
+1: Forse non è vero per tutte le applicazioni, ma per quello che sto facendo ottenere dati coerenti / corretti è più importante che risparmiare spazio o perdere velocità.
jp
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.