Навигация в скрипте каталога сайтов (программ)

Вчера, практически 8 часов мы потратили чтобы понять как сделать фасеты. Грани, в реальной реализации, как они описываются в ряде научных статей.

Не замена, подмена и заплатки, не подобие плоских категорий, а именно появление, приобретение некоторых свойств сохраняя связи (как по горизонтали, так и по вертикали) с другими гранями, которые еще не вышли на 1 план, но в следующем шаге могут.

Грани

Программист, который пишет на php с момента его появления и который внес некоторый вклад в сам php (мне везет на людей) сказал однозначно и категорично: Mysql не предназначено для этого. Совсем.

Тем не менее. Это необходимо сделать. Хорошо. Пусть это будет не совсем гладко, и пусть это будет даже как урезанный вариант полной реализации фасетов, но что-то похожее сделать думаю можно попробовать.

Фиксация изменений на GitHub сохранена, как очередной релиз. Далее, буду заниматься реализаций. Черт побери, мне нужна эта навигация! Серьезно, никогда такого не было, чтобы «проблема» висела так долго.

На GitHub мы смотрели и разбирали некоторые примеры «фасетов». Я имею лицензию на все доступные скрипты от Flynax, Tamaranga, Битрикс и т.д., которые реализуют или пытаются заявить о «фасетном» подходе хоть в чем-то. Мы смотрели. Это не фасеты. В лучшем случае, очень урезанная, ограниченная, с множество условий попытка изобразить их.

В общем, попробую что-то сделать в следующем релизе.

8 Ответов

  1. Реляционные базы данных имеют проблемы с реализаций фасетов?

    1. Да и серьезные, если делать все «правильно».

  1. Изменения необходимы начать делать с инструментов. Пока страницы для визуального обзора открыты: https://agouti.ru/facets/structure

    Работают Темы, Блоги, Разделы (один) а Категорий нет.

    В базе данных необходимо добавить 1 таблицу (можно посмотреть на GitHub) или выполнить следующий запрос:

    CREATE TABLE `facets_types` (
      `type_id` int(11) NOT NULL,
      `type_code` varchar(50) NOT NULL,
      `type_lang` varchar(50) NOT NULL,
      `type_title` varchar(250) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
    
    
    INSERT INTO `facets_types` (`type_id`, `type_code`, `type_lang`, `type_title`) VALUES
    (1, 'topic', 'topic', 'Темы'),
    (2, 'blog', 'blog', 'Блог'),
    (3, 'section', 'section', 'Секция'),
    (4, 'category', 'category', 'Категории');
    
    ALTER TABLE `facets_types`
      ADD PRIMARY KEY (`type_id`),
      ADD UNIQUE KEY `title_UNIQUE` (`type_code`);
    
    ALTER TABLE `facets_types`
      MODIFY `type_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;

    Добавление этой таблицы не повредит, однако делать замену файлов не рекомендуется, если нет четкого понимания, какие изменения внесены и для чего.

    1. Изменения вообще возможно следует делать только от релиза к релизу.

  1. Так, предупредил. ) Дело в том, что изменения действительно большие и сейчас обновлять, можно запутаться, серьезно. Тем не менее обязан написать:

    Удалим 2 поля и добавим связанный уникальный индекс следующими запросами:

    ALTER TABLE `facets`
      DROP `facet_is_web`,
      DROP `facet_is_soft`;
    ALTER TABLE `facets` ADD UNIQUE `unique_index`(`facet_slug`, `facet_type`);

    Готово. )

    По поводу фасетов этих. Допустим, мы находимся тут: web/hi-tech/software/

    Что мы делаем в «плоской схеме», например, в категориях? Мы часто используем или slug или id последнего значения. Чтобы, например, получить «детей». Т.к. там есть что к чему относится и т.д. В фасетах, мы должны на самом деле использовать свойства всей цепочки: web / hi-tech / software. Каждого. В этом огромная разница. Формирование цепочки не идет вложением, пусть и по деревьям, но сочетанием свойств.

    Проще. Отдельные деревья отличаются типом. И работаем.

    1. У них нет вложений, да, интересно.

  1. Каталог начинает приобретать законченный вид, вот так он виден (для персонала):

    Каталог сайтов

    Есть пара важных вопросов, которые достаточно просто решаются в MySQL 8.+ но пока не хотелось бы делать это. Посмотрим, что ещё можно сделать.

    1. Рекурсивные запросы для навигации я так понимаю?