Dynamic Data-entry memoria dei valori
-
05-10-2019 - |
Domanda
Sto creando un'applicazione di data-entry, dove gli utenti sono autorizzati a creare lo schema di entrata.
La mia prima versione di questo appena creato una sola tabella per ogni schema voce con ogni voce che abbracciano un unico o più colonne (per i tipi complessi) con il tipo di dati appropriato. Questo ha permesso di "fast" interrogazione (su piccoli gruppi di dati, come non l'ho fatto tutte le colonne di indice) e semplice la sincronizzazione in cui è stato distribuito il data-entry su diversi database.
Io non sono abbastanza contento di questa soluzione però; L'unica cosa positiva è la semplicità ... Posso memorizzare solo un numero fisso di colonne. Ho bisogno di creare indici su tutte le colonne. Ho bisogno di ricreare la tabella a modifiche dello schema.
Alcuni dei miei criteri di progettazione sono:
- molto veloce l'esecuzione di query (Utilizzando un semplice dominio specifico linguaggio di query)
- Scrive non deve essere veloce
- Molti utenti simultanei
- Gli schemi cambierà spesso
- Gli schemi potrebbe contenere molte migliaia di colonne
- I dati-voci potrebbe essere distribuito e ha bisogno di sincronizzazione.
- Preferibile MySQL e SQLite -. Database come DB2 e Oracle è fuori questione
- Uso .Net / Mono
Ho pensato di un paio di possibili disegni, ma nessuno di loro sembra una buona scelta.
Soluzione 1:. Unione come tabella contenente una colonna Tipo e una colonna Null per ogni tipo
Si evita così entra a far parte, ma sarà sicuramente usare un sacco di spazio.
Soluzione 2: Tasto / memoria dei valori. Tutti i valori vengono memorizzati come stringa e convertiti in caso di necessità.
Anche utilizzare un sacco di spazio, e, naturalmente, odio dover convertire tutto in una stringa.
Soluzione 3:. Utilizzare un xml valori di database o memorizzare in formato XML
Senza alcuna esperienza vorrei che questo sia abbastanza lento (almeno per il modello relazionale a meno che non ci sia qualche ottimo supporto XPath). Mi piacerebbe anche al fine di evitare un database XML come altre parti le crisi migliore applicazione come un modello relazionale, e di essere in grado di unire i dati è utile.
Non posso fare a pensare che qualcuno ha risolto (alcuni dei) questo già, ma sono in grado di trovare qualsiasi cosa. Non del tutto sicuro di cosa cercare o ...
So che la ricerca di mercato sta facendo qualcosa di simile per i loro questionari, ma ci sono alcune implementazioni open source, e quelli che ho trovato non abbastanza in forma il conto.
PSPP ha molto della logica che sto pensando di; tipi primitivi colonna, più colonne, molte righe, interrogazione veloce e fusione. Peccato che non funziona con un database .. E naturalmente ... non ho bisogno il 99% delle funzionalità fornite, ma un sacco di roba non incluso.
Non sono sicuro che questo è il posto giusto per fare una domanda simile correlato disegno, ma spero che qualcuno qui ha alcuni suggerimenti, conoscere di qualsiasi lavoro esistente o mi può puntare a un posto migliore per fare una domanda simile.
Grazie in anticipo!
Soluzione
Avete già considerato la soluzione più banale: avere una tabella per ciascuno dei vostri tipi di dati e memorizzare lo schema del set di dati nel database. soluzione più semplice:
DATASET Table (Virtual "table")
ID - primary key
Name - Name for the dataset/table
COLUMNSCHEMA Table (specifies the columns for one "dataset")
DATASETID - int (reference to Dataset-table)
COLID - smallint (unique # of the column)
Name - varchar
DataType - ("varchar", "int", whatever)
Row Table
DATASETID
ID - Unique id for the "row"
ColumnData Table (one for each datatype)
ROWID - int (reference to Row-table)
COLID - smallint
DATA - (varchar/int/whatever)
Per richiedere un set di dati (una tabella virtuale), è necessario quindi costruire dinamicamente un'istruzione SQL utilizzando le informazioni sullo schema nella tabella COLUMNSCHEMA.