Visualizzare in modo condizionale domande basate su risposte precedenti in un sondaggio basato su database

2

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.

    
posta Mage Xy 17.05.2016 - 19:20
fonte

2 risposte

2

Innanzitutto, tre osservazioni.

Già coperto da Christophe nella risposta precedente: la tabella che controlla il flusso verso un altro gruppo di domande deve avere l'ID interrogativo come chiave esterna. In caso contrario, le risposte "Sì" o "Cani" non possono essere correlate a una domanda.

Vorrei cambiare la terminologia da "ParentGroup / ChildGroup" a "QuestionGroup / FollowingGroup", perché Parent / Child ha un significato stretto e tecnico che non si applica qui.

La tabella delle dipendenze delle domande non soddisfa le condizioni che riguardano più domande, ad esempio "Se la risposta Q1 è Sì, e la risposta Q2 è" Cani ", vai a G4". Per fare questo dovresti normalizzare questo tavolo in due tabelle:

Flow
FlowID OriginGroup       NextGroup
F1     G1                G2
F2     G1                G4

FlowDependency
FlowID   QID     Value
F2       Q1      Yes
F2       Q2      Dogs

E due ulteriori punti:

Altre possibili risposte Ci sono altre due possibili risposte che potresti aver bisogno di codificare in qualche modo nella tabella QuestionDependency: nessuna risposta e qualsiasi risposta . (Se hai un codice indipendente che applica globalmente una regola "le risposte a tutte le domande sono obbligatorie", allora la prima non verrà applicata).

Nessuna risposta dovrebbe essere codificata come una stringa convenzionale che non sarà mai utilizzata come una vera domanda. In alternativa, potrebbe essere codificato come una riga nella tabella con Valore = NULL, in modo che la risposta a tale domanda non venga mai nemmeno presa in considerazione dal particolare "flusso".

Qualsiasi risposta potrebbe essere codificata come assenza di una riga. Ad esempio, diciamo che c'è un gruppo di domande G1 con domande Q3, Q4, Q5. Se l'utente risponde "Hovercraft" a Q3 e "Eels" a Q4, allora dovrebbero essere reindirizzati al gruppo G4 (che mostra un video Monty Python sugli ungheresi che parlano inglese). Q5 parla del loro cereale per la colazione preferito ed è irrilevante per il flusso tra i gruppi di domande. Questo potrebbe essere codificato come

Group        Question        Value       FollowingGroup
G1           Q3              Hovercraft  G4
G1           Q4              Eels        G4

Il codice che interpreta queste regole corrisponderebbe alle risposte di Q3 e Q4 ai valori nella tabella, non considera affatto Q5 e, poiché trova che tutto corrisponde, indirizza l'utente a G4.

Flusso predefinito Sarebbe molto difficile garantire la copertura di tutte le possibili risposte / combinazioni di risposte: in altre parole, per garantire popolando una tabella QuestionDependency che, qualunque sia la risposta che l'utente dà, vanno da qualche parte quando premono " Il prossimo". Quindi suggerisco che ogni gruppo di domande abbia un "gruppo successivo predefinito" specificato. Se nessuna delle condizioni in QuestionDependency corrisponde, l'utente passa al gruppo successivo predefinito.

    
risposta data 19.05.2016 - 11:21
fonte
1

Modelli di domande o istanze di domande?

La tua domanda mostra un'ambiguità nel modello concettuale:

  • gestisci le istanze delle domande? In questo caso, un QuestionId significa una singola domanda che potrebbe essere innescata da diversi eventi, ma solo una risposta è rilevante, indipendentemente dal modo in cui la attivi. Questo è ciò che suggerisce il tuo modello di dati.
  • gestisci i modelli di domande? In questo caso un QuestionId significa una presentazione della domanda, ma potrebbero essere fornite risposte diverse in diversi contesti. Questo è ciò che suggerisce la tua narrativa.

Nel secondo caso, il tuo modello manca un ID univoco per identificare ogni istanza di domanda. Un modo potrebbe essere utilizzare un ID istanza univoco. Un altro modo sarebbe considerare la combinazione gruppo + modello come ID univoco (implicazione di quest'ultimo approccio: una risposta per Q10 nel gruppo 2, una risposta per Q10 nel gruppo 8, indipendentemente dal fatto che sia stata attivata dalla domanda, 6 o 7 .

Transizione domanda

La tua tabella QuestionDependency sembra non esprimere completamente il tuo grafico iniziale. Quando dici che il valore Sì / Cane / Sì conduce dal gruppo 5 al gruppo 8, è ambiguo. Perché:

  • in primo luogo, è difficile da mantenere (ad esempio se si inserisce una nuova domanda nel gruppo).
  • secondo, nella realtà, la risposta dipende dall'istanza della domanda e questa dipendenza non viene mostrata.

Quindi questa tabella potrebbe essere simile a:

ParentGroup Question  Value     ChildGroup
G1          Q1        Yes       G2
G1          Q1        No        G3
G3          Q3        Orange    G4
G3          Q3        Purple    G5
G5          Q5        Yes       G8
G5          Q6        Dogs      G8
G5          Q7        Yes       G8
...
    
risposta data 17.05.2016 - 20:37
fonte

Leggi altre domande sui tag