Metoda I

W pierwszej metodzie o jakiej będę mówił, polega na przechowywaniu w jednej tabeli infomacji nazwy, opisu oraz innych parametrów, jak i powiązania z pomiędzy poszczególnymi elementami.

Tworzymy tabelę za pomocą poniższego kodu:

CREATE TABLE tree (
id SERIAL PRIMARY KEY,
tree_id INTEGER,
nazwa VARCHAR(128) NOT NULL
);
ALTER TABLE tree
ADD CONSTRAINT fk_tree_id FOREIGN KEY (tree_id) REFERENCES tree(id);

Po utworzeniu tabli wstawiamy kolejno poszczególne elementy:

INSERT INTO tree (id,nazwa) VALUES (1,'Kategoria główna');
INSERT INTO tree (id,tree_id, nazwa) VALUES(2,1,'Kat 1');
INSERT INTO tree (id,tree_id, nazwa) VALUES(3,2,'Kat 1.1');
INSERT INTO tree (id,tree_id, nazwa) VALUES(4,2,'Kat 1.2');
INSERT INTO tree (id,tree_id, nazwa) VALUES(5,1,'Kat 2');
INSERT INTO tree (id,tree_id, nazwa) VALUES(6,5,'Kat 2.1');
INSERT INTO tree (id,tree_id, nazwa) VALUES(7,5,'Kat 2.2');
INSERT INTO tree (id,tree_id, nazwa) VALUES(8,5,'Kat 2.3');
INSERT INTO tree (id,tree_id, nazwa) VALUES(9,6,'Kat 2.1.1');
INSERT INTO tree (id,tree_id, nazwa) VALUES(10,6,'Kat 2.1.2');
INSERT INTO tree (id,tree_id, nazwa) VALUES(11,1,'Kat 3');

Metoda ta jak widzimy jest banalna w implementacji. Wystarczy jedna tabela i działa :-). Zauważmy jeszcze, że taka konstrukcja pozwala na nieograniczony poziom zagnieżdżenia drzewa. Aby wyszukać dodatkową kategorię wystarczy zrobić prostego selekta, np.:

SELECT tree_id FROM tree WHERE id=9;

Problem w przypadku takiej struktury pojawia się w momencie, gdybyśmy chcieli wyświetlić całą strukturę bądź ścieżkę do jakiegoś elementu. Oczywiście w przypadku Oracle nie powinno to przysporzyć większego problemu. Natomiast dla np.: Postgresa, czy MySQL`a może się pojawić tutaj problem. W celu wyświetlenia pełnej ścieżki trzeba właściwie pobrać pełną strukturę i rekurensyjnie przeglądać tablicę, albo (czego nie polecam ze względów wydajnościowych) odpytywać się rekurencyjnie bazy danych od poszczególnych rodziców.

Wyobraźmy sobie oprogramowanie prosedury wyświetlającej tego typu ścieżkę:
Kategoria główna » Kat 2 » Kat 2.1 » Kat 2.1.1

Na kolejne schody natkamy się, chcąc wyszukać wszystkie np.: artykuły, z jakiejść kategorii oraz wszystkich dziedziczących po niej. I znowu wszystko będzie sprowadzało się do rozwiązań z wykorzystaniem rekurencji. Szczerze mówiąc nie chyba od razu bym zwątpił, gdyby ktoś mi kazał napisać obsługę takiego ustrojstwa. Jednym słowem życzę powodzenia.