Иерархия «многие ко многим» с несколькими родителями - PHP, MySQL - PullRequest
4 голосов
/ 25 апреля 2011

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

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

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

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

  • JQuery
    Обучение jQuery 1.3
    PHP jQuery Cookbook

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

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

  • XML
    XML Hacks
    Нонсенс 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, но ничего такого, что могло бы справиться с такой "свободной" иерархией.

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

Ответы [ 4 ]

3 голосов
/ 25 апреля 2011

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

0 голосов
/ 25 апреля 2011

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

0 голосов
/ 25 апреля 2011

Я бы создал

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, что вы хотите).

0 голосов
/ 25 апреля 2011

Если ваш набор данных небольшой (<10000), то вы можете просто получить все данные в 4 ВЫБРАТЬ все запросы и выполнить все вычисления категорий / подкатегорий в PHP. </p>

Деревья и реляционные базы данных не идутвместе очень хорошо :) 1003 *

...