2011-05-03 88 views
4

我第一次尝试这样做时,我在类别表中创建了一个名为query的字段。包含如字符串:如何配合产品类别?

品牌=“巴宝莉”和type =“观看”

然后我插入WHERE查询的条款找到一个类别的产品。

这可能不是最好的设计。


我的第二次尝试是使用标记系统。我会创建一个标签表,其标签为BurberryWatch。我有一张桌子将标签捆绑到产品上(HABTM)。我也有一个表将标签绑定到类别。

表绑标签的类别有所谓include一个额外的字段,如果它是一个然后选择的所有产品还必须有标签。或者如果它是那么所有选择的产品都不能有该标签。

这似乎是一个更好的设计,然后我原来的,但它需要一些非常复杂的联接。


现在我需要再次处理这个问题。

一个区别是我现在使用CakePHP(1.3)框架。

在我尝试重新发明轮子之前。我想知道是否有任何已知的模式/解决方案可以使用?

回答

0

从我能理解你应该有5个表:

  • 分类
  • 产品
  • 标签
  • Categories_Tags
  • Products_Tags

UPDATE:当用户定义应该选择的内容时,HABTM表格会被更新,以便标签/类别链接到他们应该链接到的产品。

所以查询看起来像:

SELECT * FROM产品WHERE的ID(从标签列表中选择的product_id包括)和ID NOT IN(选择的product_id从标签列表不包括)

+0

当用户创建一个新的类别,他定义什么样的产品应该被列表示类别通过选择要包含的标签和要排除的标签。 – 2011-05-03 15:21:10

0

也许我错过了你想在这里完成的任务,但是这听起来像是让它变得比它需要的更复杂。

创建三个表格:Product,Category和ProductCategory。产品和类别每个都有一个ID。然后ProductCategory包含ProductId/CategoryId对。

像:

Product 
ProductId Name 
1   Lamp 
2   Carpet 
3   Drill 
4   Power cord 
5   3/8" bolt 

Category 
CategoryId Name 
1   Electrical 
2   Home decor 
3   Hardware 

ProductCategory 
ProductId CategoryId 
1   1 
1   2 
2   2 
3   1 
3   3 
4   1 
5   3 

然后,如果你想要的,例如,要知道所有的“硬件”项目:

select product.* 
from category 
join productcategory using (categoryid) 
join product using (productid) 
where category.name='Hardware' 
+0

这明确地将产品设置为一个类别,新的类别和产品经常被添加,我正在寻找更具活力的产品。谢谢。 – 2011-05-03 16:38:30

1

也许你已经这样做了不知何故现在,但这里有我的2:

我会放弃分类< - >标签,因为我觉得你不必要的复制数据。 也就是说表格应该只是categories,categories_products,products,products_tagstags

这样:

  1. 你就不必理会,当产品被添加或从类别中删除
  2. 您的搜索将变得更加均匀(因为只有一个标签表)改变类别标签
  3. 和你的标签仍然是不超过3个客场JOINS - 这是相当舒适的:)
相关问题