Penso che le colonne nullable dovrebbero essere evitate. Ovunque la semantica del dominio rende possibile utilizzare un valore che indica chiaramente i dati mancanti, dovrebbe essere utilizzato al posto di NULL.
Ad esempio, immaginiamo una tabella che contenga un campo Comment
. La maggior parte degli sviluppatori posizionerebbe un NULL qui per indicare che non ci sono dati nella colonna. (E, si spera, un vincolo di controllo che non consente le stringhe di lunghezza zero in modo che abbiamo un ben noto "valore" per indicare la mancanza di un valore.) Il mio approccio è in genere il contrario. La colonna Comment
è NOT NULL
e una stringa di lunghezza zero indica la mancanza di un valore. (Uso un vincolo di controllo per garantire che la stringa di lunghezza zero sia realmente una stringa di lunghezza zero e non spazi bianchi.)
Quindi, perché dovrei farlo? Due motivi:
NULL
s richiedono una logica speciale in SQL e questa tecnica evita questo.
- Molte librerie sul lato client hanno valori speciali per indicare
NULL
. Ad esempio, se si utilizza ADO.NET di Microsoft, la costante DBNull.Value
indica un valore NULL e si deve verificarlo. L'utilizzo di una stringa di lunghezza zero su una colonna NOT NULL
elimina la necessità.
Nonostante tutto ciò, ci sono molte circostanze in cui gli NULL
vanno bene. In realtà, non ho obiezioni al loro uso nello scenario sopra, anche se non sarebbe il mio modo preferito.
Qualunque cosa tu faccia, sii gentile con quelli che useranno i tuoi tavoli. Essere coerente. Consentire loro di SELECT
con fiducia. Lasciami spiegare cosa intendo con questo. Recentemente ho lavorato a un progetto il cui database non è stato progettato da me. Quasi ogni colonna era annullabile e non aveva vincoli. Non c'era coerenza su ciò che rappresentava l'assenza di un valore. Potrebbe essere NULL
, una stringa di lunghezza zero, o anche un mucchio di spazi, e spesso lo era. (Come che la minestra di valori arrivato, non lo so.)
immaginare il codice di brutto uno sviluppatore deve scrivere per trovare tutti i record con un Comment
campo mancante in questo scenario:
SELECT * FROM Foo WHERE LEN(ISNULL(Comment, '')) = 0
Sorprendentemente ci sono sviluppatori che lo considerano perfettamente accettabile, anche normale, nonostante le possibili implicazioni in termini di prestazioni. Meglio sarebbe:
SELECT * FROM Foo WHERE Comment IS NULL
O
SELECT * FROM Foo WHERE Comment = ''
Se la tabella è progettato correttamente, queste due istruzioni SQL può essere invocata per produrre dati di qualità.
Se lo schema del DB è ancora in evoluzione e vengono aggiunte nuove colonne, potrebbe essere più semplice rendere le nuove colonne nulle all'inizio che possono significare molti null se ci sono molte colonne aggiunte alle tabelle all'interno del DB . Sembra essere dove li vedrei spuntare fuori. –