Intereting Posts

Иерархия «многие-ко-многим» с несколькими родителями – PHP, MySQL

Я пытаюсь создать список книг по категориям по категориям, где каждая книга может принадлежать более чем одной категории, и каждая категория может быть как родительской, так и подкатегорией.

Вот иллюстрация:

JavaScript
Шаблоны JavaScript
Объектно-ориентированный JavaScript

  • Ajax
    Полное руководство Ajax
    Пуленепробиваемый Ajax

  • JQuery
    Изучение jQuery 1.3
    PHP jQuery Cookbook

PHP
PHP в двух словах
PHP jQuery Cookbook

Ajax
Полное руководство Ajax
Пуленепробиваемый Ajax

  • XML
    XML-хаки
    XML-код без излишеств

Как вы видете…

  • Книга «PHP jQuery Cookbook» относится к двум категориям: PHP и jQuery
  • Категория «Ajax» является дочерним элементом JavaScript и родителем XML (но XML не является дочерним элементом JavaScript)

Я разработал таблицы базы данных следующим образом:

BOOK: book_id, book_title CATEGORY: category_id, category_name BOOK_CATEGORY: book_id, category_id CATEGORY_TREE: parent_category_id, child_category_id 

Я прочитал много других вопросов / ответов по иерархическим данным в MySQL, но ничего, что может справиться с этим типом «свободной» иерархии.

Кто-нибудь знает, как настроить список таким образом?

Предполагая, что ваши категории не могут образовывать циклы, например a-> b-> c-> a, ваша структура называется направленным ациклическим графом, который нелегко обрабатывать в SQL, но возможно. Googling, который должен дать некоторые результаты, вы также можете начать здесь: http://www.codeproject.com/KB/database/Modeling_DAGs_on_SQL_DBs.aspx

Если ваш набор данных невелик (<10000), вы можете просто получить все данные в 4 SELECT всех запросах и выполнить все вычисления категории / подкатегории в PHP.

Деревья и реляционные базы данных не сочетаются очень хорошо 🙂

Сделайте все это с помощью php, создайте функцию, которую вы включаете в страницы, таким образом, если что-либо изменится, вам не нужно обновлять таблицу, просто файл, который включает эту функцию.

Я бы создал

 books (book_id, category_id) categories (category_id, parent_category_id, category_name, category_level) 

где category.parent_category_id может быть NULL . Если он равен NULL , тогда category_level будет 0 (из 1, независимо от того, что вы хотите).