【问题标题】:Cakephp database design for ecommerce电子商务的Cakephp数据库设计
【发布时间】:2013-10-27 03:21:33
【问题描述】:

我正在开发一个电子商务网站,但我对数据库设计很熟悉。

我有 3 张桌子:

  1. 产品(id、category_id、subcategory_id、名称)
  2. 类别(ID、名称)
  3. 子类别(id、category_id、名称)

例如:产品(Stripped Tshirt)属于类别(时尚)和子类别(Tshirt)

如果我想为这个产品增加尺码怎么办?我应该在 products 表中创建另一个表名 'Sizes' 和 size_id 吗?

但是,对于另一个类别(例如小工具/手机)没有大小。设计此数据库的最佳选择是什么?

【问题讨论】:

    标签: mysql sql cakephp size product


    【解决方案1】:

    首先,我不会在产品上设置类别 ID 和子类别 ID。它只属于一个子类别。如果需要,可以通过子类找到父类。

    products (id, subcategory_id, name)
    
    categories (id, name)
    
    subcategories (id, category_id, name)
    

    对于所有产品可能不同的属性,您可以这样做:

    attribute_types (id, name)
    
    attributes (id, attribute_type_id, value)
    
    products_attributes (id, product_id, attribute_id)
    

    所以在你的 attribute_types 表中你可能有:

    id | name
    -----------------------------
    1  | T-Shirt Size
    2  | Shoe Size (US)
    3  | Colour
    4  | Batteries Included
    

    在您的属性表中:

    id | attribute_type_id | value
    ------------------------------
    1  | 1                 | Small
    2  | 1                 | Medium
    3  | 1                 | Large
    4  | 2                 | 9
    5  | 2                 | 9.5
    6  | 2                 | 10
    7  | 2                 | 10.5
    8  | 2                 | 11
    9  | 3                 | Red
    10 | 3                 | Blue
    11 | 3                 | Green
    12 | 3                 | Yellow
    13 | 3                 | Black
    14 | 4                 | Yes
    15 | 4                 | No
    

    然后在您的 products_attributes 表中,您只需添加该产品具有的任何属性:

    id | product_id | attribute_id
    ------------------------------
    1  | 456        | 6
    2  | 456        | 13
    

    所以对于那个产品来说,它是 10 号鞋,黑色。

    【讨论】:

    • 感谢 badHorsie..我从来没有想过这个解决方案。好的,我会试试这个设计。再次感谢。呵呵
    • 子类别不是类别吗?为什么不在类别表中只包含 parent_id 并删除整个子类别表?
    【解决方案2】:

    Magento 是一个大型商店解决方案,它使用 EAV 解决了这个问题。 EAV 很灵活,但性能不如专用表解决方案。

    您的类别 -> 子类别没有多大意义。阅读嵌套集或在同一类别表中使用纯父子关系。

    【讨论】:

      【解决方案3】:

      我认为您只能使用两个表/模型。您必须在类别模型上设置树行为。

      class Category extends AppModel {
          public $actsAs = array('Tree'); 
      }
      

      然后你必须在你的 database.categories 中添加一些列:

      • parent_id
      • ft

      EAV 样式很有用,但很难管理。我认为您也可以为您的产品模型使用可包含行为,并为您想要的每个类别制作新的模型。就像这里的例子:

      • db.categories hasMany db.products(树行为)
      • db.products 属于 db.categories(可包含行为)
      • db.eachModelYouWant(基于类别)

      当您找到产品时,您将获得一个包含您的 bd.products 和基本信息的数组,以及另一个基于 db.eachModelYouWant 的数组。

      无论如何,您还应该有一个表来管理 inStock 或不通过关系 hasManyAndBelongsTo。 :-) 所以尝试检查 databaseanswer 有很多设置!

      【讨论】:

        【解决方案4】:

        如果某些产品的尺码是固定的或已知的,您可以根据自己的建议制作尺码表,但如果它是可变的,您只需在产品表中制作尺码字段,并为没有尺码的产品设为可空.

        【讨论】:

          猜你喜欢
          • 2018-09-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-03
          • 2014-07-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多