Както винаги:няма най-добро решение. Всяко решение прави различни неща по-лесни или по-трудни. Правилното решение за вас зависи от това коя операция ще извършите най-много.
Наивен подход с идентификатор на родител:
Плюсове:
-
Лесен за изпълнение
-
Лесно преместване на голямо поддърво към друг родител
-
Вложката е евтина
-
Необходими полета, достъпни директно в SQL
Минуси:
-
Извличането на цяло дърво е рекурсивно и следователно скъпо
-
Намирането на всички родители също е скъпо ( SQL не познава рекурсии... )
Променено обхождане на дървото за предварителна поръчка (запазване на начална и крайна точка) :
Плюсове:
-
Извличането на цяло дърво е лесно и евтино
-
Намирането на всички родители е евтино
-
Необходими полета, достъпни директно в SQL
-
Бонус:вие запазвате реда на дъщерните възли и в неговия родителски възел
Минуси:
- Вмъкването/актуализирането може да бъде много скъпо, тъй като може би ще трябва да актуализирате много възли
Запазване на път във всеки възел:
Плюсове:
-
Намирането на всички родители е евтино
-
Извличането на цяло дърво е евтино
-
Вмъкването е евтино
Минуси:
-
Преместването на цяло дърво е скъпо
-
В зависимост от начина, по който запазвате пътя, няма да можете да работите с него директно в SQL, така че винаги ще трябва да го извличате и анализирате, ако искате да го промените.
Маса за затваряне
Плюсове:
-
Лесен за изпълнение
-
Намирането на всички родители е евтино
-
Вмъкването е евтино
-
Извличането на цели дървета е евтино
Минуси:
-
Нуждае се от допълнителна маса
-
Заема много място в сравнение с други подходи
-
Преместването на поддърво е скъпо
Бих предпочел един от последните две, в зависимост от това колко често се променят данните.
Вижте също:http://media.pragprog.com/titles/bksqla/trees. pdf