Yani think Benim sorun iki soru için aşağı kaynar:
Ağaç akılda performansı tutarken komşuluk Listesi Model yaklaşımı kullanarak (iki tablo arasında) MySQL saklanan olduğunda PHP nasıl bir çaprazlanabiliyorsa ağaç yapısı yaratırım?
Kastetmek kod çoğaltma ve if / else ve switch deyimleri ile mantığı çöp olmadan gerekli biçimlerde görüntüleniyor ağaç için bir sürdürülebilir yaklaşım nedir?
Aşağıda detaylar:
Ben Zend Framework kullanıyorum.
Ben bir anket ile çalışıyorum. Soru ve question_groups: Bu iki ayrı tablo arasında bir MySQL veritabanında saklanır. Her tablo uygun Zend_Db_Table_ * sınıfları uzanır. Hiyerarşi komşuluk Listesi Model yaklaşımı kullanılarak temsil edilir.
Ben çalıştırıyorum sorunlar nedeniyle yüzden ben alternatiflere açığım bir RDBMS bir ağaç yapısı doldurma olduğumu aslında muhtemeldir biliyoruz. Ancak, ben de anket cevaplayıcıları ve yanıtları saklamak ediyorum bu yüzden alternatif yaklaşımlar olduğunu desteklemek gerekir.
Anket çeşitli HTML formatlarında görünecek gerekiyor:
- (Zend_Form kullanarak) yanıtları girmek için bir form olarak
- Bağlantılar soru ya da grup tarafından yanıtları görmek için gibi sorulara (ve some grupları) ile (iç içe) sıralı bir liste olarak.
- Her soru eklenen tepkiler ile (iç içe) sıralı bir liste olarak.
Sorular yaprak düğümlerin ve question_groups diğer question_groups ve / veya soruları içerebilir. Kombine, bir işlemek için 100 satır üzerinde küçük ve ekran vardır.
Şu anda, bir question_group çocuklarını almak için özyineleme kullanarak tüm işlemleri yapar bir görünüm yardımcınız var (iki tablo arasında bir UNION gerçekleştiren bir sorgu: QuestionGroup :: getChildren ($ id)). Soru yanıt ile anket görüntülerken artı iki sorgu davalı ve her soruya verdikleri yanıt almak için gereklidir.
Sayfa yükleme süresi olmasa da çok uzun bu yaklaşım yanlış geliyor. Özyineleme artı hemen hemen her düğüm için birden fazla veritabanı sorguları içimde çok sıcak ve bulanık hissediyorum yapmaz.
Ben denedim recursion-less ve tam ağaç dizide özyinelemeli yöntemleri hiyerarşik bir geçiş için dizi ve ekran oluşturmak için BİRLİĞİ döndü. Ancak, bu nedeniyle grupları ve soruları ayrı ayrı tablolarda saklanır aslında düğüm kimlikleri var çoğaltılır beri yıkmak gibi görünüyor. Belki orada bir şey eksik ...
Şu anda, yukarıda listelenen biçimlerde ağacı görüntülemek için mantık oldukça karmaşa. Ben her yerde kastetmek mantığı çoğaltmak için tercih ediyorum. Ancak, her yerde koşul ya en kolay sıçramalı kodu üretemezler. Ben, ziyaretçileri dekoratörler ve PHP SPL Yineleyicilerde bazı kadar okudum ama ben hala nasıl bu olur birlikte Zend_Db_Table, Zend_Db_Table_Rowset ve Zend_Db_Table_Row uzanan sınıfları ile tüm iş. Belirsiz hissediyorum Ben veritabanından hiyerarşisini binanın önceki sorunu çözülmüş değil, özellikle bu yana. Bu biraz kolayca yeni görüntü biçimleri ekleyebilir (ya da mevcut olanları değiştirmek) güzel olurdu.