Php 来自多个类别的项目最佳实践

Php 来自多个类别的项目最佳实践,php,sql,mysql,zend-framework,join,Php,Sql,Mysql,Zend Framework,Join,我正在分类列出项目,问题是项目可以分为多个类别。 在类别中存储项目的最佳做法是什么?如何列出类别及其子类别中的所有项目?我正在使用Zend框架和MySQL来解决这个问题 谢谢你的回复 对不起,我的英语:)那么,您在类别中有一个层次结构,是吗?是一个级别(类别和子类别)还是任意数量(子类别可以有子类别等)?这将影响解决方案 一般来说,您可以通过多对多关系对类似的内容进行建模,例如: CREATE TABLE Item( item_id INT NOT NULL, item_name VA

我正在分类列出项目,问题是项目可以分为多个类别。 在类别中存储项目的最佳做法是什么?如何列出类别及其子类别中的所有项目?我正在使用Zend框架和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)
 )
“项目类别”中的记录表示所列项目属于所列类别。然后,您可以在这些表中的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
)

如果一个项目可以包含多个类别,则这些类别不是“类别”。它们更像是标签


在项目和标记之间使用多对多关系。如果你想要一个标签的层次结构,那就去做吧;但这通常是过分的,很少增加价值。

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

例如:
创建表类别(
id INT非空自动增量,
父\u id INT不为NULL默认值“0”
名称VARCHAR(255)不为空
)

那样更简单。父级id为0的任何类别都将是您的最高级别。如果您有一个id为1的类别,并且您创建了该类别的子类别,那么它的父类别id将为1等等。

而且要明确的是,在类别表的最后一个版本中,每个子类别都有一条记录。所以实际上,它应该被称为子类别表,PK为“Subcategory_id”。