【问题标题】:How to tie products to categories?如何将产品与类别联系起来?
【发布时间】:2011-05-03 14:44:46
【问题描述】:

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

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

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

这可能不是最好的设计。


我的第二次尝试是使用标记系统。我会创建一个标签表,其中包含BurberryWatch 之类的标签。我有一张桌子将标签与产品(HABTM)联系起来。我还有一张将标签与类别联系起来的表格。

将标签与类别联系起来的表格有一个名为include 的额外字段,如果它是一个1,那么所有选择的产品也必须具有该标签。或者,如果它是 0,则所有选择的产品都不得有该标签。

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


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

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

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

【问题讨论】:

    标签: php mysql database-design cakephp


    【解决方案1】:

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

    我会删除类别标签,因为我觉得您不必要地使用它复制数据。 IE。表应该只是categoriescategories_productsproductsproducts_tagstags

    这样:

    1. 在类别中添加或删除产品时,您不必担心更改类别标签
    2. 您的搜索将变得更加统一(因为只有一个标记表)
    3. 你的标签仍然不会超过 3 JOINS 距离 - 这很舒服:)

    【讨论】:

      【解决方案2】:

      据我所知,您应该有 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)

      【讨论】:

      • 当用户创建一个新类别时,他通过选择要包含的标签和要排除的标签来定义应在该类别中列出哪些产品。
      【解决方案3】:

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

      创建三个表: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'
      

      【讨论】:

      • 这是明确地将产品设置为一个类别,经常添加新的类别和产品,我一直在寻找更有活力的东西。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多