0

Oracle データベースに格納された質問ツリーを使用して、データ駆動型のウィザードを実装しようとしています。パフォーマンスの面であまり犠牲にせずにデータベース部分を柔軟にする (つまり、質問の新しいパスを簡単に追加する) ために使用する最適なスキーマは何ですか?

4

1 に答える 1

0

同じテーブルを参照する外部キーを使用してツリー構造を構築できます (よく知られている「豚の耳」関係)。その後、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 を使用して、ツリーのどこまで下がっているかを判断できることに注意してください。これを使用して、データをインデントして構造を示しています。

于 2008-09-18T10:44:23.700 に答える