L'implementazione di un "20 Domande" -come il mago in un Database
-
09-06-2019 - |
Domanda
Sto cercando di implementare un data-driven guidata con la domanda albero memorizzati in un database Oracle.Qual è il miglior schema da utilizzare per fare la parte del database flessibile (cioèe ' facile aggiungere nuovi percorsi di domande, senza sacrificare troppo in termini di prestazioni?
Soluzione
Si può costruire una struttura ad albero utilizzando una chiave esterna che fa riferimento alla stessa tabella ("maiale orecchio" relazione, come è spesso conosciuto).Quindi è possibile utilizzare la CONNESSIONE DALLA sintassi per attraversare l'albero.Ecco un semplice esempio:
SQL> create table qs
2 ( q_id integer primary key
3 , parent_q_id integer references qs
4 , parent_q_answer varchar2(1)
5 , q_text varchar2(100)
6* );
Table created.
SQL> insert into qs values (1, null, null, 'Is it bigger than a person?');
1 row created.
SQL> insert into qs values (2, 1, 'Y', 'Does it have a long neck?');
1 row created.
SQL> insert into qs values (3, 2, 'Y', 'It is a giraffe');
1 row created.
SQL> insert into qs values (4, 2, 'N', 'It is an elephant');
1 row created.
SQL> insert into qs values (5, 1, 'N', 'Does it eat cheese?');
1 row created.
SQL> insert into qs values (6, 5, 'Y', 'It is a mouse');
1 row created.
SQL> insert into qs values (7, 5, 'N', 'It is a cat');
1 row created.
SQL> commit;
Commit complete.
SQL> select rpad(' ',level*4,' ')||parent_q_answer||': '||q_text
2 from qs
3 start with parent_q_id is null
4 connect by prior q_id = parent_q_id;
RPAD('',LEVEL*4,'')||PARENT_Q_ANSWER||':'||Q_TEXT
------------------------------------------------------------------------------------------------------------------------------
: Is it bigger than a person?
Y: Does it have a long neck?
Y: It is a giraffe
N: It is an elephant
N: Does it eat cheese?
Y: It is a mouse
N: It is a cat
7 rows selected.
Nota come il di speciale a LIVELLO di parola chiave può essere utilizzata per determinare quanto in basso l'albero ci sono, che ho poi utilizzato per trattino i dati per mostrare la struttura.