[英]Items from multiple categories best practices
我正在制作类别中的项目列表,问题是该项目可以是多个类别。 在类别中存储项目以及如何列出类别及其子类别中的所有项目的最佳做法是什么? 我正在使用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
)
如果一个项目可以是多个类别,那么这些不是“类别”。 他们更喜欢标签。
在您的商品和商品之间使用多对多关系。 如果你想要一个标签的层次结构,那就去吧; 但它通常是矫枉过正,很少增加价值。
通常,我发现在大多数情况下都能使用的最佳解决方案就是在类别表中使用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等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.