2012-04-10 8 views
12

Sto tentando di implementare un quiz a scelta multipla e vorrò memorizzare tutte le mie domande e risposte in un database SQLite. Avrò molte domande e per ogni domanda ci saranno 2 o più risposte da mostrare.Memorizzazione di un quiz a scelta multipla in un database - Decidere lo schema

La mia domanda è, come devo archiviare le domande e le risposte in un database? Ho due idee per uno schema (chiave primaria in grassetto)

  1. come (molti a molti)

domande (QuestionID: int, questionString: String, correctAnswerID: int)

risposte (answerID: int, answerString: String)

questions_and_answers (QuestionID, answerID)

2.

domande (QuestionID: int, questionString: String, correctAnswerID: int)

risposte (answerID: int, answerString: String, QuestionID: int chiave esterna)

Non sono sicuro quale sia migliore o se esiste un altro modo?

Forse questions_and_answers potrebbe diventare molto grande e causare lunghi tempi di recupero e problemi di memoria? Poi di nuovo, suppongo che question_and_answers sia indicizzato sulle chiavi primarie. Nel secondo schema, answers verrebbe indicizzato su answerID e non su questionID? il che significa che i tempi di ricerca aumenterebbero in quanto l'intera tabella dovrebbe essere cercata?

Possono esserci ~ 10.000 - 20.000 risposte. (il quiz può essere eseguito su un dispositivo mobile e le domande dovranno essere visualizzate "istantaneamente")

Nota: non mi aspetto che ci sia molta sovrapposizione tra le risposte. Non penso che la quantità di sovrapposizione significhi meno dati memorizzati, considerando lo spazio aggiuntivo richiesto dalla tabella questions_and_answers

+0

È probabile che le risposte siano ripetute su più domande? – Tenner

+0

Ad una ipotesi approssimativa, direi che forse il 30% delle risposte verrà visualizzato in più di una domanda –

risposta

7

Il secondo schema è il migliore, perché modella il dominio effettivo: ogni domanda ha un insieme di risposte. Anche se è possibile "comprimere" i dati memorizzando le risposte duplicate una volta, lo non corrisponde al dominio effettivo.

In fondo alla strada, si desidera modificare le risposte. Con lo schema 1, significa prima cercare se la risposta esiste già. Se esiste, dovresti controllare se alcune domande si basano ancora sulla vecchia risposta. Se non esistesse, dovresti comunque verificare se altre domande si basano su quella risposta, quindi modificare quella risposta o creare una nuova risposta.

Lo schema 1 rende la vita davvero difficile.

Per rispondere alle domande sull'indice, è necessario aggiungere un indice su questionId.Una volta ottenuto questo indice, la ricerca di risposte a una domanda dovrebbe ridimensionarsi.

Ora, su una nota completamente diversa, perché utilizzare un database per questo? Considera di archiviarli come documenti semplici in un formato standard come json. Ogni volta che invii una domanda, quasi sempre vorrai le risposte e viceversa. Invece di eseguire più query, puoi caricare l'intero documento in un unico passaggio.

Se si ha quindi bisogno di una memoria più avanzata (query, ridondanza, ecc.) È possibile passare a un database di documenti come MongoDB o CouchDB.

+0

Ho appena pensato a come eliminerei una domanda e ho realizzato che sarebbe stato molto più difficile sullo schema 1. Lo schema 2 rende di più Sente a me ora! Pensavo di usare un database perché pensavo che sarebbe stato più facile cercare/gestire/archiviare/modificare le domande. Non mi è mai venuto in mente di archiviarli come documenti - pensi che fornirebbe prestazioni sensibilmente migliori? Grazie per la risposta –

+1

Se l'utilizzo dei dati è come mi sarei aspettato, una soluzione basata su documenti potrebbe facilmente migliorare. Una soluzione di documento avrà solo 1 ricerca (il documento), rispetto a (domanda + risposta). –

-1

Sembra stallo (anello circolare) come QuestionID colonna viene indicato come chiave esterna nella risponde tavolo e correctAnswerID colonna viene indicato come chiave esterna nella domande tavolo.

È preferibile creare una colonna di tipo bit nella tabella delle risposte per contrassegnare la risposta corretta e rimuovere la colonna correctAnswerID.

Problemi correlati