如何将产品与类别联系起来?

时间:2011-05-03 14:44:47

标签: php mysql database-design cakephp

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

  

brand =“Burberry”AND type!=“Watch”

然后我将其插入到查询的 WHERE 子句中以查找类别的产品。

这可能不是最好的设计。


我的第二次尝试是使用标记系统。我会创建一个包含BurberryWatch标签的代码表。我有一张桌子将标签绑在产品上(HABTM)。我还有一个表格将标签绑定到类别。

将标签绑定到类别的表格有一个名为include的额外字段,如果是 1 ,则所有选定的产品也必须具有该标记。或者,如果它是 0 ,则所有选定的产品都不得包含该标签。

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


现在我需要再次解决这个问题。

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

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

3 个答案:

答案 0 :(得分:1)

可能你现在已经以某种方式做到了,但这是我的2cents:

我会删除类别< - >标记,因为我觉得你不必要地用它复制数据。 即表格应该只有categoriescategories_productsproductsproducts_tagstags

这样:

  1. 在添加或删除类别
  2. 中的产品时,您无需为更改类别标记而烦恼
  3. 您的搜索会变得更加统一(因为只有一个标记表)
  4. 并且你的标签仍然不会超过3个JOINS - 这非常舒服:)

答案 1 :(得分:0)

据我所知,你应该有5张桌子:

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

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

所以查询看起来像:

SELECT * FROM products WHERE ID in(SELECT product_id from tag list to include)AND ID NOT IN(select product_id FROM tag list to NOT include)

答案 2 :(得分: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'