Abbiamo un'app Web in cui gli utenti possono sostenere esami online.
L'amministratore dell'esame creerà un questionario. Un questionario può avere molte domande. Ogni domanda è una domanda a scelta multipla (MCQ).
Diciamo che un amministratore crea un questionario con 10 domande. Gli utenti tentano queste domande. Ora, a differenza degli esami reali, gli utenti possono tentare un singolo questionario più volte. E dobbiamo tenere traccia dei suoi tutti i tentativi.
es.
+-------+-----------------+------------+-------+------------+----------+
|User_id|Questionnaire_id |question_id |answer |attempt_date|attempt_no|
+-------+-----------------+------------+-------+------------+----------+
|1 |1 |1 |a |1 June 2013 |1 |
|1 |1 |2 |b |1 June 2013 |1 |
|1 |1 |1 |c |2 June 2013 |2 |
|1 |1 |2 |d |2 June 2013 |2 |
+-------+-----------------+------------+-------+------------+----------+
Ora può succedere anche che dopo che l'utente abbia tentato due volte lo stesso questionario, admin può cancellare una domanda dallo stesso questionario, ma la cronologia dei tentativi degli utenti dovrebbe comunque fare riferimento a quella in modo che l'utente possa vedere la sua domanda nella sua cronologia dei tentativi in Nonostante l'amministratore, l'eliminazione di quella domanda.
Se l'utente tenta ora questo questionario modificato, dovrebbe vedere solo 1 domanda.
+-------+-----------------+------------+-------+------------+----------+
|User_id|Questionnaire_id |question_id |answer |attempt_date|attempt_no|
+-------+-----------------+------------+-------+------------+----------+
|1 |1 |1 |a |3 June 2013 |3 |
+-------+-----------------+------------+-------+------------+----------+
Inoltre, dopo che questo utente ha modificato una parte della domanda, gli utenti tentano la cronologia dovrebbero mostrare la domanda prima della modifica, mentre ogni nuovo tentativo dovrebbe mostrare la domanda modificata.
Come gestirlo a livello di database?
Il mio primo istinto era quello,
Per le eliminazioni, non eseguire l'eliminazione fisica, basta rendere una domanda inattiva in modo che la cronologia possa ancora tenere traccia degli tentativi degli utenti.
Per le modifiche, crea versioni per domande e ogni nuovo tentativo aggiorna all'ultima versione di ogni domanda e cronologia, facendo riferimento alla versione della domanda al momento del tentativo.