Projektowanie zestawów zagnieżdżonych jest zdecydowanie trudne, gdy musisz dokonywać częstych aktualizacji drzewa. W końcu będziesz musiał zmienić numerację dużych części drzewa.
Jedną z sugestii na złagodzenie tego jest użycie liczb zmiennoprzecinkowych zamiast liczb całkowitych. Jeśli wstawisz nowy węzeł do drzewa, stosunkowo łatwo jest znaleźć kilka liczb FLOAT pomiędzy zagnieżdżonymi zestawami liczb rodzica nowego węzła. Możesz w końcu dojść do granic precyzji liczby zmiennoprzecinkowej, ale ponieważ twoje drzewo nie jest zbyt głębokie, nie stanie się to przez długi czas.
Inną techniką, o której pisałem, nazywam Tabela Zamknięcia . Ta metoda przechowywania hierarchii znacznie ułatwia wstawianie/aktualizowanie/usuwanie węzłów w dużym drzewie bez konieczności aktualizowania dużej części drzewa. I nadal możesz wysłać zapytanie do całego drzewa lub dowolnego poddrzewa w pojedynczym nierekurencyjnym zapytaniu SQL.
Aby dowiedzieć się więcej o tabeli zamknięć, zobacz:
- Jaki jest najbardziej wydajny/elegancki sposób przetworzenia płaskiego stołu na drzewo?
- Modele danych hierarchicznych z SQL i PHP
- Przenoszenie poddrzew w hierarchiach tabel zamknięcia
- Antywzorce SQL:unikanie pułapek programowania baz danych
Odpowiedz na swój komentarz:
Lista sąsiedztwa jest prosta, ma minimalną nadmiarowość i obsługuje relacje FK, czego nie obsługują zestawy zagnieżdżone. Lista sąsiedztwa obsługuje wysyłanie zapytań do całego drzewa o dowolnej głębokości, jeśli używasz zapytań rekurencyjnych . Ale MySQL nie obsługuje zapytań rekurencyjnych.
Jeśli chcesz odpytywać tylko bezpośrednie relacje rodzic-dziecko (tj. jeden poziom głębokości) lub w inny sposób odpytywać tylko drzewa o stałej głębokości, lista sąsiedztwa jest w porządku.