2008-12-15 30 views
3

我正在制作分类中的项目列表,问题在于该项目可以分为多个类别。 你最好的做法是将商品存储在类别中,以及如何列出商品类别及其子类别中的所有商品?我正在使用Zend Framework和MySQL来解决这个问题。来自多个类别最佳做法的项目

感谢您的回复。

对不起,我的英语:)

回答

8

所以,你必须在类层次结构,是吗?它是一个级别(类别和儿童类别)还是任何数字(儿童可以有孩子等)?这将影响解决方案。

一般情况下,你会像这个模型有许多一对多的关系,如:

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) 
) 

这使事情变得更加复杂,因为你必须使用递归查询来获取所有REC为一个类别及其子女开设的ords。更简单的方法,如果你只有两个级别的类别,它只是让它的第二场的类别表,如:

CREATE TABLE Category(
    category_id INT NOT NULL, 
    category_name VARCHAR(255) NOT NULL, 
    subcategory_name VARCHAR(255) NULL 
) 
+0

而且要清楚,在最后一个版本的类别表格中,每个子类别*有一个记录*。所以真的,它应该被称为子类别表,具有“subcategory_id”的PK。 – 2008-12-17 17:14:57

3

如果一个项目可以在多个类别,那么这些都不是“类别”。他们更像是标签。

使用您的物品和您的标签之间的多对多关系。如果你想要一个标签层次结构,就去做吧。但它通常是过度杀伤性的,很少增加价值。

0

通常情况下,我发现在大多数情况下可以使用的最佳解决方案是在类别表中简单地使用parent_id字段。这样你只需要一个分类表。这将支持任意级别或者只有一个级别(在这种情况下,需要在代码中阻止创建第三级别的类别)。

例如:
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等。

相关问题