php - 用于从父类别检索子类别中存储的项目的数据库架构

标签 php mysql data-structures hierarchy

未能找到 this 的解决方案我想知道是否有更好的方法来存储这个问题的数据。

该数据库结构允许项目存储在多个类别中,但不允许轻松访问父类别层次结构。

我想要的是有一个类别关系,例如:

Books 
  > Novels
    > Paperbacks
    > Hardbacks

例如,将一个项目存储在平装本中,该项目也会出现在小说和书籍中。因此,“类别”实际上更像是过滤器,而不是实际的类别。

最佳答案

首先,您需要使用 Nested Set 来设计类别表。建筑学。通过使用嵌套集,您可以轻松选择整个类别分支,然后您将能够为这些类别选择产品。

所以第一个表将是:

CREATE TABLE categories (
  id int unsigned NOT NULL auto_increment,
  name varchar(255) NOT NULL,
  left int unsigned NOT NULL,
  right int unsigned NOT NULL,
  PRIMARY KEY (id)
);

第二个表将是:

CREATE TABLE products (
  id int unsigned NOT NULL auto_increment,
  name varchar(255) NOT NULL,
  PRIMARY KEY (id)
);

第三个表将是:

CREATE TABLE product_categories (
  category_id int unsigned NOT NULL,
  product_id int unsigned NOT NULL,
  PRIMARY KEY (category_id, product_id)
);

现在要选择整个类别分支的所有产品,您需要使用如下查询:

SELECT p.*
  FROM categories AS c1
  LEFT JOIN categories AS c2 ON c1.left <= c2.left AND c2.right <= c1.right
  LEFT JOIN product_categories AS pc ON pc.category_id = c2.id
  LEFT JOIN products AS p ON pc.product_id = p.id
 WHERE c1.id = @id

嵌套集合运算

添加新节点

第一步:更新已有的类别

UPDATE categories 
   SET right = right + 2, left = IF(left > @right, left + 2, left) 
 WHERE right >= @right

第二步:插入新类别

INSERT INTO categories SET left = @right, right = @right + 1, name = @name

删除现有节点

第一步:删除节点

DELETE FROM categories WHERE left >= @left AND right <= @right

第二步:更新其他节点

UPDATE categories 
   SET left = IF(left > @left, left – (@right - @left + 1), left), 
       right = right – (@right - @left + 1) 
 WHERE right > @right

关于php - 用于从父类别检索子类别中存储的项目的数据库架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8441723/

相关文章:

php - 使用password_hash PASSWORD_DEFAULT遗留问题

Mysql - 如何消除具有多列重复(不重复)的行

php - 输出jquery UI slider 到mysql无法获取PHP文件来获取POST数据

Java-递归: When does statements after a recursive method call executes

php - 我怎样才能操纵我的阵列,所以如果在 60 分钟内用相同的方式进行扫描

javascript - ajax onclick事件第一次获取错误结果,但第二次获取正确结果

php - php数组中的未定义索引

php - "zero knowledge"mysql数据库加密

java - 网络流量 : Adding a new edge

数组:在一些附加条件下找到两个数字,使其总和最大