Sto provando a progettare un'applicazione di tipo sondaggio che utilizza le risposte dell'utente per determinare quale dovrebbe essere la domanda successiva. Per ragioni di semplicità, i tipi di domande possono essere sia caselle combinate (hanno una serie di risposte distinte tra cui scegliere) sia immagini (l'utente seleziona un file immagine dal proprio sistema). Richiedo che questo sia basato su database, quindi le domande (e le risposte da cui dipendono) devono essere memorizzate nel database.
Ecco un flusso di domande di esempio:
Cisonodiversicasid'usoinquestoesempio.Inizialmente,l'utenteverrebbepresentatoconladomandaQ1(noncisonoaltredomandevisibiliinquestomomento).Sel'utenterisponde"Sì", sia Q2 che Q10 diventano visibili. Se Q1 è "No", allora Q3 diventa invece visibile. Questo è il caso più semplice.
Un altro scenario comune è mostrato in seguito. Q5, Q6 e Q7 sono tutti mostrati allo stesso tempo. Se l'utente risponde a quelle domande specifiche con "Sì", "Cani" e "Sì", rispettivamente, viene mostrato Q10. In tutti gli altri casi, viene mostrato Q8.
Lo scenario finale è dove due rami portano entrambi alla stessa domanda. Ad esempio, se l'utente risponde a Q8 con "Sì", viene mostrato Q10. Se la risposta è "No", viene mostrato invece Q9 e Q10 viene rivelato solo dopo che l'utente ha risposto a Q9 (con qualsiasi risultato).
Ci può essere una qualsiasi combinazione degli scenari di cui sopra. Inoltre, come puoi vedere, alcune domande possono essere raggiunte da diversi rami diversi (ad esempio, è possibile accedere al Q10 su 3-4 diversi flussi di domande).
Il problema che sto riscontrando è una buona progettazione del database per soddisfare questi requisiti. L'approccio che ho cercato di affrontare è quello di definire una sorta di tabella di ricerca delle dipendenze nel database.
Ecco la struttura generale (semplificata) che ho trovato:
----------
|Question|
----------
QuestionID,
QuestionText
---------------
|QuestionGroup|
---------------
GroupID,
QuestionID
--------------------
|QuestionDependency|
--------------------
ParentGroupID,
ParentGroupValue,
ChildGroupID
L'idea qui è che ogni domanda potrebbe appartenere a uno o più "gruppi", il che significa che una singola risposta potrebbe abilitare più domande contemporaneamente (attivando un solo gruppo). Le tabelle QuestionDependency vengono utilizzate per cercare i gruppi di domande da attivare in base al campo ParentGroupValue. Diamo un'occhiata ad un esempio concreto basato sul flusso di domande campione dall'alto:
(Inquestetabelle,<ans>
significacheladomandahaavutorispostaenonèvuota-puòesserequalsiasialtrovalore.)
Quindi,adesempio,comepuoivederenellatabellaQuestionDependency,unavoltachelerisposteinG1(chehasolounadomanda)sonougualia"Sì", allora G2 (che contiene Q2 e Q10) è abilitato. Altrimenti se la risposta è "No", G3 è abilitato. Analogamente per G5, se le risposte alle domande Q5, Q6 e Q7 sono "Sì", "Cani" e "Sì" rispettivamente (la logica di analisi verrà gestita separatamente, non preoccuparti di ciò), quindi le domande in G8 sono abilitato. In tutte le altre combinazioni (supponendo che ogni domanda sia effettivamente risposta), G6 è invece abilitato.
Il problema con questo approccio è che quando le domande appartengono a più gruppi (come con Q10), non c'è modo di sapere dal codice a quale gruppo è attualmente in fase di accesso. Se l'utente risponde a Q10, sta rispondendo da G2 o G8? Non sono in grado di stabilirlo.
La mia domanda principale è, puoi pensare a un modo migliore per affrontare questo problema? Ho cercato di pensare a una soluzione migliore per diversi giorni ora e questo è, purtroppo, il migliore che ho trovato.