多父的多对多层次结构- PHP, MySQL


Many-to-Many Hierarchy with Multiple Parents - PHP, MySQL

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

这里有一个例子:

JavaScript


JavaScript模式
面向对象的JavaScript

    Ajax

  • Ajax权威指南
    防弹Ajax

  • jQuery

  • 学习jQuery 1.3

PHP


PHP概览
PHP jQuery Cookbook


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中分层数据的问题/答案,但是没有一个可以处理这种"松散"的分层。

有谁知道如何用这种方式建立一个列表吗?

假设您的类别不能形成循环,如a->b->c->a,您的结构称为有向无环图,这在SQL中不容易处理,但可能。谷歌应该会有一些结果,你也可以从这里开始:http://www.codeproject.com/KB/database/Modeling_DAGs_on_SQL_DBs.aspx

如果你的数据集很小(<10000),那么你可以在4 SELECT all查询中获取所有数据,并在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中取任意值)。