我正在制作分类项目列表,但问题是一个项目可能属于多个分类。您有什么最佳实践来存储分类项目,并如何列出类别及其子类别中的所有项目?我正在使用Zend Framework和MySQL解决此问题。
谢谢您的回复。
抱歉我的英语不好 :)
谢谢您的回复。
抱歉我的英语不好 :)
所以,你有一个类别的层次结构,对吗?它是一个级别(类别和子类别)还是任意数量(子类别可以有子类别等)?这将影响解决方案。
通常,你会使用多对多关系来建模这样的内容,例如:
CREATE TABLE Item(
item_id INT NOT NULL,
item_name VARCHAR(255) NOT NULL
)
CREATE TABLE Category(
category_id INT NOT NULL,
category_name VARCHAR(255) NOT NULL
)
CREATE TABLE Item_Category(
item_id INT NOT NULL REFERENCES Item(item_id),
category_id INT NOT NULL REFERENCES Category(category_id)
)
"Item_Category"中的一条记录表示列出的物品属于列出的类别。然后,您可以在这些表中的2(或3)个之间进行连接,以列出哪些物品属于哪些类别:
SELECT I.*
FROM Item I
INNER JOIN Item_Category IC ON I.item_id = IC.item_id
INNER JOIN Category C on IC.category_id = C.category_id
WHERE
C.category_name = 'MyCategory'
或者一个项目所属的类别:
SELECT C.*
FROM Category C
INNER JOIN Item_Category IC.category_id = C.category_id
INNER JOIN Item I on IC.item_id = I.item_id
WHERE
I.item_name = 'MyItem'
如果分类中存在层级关系,可以在分类表中使用递归关系来表示,例如:
CREATE TABLE Category(
category_id INT NOT NULL,
category_name VARCHAR(255) NOT NULL,
parent_category_id INT NOT NULL REFERENCES Category(category_id)
)
这会让事情变得更加复杂,因为您需要使用递归查询来获取类别及其子类别的所有记录。如果您只有两个级别的类别,则更简单的方法是将其作为类别表上的第二个字段:
CREATE TABLE Category(
category_id INT NOT NULL,
category_name VARCHAR(255) NOT NULL,
subcategory_name VARCHAR(255) NULL
)
CREATE TABLE category (
id INT NOT NULL AUTO_INCREMENT,
parent_id INT NOT NULL DEFAULT '0'
name VARCHAR(255) NOT NULL
)
这样更简单。任何具有parent_id为0的类别都将是您最高级别的类别。如果您有一个id为1的类别,并且您创建了其子类别,则其parent_id将为1等。