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:
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,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.:
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.