Progettazione del database per i campi che dovrebbero essere NOT NULL alla fine, ma potrebbe non avere ancora un valore

7

Ho riscontrato questo problema un numero di volte. Supponiamo di avere un oggetto di grandi dimensioni che desideri archiviare nel database. Forse è un profilo di appuntamenti per un utente e ha 100 campi. Tutti questi 100 campi dovrebbero avere un valore, una volta completato il profilo.

Tuttavia, si vuole evitare di forzare l'utente a inserire tutti i 100 campi in un colpo solo! Forse possono creare il loro profilo sezione per sezione, ma non è considerato "completo" finché tutti i 100 campi non hanno un valore.

Sarebbe bello non consentire a questi campi di essere NULL . Dopotutto, NULL non è un valore valido per loro. Ma se i campi sono NOT NULL , non puoi costruire la riga a capo, salvando alcuni campi ogni volta.

"Soluzioni" che ho usato in passato:

  • Basta rendere i campi nullable. Questo non è eccezionale, perché perdi alcune garanzie di integrità dei dati. Un bug nella tua app porta a dati incoerenti.
  • Dividi i 100 campi in più tabelle. Rendi tutti i campi NOT NULL . Ciò aggiunge complessità alle query e sembra un po 'sbagliato: un profilo completato non dovrebbe avere una riga in una tabella ma non un'altra, ma lo schema DB lo consente.

Quali sono alcuni buoni modi per gestirlo?

    
posta Will 21.09.2017 - 18:02
fonte

4 risposte

8

Due tabelle e una vista

Hanno due tabelle con schemi speculari, che differiscono solo per il nullability delle colonne. Una volta che tutti i dati sono presenti, lo si sposta dalla tabella in sospeso alla tabella completa. Avere una vista che presenta l'unione dei due (lo schema della vista corrisponderà allo schema della tabella in sospeso)

    
risposta data 21.09.2017 - 18:12
fonte
5

È possibile mantenere i campi nullable (o non annullabili, ma consentire il contenuto vuoto / predefinito se applicabile) e aggiungere un altro campo che è un indicatore che indica se tutti i campi sono compilati. Predefinito a 0. Una volta che i campi sono stati compilati con successo e / o soddisfano i criteri da considerare 'terminati', imposta il flag su 1. Ciò semplificherebbe filtrare le query solo sulle voci completate.

    
risposta data 21.09.2017 - 18:33
fonte
5

Che ne dici di memorizzare il profilo di appuntamenti incompleto in qualcosa di semplice, come una tabella chiave / valore in cui l'oggetto profilo grande viene semplicemente serializzato in JSON / XML. Dovrai solo usare il tasto per estrarre il profilo mentre lo stanno modificando pezzo per pezzo, e una volta passate tutte le convalide aziendali, a quel punto, inserirlo nella tua tabella di database normalizzata permanente ed eliminarlo dal tabella chiave / valore "incompleta".

Questo ti offre una separazione netta tra i profili incompleti e completi, inoltre non dovrai mantenere la tabella chiave / valore incompleta se i campi cambiano, dal momento che i dati sono solo serializzati in una singola colonna. Puoi interrogare JSON per le statistiche se davvero ne hai bisogno, probabilmente non sarà così performante come la versione SQL ma dubito che sarà una preoccupazione.

    
risposta data 22.09.2017 - 14:57
fonte
3

Basta renderli nullable

Se puoi ... se non puoi, allora, e solo allora inizia a cercare qualche trucco magico per aggirare questo. Il più semplice dei quali è probabilmente un valore predefinito che si comporterà esattamente come farebbero i valori nulli. Ottieni i dati, verifica la presenza di (null | default) e reagisci di conseguenza.

Se non puoi utilizzare i valori predefiniti, prova una delle alternative complesse proposte qui. Chiediti però, è la complessità aggiunta che vale la pena, contro solo convincere i poteri a renderli semplicemente nulli per cominciare.

Non è perché qualcosa è tecnicamente possibile che sia necessaria una buona idea.

    
risposta data 22.09.2017 - 16:07
fonte

Leggi altre domande sui tag