Rodzic i dziecko kategorii / typu

2010-01-03 16:44

Jednym z elementów rozbudowanego systemu CRM, nad którym pracuje był wybór typu projektu z podziałem na główny typ oraz podtyp. Można to zrealizować poprzez stworzenie dwóch tabel (typy i podtypy połączone relacją) lub jednej (wykorzystując kolumnę, która będzie przechowywać informację o rodzicu). Oba rozwiązania mają jeden większy problem do rozwiązania, jeśli będziemy chcieli dać wybór pozycji poprzez jedno pole typu <select> trzeba to najpierw posortować. We wpisie skupię się na przykładzie z jedną tabelą.

Zanim przejdę do sedna chciałbym nadmienić, że żadnych struktur drzewiastych na taką drobnostkę nie zamierzałem stosować. Bazujemy tylko i wyłącznie na rodzicu oraz dziecku, nie ma więcej potomków i ten wpis się na tą strukturę zamyka. Kolejna uwaga to w dalszej części posłużę się przykładem bazującym na nazwach: kategoria i podkategoria bo zapewne więcej osób pod takimi nazwami będzie poszukiwać rozwiązania zagadnienia.

Stwórzmy i wypełnijmy danymi przykładową tabelę z kategoriami.

Chcielibyśmy teraz pobrać za pomocą jednego zapytania, nie musząc robić dodatkowych operacji w PHP, posortowane kategorie wraz z podkategoriami według kolumny "ordering", a następnie "name". Czyli uzyskać poniższy wynik (w nawiasach umieszczone są wartości kolumny "ordering", minusy są dodane poza sql poprzez warunek: jeśli (rodzic) dodaj minus).

CMS (10)
- Joomla (1)
- Drupal (2)
- CMS Made Simple (3)
Blog (20)
- Serendipity Weblog System (10)
- Wordpress (20)
Forum (30)
- phpBB 2 (10)
- IPB (20)
- phpBB 3 (20)

Wynik ten udało mi się zrealizować dwoma sposobami. Pierwsze zapytanie opiera się na odpowiednim warunku w ORDER BY.

Natomiast drugie z wykorzystaniem odpowiedniego warunku przy LEFT JOIN w klauzuli FROM.

Pozostałe rzeczy związane z rodzicem i dzieckiem nie powinny przysporzyć problemów, a są to:

  • Przy usuwaniu kategorii głównej sprawdzenie czy nie posiada podkategorii
  • Przy podpinaniu kategorii głównej do innej kategorii głównej sprawdzenie czy nie posiada podkategorii

Słowa kluczowe: PostgreSQL, Techblog, kategorie, podkategorie, potomek, rodzic, sql, artykuł, blog

Projektowanie i tworzenie stron www w PHP5. Opisy i recenzje oprogramowania typu cms, blog, wiki, open source.
Wszelkie prawa zastrzeżone.