Мои предупреждения о вложенных наборах для наборов иерархических данных произвольной глубины: хорошо или плохо?

При воссоздании моей CMS мне нужна была альтернатива традиционному подходу родитель / потомок для управления иерархией карты сайта / страницы. Я вспомнил, что некоторое время назад видел модель вложенного множества, но не мог вспомнить, как она называлась. Итак, я наткнулся на похожий подход, который я хочу оценить и сравнить свойства, чтобы убедиться, что я не столкнусь с тупыми ограничениями позже, потому что я не использовал то, что уже проверено временем. Итак, пожалуйста, сообщите, А) это уже изобретено (как это называется ?!), Б) есть ли фундаментальные недостатки в свойствах, или В) это хороший подход (пожалуйста, дайте хорошее обоснование!).

Обратите внимание на этот список:

  • Дом
    • О нас
    • Свяжитесь с нами
    • Товары
      • Одежда
      • Книги
      • Электроника
    • База знаний
    • Прочее

Я полагаю, что в рамках модели вложенных множеств вы храните дескрипторы левого / правого для каждого узла с обходом в глубину:

Home                  1-18
    About Us          2-3
    Contact Us        4-5
    Products          6-13
        Clothing      7-8
        Books         9-10
        Electronics  11-12
    Knowledge Base   14-15
    Other stuff      16-17

И вот мой "неправильный путь", который я начинаю любить больше:

Home                  1-9
    About Us          2-2
    Contact Us        3-3
    Products          4-7
        Clothing      5-5
        Books         6-6
        Electronics   7-7
    Knowledge Base    8-8
    Other stuff       9-9

Вместо пары левая / правая я храню ID и LAST_CONTAINED_ID. Я обнаружил, что многие свойства одинаковы (или очень похожи):

  • Корневой узел имеет ID = 1
  • Для «листьев» оба свойства равны, а для ветвей - нет
  • общее количество "подузлов" для любого данного узла составляет LAST_CONTAINED_ID - ID
  • Все содержащиеся узлы имеют идентификатор> ID контейнера, но <= LAST_CONTAINED_ID контейнера <= LAST_CONTAINED_ID
  • Узлы-предки имеют идентификатор = дочерний ID
  • Глубина - это СУММА узлов-предков

Кроме того, ID служит уникальным идентификатором, зависящим от порядка (без пробелов!). Мне также было проще хранить ссылки DEPTH и PARENT для простоты, но, насколько я понимаю, это почти то же самое и для вложенных наборов.

Итак, считается ли это вложенным набором? И это уже распространенный подход (но почему я не слышал о нем раньше ...)? Есть ли веская причина, почему я должен использовать настоящий вложенный набор поверх этого?

Я приветствую ваши мысли.

7
задан landons 15 November 2011 в 13:26
поделиться