多个类别的项目最佳实践

4
我正在制作分类项目列表,但问题是一个项目可能属于多个分类。您有什么最佳实践来存储分类项目,并如何列出类别及其子类别中的所有项目?我正在使用Zend Framework和MySQL解决此问题。
谢谢您的回复。
抱歉我的英语不好 :)
3个回答

9

所以,你有一个类别的层次结构,对吗?它是一个级别(类别和子类别)还是任意数量(子类别可以有子类别等)?这将影响解决方案。

通常,你会使用多对多关系来建模这样的内容,例如:

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
)

并且要明确的是,在类别表的最后一个版本中,每个子类别都有一条记录。因此,它应该被称为子类别表,主键为“subcategory_id”。 - Ian Varley

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等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接