Prima di tutto, smetti di usare la frase "Valore Nullo", ti porterà fuori strada. Invece, usa la frase "marcatore null" - un marcatore in una colonna che indica che il valore effettivo in questa colonna è mancante o inapplicabile (ma nota che il marcatore non dice quale di queste opzioni è effettivamente il caso¹).
Ora, immagina quanto segue (in cui il database non ha una conoscenza completa della situazione modellata).
Situation Database
ID Code ID Code
-- ----- -- -----
1 A 1 A
2 B 2 (null)
3 C 3 C
4 B 4 (null)
La regola di integrità che stiamo modellando è "il codice deve essere unico". La situazione del mondo reale viola questo, quindi il database non dovrebbe consentire a entrambi gli elementi 2 e 4 di essere nella tabella contemporaneamente.
L'approccio più sicuro e meno flessibile sarebbe quello di non consentire marcatori null nel campo Codice, quindi non vi è alcuna possibilità di dati incoerenti. L'approccio più flessibile sarebbe quello di consentire più marcatori null e preoccuparsi dell'unicità quando vengono inseriti i valori.
I programmatori Sybase hanno seguito l'approccio un po 'sicuro e non molto flessibile di consentire solo un marcatore null nella tabella - qualcosa che i commentatori si sono lamentati da allora. Microsoft ha continuato questo comportamento, immagino per la retrocompatibilità.
¹ Sono sicuro di aver letto da qualche parte che Codd ha considerato l'implementazione di due marcatori null - uno per sconosciuto, uno per inapplicabile - ma l'ho rifiutato, ma non riesco a trovare il riferimento. Ricordo bene?
PS La mia citazione preferita su null: Louis Davidson, "Progettazione di database di SQL Server 2000 professionale", Wrox Press, 2001, pagina 52. "In poche parole: NULL è cattivo".