简体   繁体   中英

How to tie products to categories?

The first time I tried to do this, I created a field in the category table called query . That contained strings like:

brand = "Burberry" AND type != "Watch"

Which I then inserted into the WHERE clause of a query to find a category's products.

That probably wasn't the best design.


My second attempt was to use a tagging system. I would create a tag table with tags like Burberry and Watch . I had a table tying the tags to the products (HABTM). I also had a table tying the tags to the categories.

The table tying tags to categories had an extra field called include which if it was a 1 then all products selected must also have that tag. Or if it was a 0 then all products selected must NOT have that tag.

This seemed to be a better design then my original, but it required some pretty complex joins.


Now I need to approach this problem once again.

One difference is I am now using the CakePHP (1.3) framework.

Before I try reinventing the wheel again. I was wondering if there are any known patterns/solutions I could use?

Probably you've already done that somehow by now, but here are my 2cents:

I'd drop Categories<->Tags, because I feel that you're unnecessarily duplicating data with it. Ie tables should be just categories , categories_products , products , products_tags and tags .

This way:

  1. you wouldn't have to bother about changing category tags when products are added or removed from category
  2. your searches would become more uniform (since there's only one tagging table)
  3. and your tags still would be no more than 3 JOINS away - which is quite comfortable:)

From what I can understand you should have 5 tables:

  • Categories
  • Products
  • Tags
  • Categories_Tags
  • Products_Tags

UPDATE: When the user defines what should be selected, the HABTM tables are updated so that the tags/categories link to the products they should be linked to only.

So the query will look something like:

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)

Maybe I'm missing what you're trying to accomplish here, but this sounds like you're making it more complicated than it needs to be.

Create three tables: Product, Category, and ProductCategory. Product and Category each have an id. Then ProductCategory includes ProductId / CategoryId pairs.

Like:

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

Then if you want, eg, to know all the "Hardware" items:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM