gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:01:30 24 4
gpt4 key购买 nike

未能找到 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com