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!

È stato utile?

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.

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