Реализация мастера «20 вопросов» в базе данных

StackOverflow https://stackoverflow.com/questions/39777

  •  09-06-2019
  •  | 
  •  

Вопрос

Я хочу реализовать мастер, управляемый данными, с деревом вопросов, хранящимся в базе данных Oracle. Какую схему лучше использовать, чтобы сделать часть базы данных гибкой (то есть легко добавлять новые пути вопросов), не жертвуя при этом слишком высокими показателями производительности?

Это было полезно?

Решение

Вы можете построить древовидную структуру, используя внешний ключ, который ссылается на ту же таблицу (отношение "ухо свиньи", как это часто известно). Затем вы можете использовать синтаксис CONNECT BY для обхода дерева. Вот простой пример:

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.

Обратите внимание, как специальное ключевое слово LEVEL можно использовать для определения того, насколько далеко мы находимся в дереве, которое я затем использовал для отступа данных, чтобы показать структуру.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top