【问题标题】:Product inventory with multiple attributes具有多种属性的产品库存
【发布时间】:2011-11-12 03:22:16
【问题描述】:

在我的产品表中,我有一个表示属性集的字段。

属性集是属性(大小、颜色等)的集合。

每个属性都有几个值,例如蓝色、绿色、红色等。

我将如何存储具有多个(而非固定数量)属性的产品的库存信息?

【问题讨论】:

  • 我想我可以为每个属性集设置 3 个属性的限制,并且库存表如下所示:(product_id、attribute1value、attribute2value、attribute3value、itemsinstock)。这可能是最简单的选择?

标签: php mysql sql


【解决方案1】:

我建议不要破坏 NF1,而是使用 Entity Value Attribute 模型。这也不是没有问题。 Wikipedia 文章对此进行了解释,并包含了替代方法,包括使用稀疏列或 XML 字符串。

【讨论】:

    【解决方案2】:

    你可以这样做:

    products
    --------
    id
    name
    
    attributes
    ----------
    id
    name
    value
    
    product_attributes
    ------------------
    id
    product_id
    attribute_id
    

    或者

    products
    --------
    id
    name
    
    attributes
    ----------
    id
    name
    
    product_attributes
    ------------------
    id
    product_id
    attribute_id
    value
    
    
    SELECT * FROM products,
     (SELECT * FROM product_attributes LEFT JOIN products ON products.id = 
     product_attributes.product_id) AS prod_attr
    LEFT JOIN attributes ON prod_attr.attribute_id = attributes.id
    

    【讨论】:

    • 我已经为您所描述的所有内容设置了表格。当产品具有多个属性时,我正在寻找跟踪库存的最佳解决方案。
    • 也许你能用一个例子解释一下吗?此架构允许产品拥有任意数量的属性。
    • 是的,但我想根据产品属性跟踪产品库存。说 5 件绿色 XL T 恤,7 件蓝色小 T 恤。但是我不知道每个产品会有哪些或多少个属性。
    【解决方案3】:

    您可以通过引入“junction table”(此处称为 ProductAttribute)来保存associative entities,从而在关系数据库中获得产品和属性之间的many-to-many 关系:

    Product  <--one-to-many-->  ProductAttribute  <--many-to-one-->  Attribute
    --------                    ----------------                     ---------
    PK: id                      PK: id                               PK: id
        name                    FK: product_id                           name
                                FK: attribute_id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 2015-11-19
      相关资源
      最近更新 更多