За последние 24 часа нас посетили 18660 программистов и 1898 роботов. Сейчас ищут 898 программистов ...

Правильная структура данных для категориий PHP + MYSQL . Деревья и все что с ними связанно

Тема в разделе "PHP для новичков", создана пользователем glorsh66, 1 май 2018.

  1. glorsh66

    glorsh66 Активный пользователь

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    Вопрос обширный. (В данной теме я больше хочу спросить про скорость работы, и какие приемы используются в практике в популярных приложениях)
    Как правильно реализовывать древовидные категории на mysql + php

    Категории такие как (но мне в данном случае больше волнует вопросы организации, чем непосредственно реализация)

    Например как:
    -Электроника
    --Компьютеры
    ---ноутбуки
    ---настольные комптютеры
    --переносные гаджеты
    ---mp3 плеееры
    ---рации

    Задачи по работе с ними стоят следующие:
    1) Функции для обеспечения рабоы с ними (вставлять, удалять)
    2) Получения полного списка (для вывода групп и подгрупп)
    3) Формирование хлебных крошек ( электроника-компьютеры-ноутбуки)
    4) Кри клике на родительскую категорию - получить все товары подкатегорий

    Разобравшись с советами с моей предыдущей темы нашел две хорошие статьи про это -
    http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
    http://www.mysqltutorial.org/mysql-adjacency-list-tree/

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

    Больше всего мне понравилась реализация
    The Nested Set Model


    Но появились вопросы про неё -
    1) Являет ли хорошим тоном использование stored procedure? (они ведь вроде компилятся в mysql каждый раз за сессиию, а маловероятно что пользователей будет несколько операция по изменению данных проводить за сесиию.)
    Нормально ли они работают на shared hosting?
    Так как они для реализации модификации данных предлагают использовать именно их.
    Или лучше это переписать хитрым запросом update? (да и возможно ли это?)

    2) Как проводить оптимизацию вывода полного дерева?
    предположим на главной странице сайта всегда с лева есть полный список категорий, и при наведении мышкой показываются подкатегории, и так далее.
    И я так понимаю что это довольно дорогая операция по выгрузке категорий из базы.
    Это разумное решение хранить всю структуру категорий в JSON файле (менять его при внесении изменений в структуру категорий) или в базе данных в строке JSON
    Или лучшим вариантом будет memcache?
    Как делают более известные движки и ресурсы?

    Как в этом случае реализуется например - количество товаров по категориям?
    Ведь насколько я понимаю вызывать count для всех, при каждом выводе главной стран

    3) Как лучше всего представлять данные в самом PHP?
    Ну например если нам нужно представить все дерево целиком?
    Вложенные массивы?
    Или Вложенные массивы с объектами?

    4) И не маловажный - как реализовывать обход таких структур в PHP?
    Ведь насколько я понял - использование рекурсии красиво выглядит в коде, и проще пишется, но довольно опасно из-за переполнения стека (в случае PHP выходит за границы вложенности функций, который вроде по дефолту стоит в 100?)
    Как обходить деревья без рекурсии?

    5) Или лучше не создавать структуру данных в базе, а преобразоывать плоские данные средствами PHP в дерево?

    Доп вопрос - оправдан ли переход на версию MYSQL 8 для использования MySQL CTE? (стоит ли оно того?) Решает ли оно большинство проблем хранения структур?

    В общем получилось много объемных вопросов. Хочется просто выслушать(вычитать☻) мнения гуру и повысить свой уровень знаний, для того что бы строить велосипеды с более круглыми и менее квадратными колесами.
     
  2. glorsh66

    glorsh66 Активный пользователь

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    Ну может посоветуете какие нибудь хорошие пакеты которые работают с такими данными? Что бы их расковырять и поучиться на их основе, а также может и переменить.
     
  3. glorsh66

    glorsh66 Активный пользователь

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    Апну тему)
    Или может её перенести в другой раздел?☻
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.594
    Симпатии:
    1.764
    Nested Sets на php много раз реализованы и без сохранённых процедур.
    Выгрузка с Nested Sets быстрая, они для того и придуманы были, чтоб выгружать быстро. Всего в один запрос. Вот добавлять заморочно, но с библиотеками норм.
    В базе всегда плоские данные, если база не поддерживает деревья на уровне реализации (MySQL не поддерживает).
    Смотря для чего. Вывод категорий из nested sets я программирую без рекурсии, но с использованием стека (array_push(), array_pop())
     
  5. glorsh66

    glorsh66 Активный пользователь

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    А можете посоветовать библиотеки для работы с nested sets?

    И как с array_push()?
    Пушить в подмассивы?
    --- Добавлено ---
    Я еще не совсем понимаю как можно узнать насколько уровней массив вложен?
    Делать foreach и проверять is_array?
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.594
    Симпатии:
    1.764
    Не надо создавать рекурсивный массив из nested sets. Просто заведи level в таблице с деревом. Дальше попробуй сам - я до этого алгоритма сам дошёл. Я работаю только на фреймворках, поэтому знаю только связанные с фреймворками библиотеки, но гугли.