具有多个父级的多对多层次结构-PHP、MySQL

具有多个父级的多对多层次结构-PHP、MySQL,php,mysql,hierarchy,categories,Php,Mysql,Hierarchy,Categories,我正在尝试按类别创建一个技术书籍列表,其中每本书可以属于多个类别,并且每个类别都可以是父类别和子类别 下面是一个例子: JavaScript JavaScript模式 面向对象JavaScript Ajax Ajax权威指南 防弹阿贾克斯 jQuery 学习jQuery 1.3 PHP jQuery食谱 PHP PHP简而言之 PHP jQuery食谱 Ajax Ajax权威指南 防弹阿贾克斯 XML XML黑客 无意义的XML -- 正如你所看到的 《PHP jQuery食谱》一书分

我正在尝试按类别创建一个技术书籍列表,其中每本书可以属于多个类别,并且每个类别都可以是父类别和子类别

下面是一个例子:

JavaScript
JavaScript模式
面向对象JavaScript

  • Ajax
    Ajax权威指南
    防弹阿贾克斯

  • jQuery
    学习jQuery 1.3
    PHP jQuery食谱

PHP
PHP简而言之
PHP jQuery食谱

Ajax
Ajax权威指南
防弹阿贾克斯

  • XML
    XML黑客
    无意义的XML
--

正如你所看到的

  • 《PHP jQuery食谱》一书分为两类: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中层次结构数据的其他问题/答案,但是没有任何东西可以处理这种“松散”的层次结构


有人知道如何以这种方式设置列表吗?

如果您的数据集很小(使用php完成所有操作,请创建一个包含在页面中的函数,这样如果有任何更改,您就不必更新表,只需更新包含该函数的文件。

我会创建

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

其中
category.parent\u category\u id
可以是
NULL
。如果它是
NULL
,则
category\u level
将是0(1的1个,任意).

假设您的类别不能形成循环,如a->b->c->a,则您的结构称为有向无环图,这在SQL中不容易处理,但有可能。谷歌搜索应该会给出一些结果,您也可以从这里开始:

给它起个名字肯定很有帮助,谢谢。这似乎是一个常见的问题——在PHP/MySQL中没有更直接的方法来处理它,这让人沮丧。