Domanda

Ho una tabella nel mio database che rappresenta DataFields in un modulo personalizzato. Il DataField dà qualche rappresentazione del tipo di controllo che deve essere rappresentato con, e che tipo di valore che dovrebbe assumere. Semplificato si può dire che ho 2 entità in questa tabella - Casella di testo di prendere qualsiasi stringa e Casella di testo prendendo solo i numeri.

Ora ho i diversi valori memorizzati in una tabella separata, che fa riferimento alla definizione DataField. Qual è il modo migliore per conservare il valore dei dati qui, quando l'differisce tipo?

Una possibile soluzione è quella di avere un campo fieldValue tabella attesa per possibile tipo di valore. Ora, questo sarebbe certamente ridondante, ma almeno mi sarebbe ottenere il valore memorizzato nella sua forma corretta - semplificare le query più tardi.

FieldValue
----------
Id
DataFieldId
IntValue
DoubleValue
BoolValue
DataValue
..

Un'altra possibilità è solo immagazzinando tutto come stringa, e la colata presente nelle query. Sto usando Net con NHibernate, e vedo che almeno qui c'è un Projections.Cast che può essere utilizzato per lanciare per esempio stringa a int nella query.

In ogni caso in queste due soluzioni ho bisogno di sapere quale tipo di utilizzo quando si fa la query, ma io so che dal DataField, in modo che non ci sarà un problema.

In ogni caso; Non credo che nessuna di queste soluzioni suoni bene. Sono loro? O c'è un modo migliore?

È stato utile?

Soluzione

Non v'è alcuna terza opzione "magica":. Vostra situazione specifica determina come si desidera procedere

Dalla mia esperienza, una soluzione stringa senso solo con le cose come le impostazioni delle applicazioni. Di solito, non ho bisogno di utilizzare tali dati in query direttamente in modo che non mi preoccupa tanto che è in forma di stringa.

Non sono sicuro, ma sembra essere il caso che si sta estendendo un ente con attributi personalizzati, che suona come si potrebbe desiderare di fare un po 'di elaborazione nel database ad un certo punto. In questo caso, si può anche andare con l'approccio a più colonne e compilare unicamente la colonna con il tipo giusto. Non sarà bella, ma potrebbe semplificare le query.

Come ho detto, dipende da se e che tipo di query è necessario eseguire, che tipo di prestazioni necessarie ecc.

Altri suggerimenti

Tirando l'idea da memorizzazione dei dati multi-tenant, è possibile utilizzare il 'Nome-Pair' valori idea come descritto su MSDN . In qualche modo credo che questo articolo sarà più utile a parte la sezione specifica nota.

In effetti, per rendere questa una soluzione scalabile, è necessario definire i tipi di dati per il modulo personalizzato utilizzando una tabella di metadati in cui si definisce il tipo effettivo di dati che si desidera memorizzare (ad esempio bool, il testo, int , appuntamento). Si può anche considerare la memorizzazione del tipo .NET e dal momento che questo può essere in grado di aiutarti quando si tratta di validazione dell'input ecc Altri dettagli che possono essere memorizzati e sei il nome dei campi come ci si aspetterebbe loro di apparire su il modulo personalizzato. Con questo approccio si costruisce un modulo personalizzato in base ai metadati memorizzati.

Ho usato con successo questo approccio e funziona benissimo. In aggiunta, abbiamo usato anche la tabella dei metadati per definire se il valore atteso per il campo personalizzato viene utente fornito (ad esempio nome, data di nascita) o di un valore di sistema predefinito in drop-downlist (ad esempio un elenco di citye, paesi ). A sostegno di questa, abbiamo una tabella aggiuntiva, che contiene le opzioni per la lista che è collegato di nuovo al tavolo dei metadati.

Se avete solo 2 caselle di testo che l'utente può inserire i valori in, e sarà una stringa o un numero, non si ha realmente bisogno di essere in grado di distinguere tra int e doppio, non puoi semplicemente memorizzarlo tutti come un tipo numerico adatto (a seconda del DB). Che sarebbe buttare giù a solo 2 tipi diversi e quindi una possibile soluzione sarebbe quella di avere 2 tavoli, uno per ciascuno dei due tipi.

In però generale, ogni volta che vedo che è difficile sapere che cosa tipo di dati qualcosa sta per essere mi piacerebbe iniziare preoccupante che il progetto sta cercando di diventare al generico che ha la tendenza a diventare piuttosto confusa.

Prima di offrire mio punto di vista .. direi che potrebbe essere necessario tornare al tavolo da ER. Suppongo che un CustomForm ha molti Campi e che questi Campi sono di diversi tipi (testi, dati, forse anche il comportamento e lo stile), piuttosto che generalizzando il concetto il campo forse vale la pena, invece di prendere in considerazione la creazione di una tabella per ogni tipo di campo. Per esempio. DateField, usernameField, ecc Questo renderà il tipo di valore sia esattamente una colonna non null con il tipo corretto. Vorrei anche scommettere questo semplificherebbe il codice (meno le condizioni per controllare, il db ti dà tutte le informazioni).

Detto questo, non si può essere in grado di tornare al tavolo da ER o ci può essere alla base validi motivi per fare l'approccio più colonne-per-tipo. Qui ci sono alcuni pro e contro di un tale approccio.

Pro

  • tutto in una tabella, possono si rivelano essere più veloce (se ricordate la radice di ogni male è ..)

Contro

  • DB non può far valere che non è specificato più di un valore (codice aggiuntivo per verificare eccezioni)
  • DB non può imporre che almeno uno non è NULL (codice aggiuntivo per verificare la presenza di FieldValues ??senza alcun valore)
  • Supporto aggiuntivo di nuovo tipo di dati richiede la modifica di tutti i dati esistenti (aggiungendo un valore NULL in colonne).

Se si è bloccato con la CustomForm > Il campo -> fieldValue vorrei suggerire la creazione di una tabella per fieldValue . per es.

IntFieldValue
-------------
Id
DataFieldId
Value

DecimalFieldValue
-------------
Id
DataFieldId
Decimal


DateFieldValue
-------------
Id
DataFieldId
Date

Con quanto sopra è comunque possibile creare una vista che seleziona dalle tabelle di cui sopra. La visualizzazione può essere creato per offrire una colonna per tipo di valore e garanzia che uno e solo uno di loro non è NULL. Questo è anche facilmente estensibile (aggiungere una nuova tabella, modificare la vista, ma non richiede di aggiornare i dati esistenti con valori nulli per la nuova colonna tipo).

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