Php 来自多个类别的项目最佳实践
我正在分类列出项目,问题是项目可以分为多个类别。 在类别中存储项目的最佳做法是什么?如何列出类别及其子类别中的所有项目?我正在使用Zend框架和MySQL来解决这个问题 谢谢你的回复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
对不起,我的英语:)那么,您在类别中有一个层次结构,是吗?是一个级别(类别和子类别)还是任意数量(子类别可以有子类别等)?这将影响解决方案 一般来说,您可以通过多对多关系对类似的内容进行建模,例如:
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”。