我第一次尝试这样做时,在类别表中创建了一个名为query
的字段。其中包含如下字符串:
brand =“Burberry”AND type!=“Watch”
然后我将其插入到查询的 WHERE 子句中以查找类别的产品。
这可能不是最好的设计。
我的第二次尝试是使用标记系统。我会创建一个包含Burberry
和Watch
标签的代码表。我有一张桌子将标签绑在产品上(HABTM)。我还有一个表格将标签绑定到类别。
将标签绑定到类别的表格有一个名为include
的额外字段,如果是 1 ,则所有选定的产品也必须具有该标记。或者,如果它是 0 ,则所有选定的产品都不得包含该标签。
这似乎是一个比我原来更好的设计,但它需要一些非常复杂的连接。
现在我需要再次解决这个问题。
一个区别是我现在正在使用CakePHP(1.3)框架。
在我尝试重新发明轮子之前。我想知道是否有任何我可以使用的已知模式/解决方案?
答案 0 :(得分:1)
可能你现在已经以某种方式做到了,但这是我的2cents:
我会删除类别< - >标记,因为我觉得你不必要地用它复制数据。
即表格应该只有categories
,categories_products
,products
,products_tags
和tags
。
这样:
答案 1 :(得分:0)
据我所知,你应该有5张桌子:
更新:当用户定义应选择的内容时,会更新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'