Domanda

Sì, un'altra domanda NULL vs stringa vuota.

Sono d'accordo con l'idea che NULL significa non impostato, mentre stringa vuota significa "un valore che è vuoto". Ecco il mio problema: se il valore predefinito per una colonna è NULL, come posso consentire all'utente di inserire quel NULL.

Supponiamo che un nuovo utente sia creato su un sistema. C'è un campo nome e cognome; il cognome è richiesto mentre il nome no. Durante la creazione dell'utente, la persona vedrà 2 input di testo, uno per primo e uno per ultimo. La persona sceglie di inserire solo il cognome. Il nome non è tecnicamente impostato. Durante l'inserimento controllo la lunghezza di ciascun campo, impostando tutti i campi che sono vuoti su NULL.

Quando guardo il database, vedo che il nome non è impostato. La domanda che mi viene subito in mente è che forse non hanno mai visto il campo del nome (cioè a causa di un errore). Ma non è così; se ne sono andati vuoti.

Quindi, la mia domanda è, come si decide quando un campo deve essere impostato su NULL o una stringa vuota quando si riceve l'input dell'utente? Come fai a sapere che l'utente desidera che il campo non venga impostato senza rilevare lo stato attivo o se ha eliminato un valore ... o ... o ...?

Domanda correlata: Dovrei usare NULL o una stringa vuota per rappresentare nessun dato nella colonna della tabella?

È stato utile?

Soluzione

Non uso quasi mai NULL quando mi riferisco ai dati reali. Se utilizzato per chiavi esterne, direi che NULL è valido, ma non è quasi mai valido per i dati immessi dall'utente. L'unica eccezione che verrebbe probabilmente presentata abbastanza regolarmente è per le date che non esistono, come un database dei dipendenti con un "quotation_date" campo. In tal caso, tutti gli attuali dipendenti dovrebbero avere un valore NULL in quel campo. Per far sì che inseriscano effettivamente un valore null, per i valori che richiedono veramente un valore null, metterei una casella di controllo accanto al campo di input in modo che l'utente possa selezionarlo e disattivarlo per vedere il valore corrispondente su null (o in un modo più user friendly, nessuno). Quando si abilita la casella di controllo per impostare il campo su null, la casella di testo corrispondente deve essere disabilitata e, se un valore null è già associato, dovrebbe iniziare come disabilitato e diventare attivo solo quando l'utente deseleziona la casella di controllo null.

Altri suggerimenti

Romperò lo schema e dirò che userò sempre NULL per stringhe di lunghezza zero, per i seguenti motivi.

  1. Se inizi a tagliare le implicazioni degli spazi vuoti, devi assicurarti in qualche modo che ogni altro sviluppatore legga e scriva allo stesso modo.

  2. Come lo alfabetizzi?

  3. Puoi determinare in modo inequivocabile quando un utente ha omesso di inserire un valore, rispetto a lasciarlo intenzionalmente in bianco?

  4. Come chiederesti inequivocabilmente la differenza? Un utente della schermata di query può indicare NULL o vuoto utilizzando la sintassi del modulo di input standard?

  5. In pratica, non mi è mai stato proibito leggere e scrivere dati usando un comportamento predefinito e non sorprendente usando questa regola. Se ho avuto bisogno di conoscere la differenza, ho usato un campo booleano (che è più facile mappare su dispositivi UI non ambigui). In un caso, ho usato un trigger per applicare True = > valore nullo, ma non l'ho mai visto invocato perché il livello BR ha filtrato la condizione in modo efficace.

Se l'utente fornisce una stringa vuota, la considero sempre nulla dal punto di vista del database. Inoltre, in genere taglierò i miei input di stringa per rimuovere gli spazi iniziali / finali e quindi controllare se sono vuoti. È una piccola vittoria nel database con tipi varchar () e riduce anche i casi di ricerca poiché devo solo controllare name is null invece di name is null o name = '' Potresti anche andare dall'altra parte, convertendo null in "". Ad ogni modo, scegli un modo e sii coerente.

Quello che devi fare è capire quale comportamento vuoi. Non esiste algebra fissa di come vengono interpretate le stringhe di nomi.

Pensa alla macchina a stati qui: hai campi che hanno diversi stati: si diminuisce come se stessi pensando a uno stato di "unitializzato", un altro di "vuoto intenzionalmente" e un terzo con un certo valore impostato. TUTTO ciò che fai che compie quel compito ed è coerente con il resto del tuo programma sarà trovato; sembra che la mappatura semplice sia

NULL & # 8594;
inizializzata & Quot; " & # 8594; volutamente disinserito
un nome & # 8594; inizializzato.

Cerco di semplificare le cose. In questo caso, renderei la colonna del nome non annullabile e consentirei gli spazi. Altrimenti, avrai tre casi da affrontare ovunque ti riferisca a questo campo:

  1. Nome vuoto
  2. Nome null
  3. Nome non vuoto

Se vai con 'vuoto è nullo' o 'null è vuoto', sei in due casi. Due casi sono meglio di tre.

Per rispondere ulteriormente alla tua domanda: l'utente che inserisce i dati probabilmente non (e non dovrebbe) sapere nulla di ciò che un " null " è e come si confronta con un "vuoto". Questo problema dovrebbe essere risolto in modo chiaro e coerente nel sistema, non nell'interfaccia utente.

Mentre il tuo esempio è principalmente per le stringhe, mi piace dire che uso null per campi numerici e booleani. Un saldo contabile di 0 è molto diverso da me come nullo. Lo stesso vale per i booleani, se le persone effettuano un test a scelta multipla con risposte vere e false, è molto importante sapere se qualcuno ha risposto vero o falso o non ha risposto affatto. Non usare null in questi casi mi richiederebbe di avere una tabella aggiuntiva o una configurazione diversa per vedere se qualcuno ha risposto a una domanda. Ad esempio, potresti utilizzare -1 per non compilare 0 per falso e 1 per vero, ma poi stai usando un campo numerico per qualcosa che è essenzialmente un valore booleano.

Non ho mai avuto un uso per un valore NULL nel codice di produzione. Una stringa vuota è un valore sentinella eccellente per un campo nome vuoto, un numero di telefono o un reddito annuale per qualsiasi applicazione. Detto questo, sono sicuro che potresti trovarci un po 'utile, ma penso solo che sia abusato. Se dovessi utilizzare un valore NULL, tuttavia, immagino che lo userei ovunque voglio rappresentare un valore vuoto.

Ho sempre usato NULL per valori non inizializzati, vuoto per valori volutamente vuoti e 0 per indicatori off.

In questo modo tutto il tempo, è lì anche se non lo sto usando, ma non devo fare nulla di diverso se ho bisogno di quella distinzione.

Di solito sto testando empty () , ma a volte controllo isset () che valuta false su NULL . Questo è utile per i promemoria per rispondere ad alcune domande. Se è vuoto , false o 0 , alla domanda viene data risposta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top