2008-09-02 19 views
0

Oracle veritabanında saklanan soru ağacına sahip bir veri güdümlü sihirbaz uygulamak istiyorum. Veri tabanı bölümünü esnek hale getirmek için (yani soruların yeni yollarını eklemeyi kolaylaştırmak) performans açısından çok fazla fedakarlık etmeden kullanmak için en iyi şema hangisidir?Bir Veritabanında '20 Soruları Benzeyen Sihirbazı Uygulamak

cevap

0

Aynı tabloya başvuran bir yabancı anahtar kullanarak bir ağaç yapısı oluşturabilirsiniz (genellikle "domuz kulağı" ilişkisi). Daha sonra ağacı çaprazlamak için CONNECT BY sözdizimini kullanabilirsiniz. İşte basit bir örnek: özel anahtar kelime SEVİYE belirlemek için nasıl kullanılabileceğini

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. 

Not ne kadar Sonra yapısını göstermek için verileri girinti için kullanmış olduğumuz ağacın, aşağı.