在mysql数据库中存储动态属性

时间:2017-07-15 22:37:13

标签: mysql

我正在为网上商店创建数据库设计。我想存储具有不同属性的产品。目前我有一个包含+100列的表,但我想优化它。

这是我到目前为止所提出的。到目前为止,我对我的设计有一些疑问(见下文)。

免责声明: 这是一个数据库设计。我没有一些php / sql代码,因为我不知道这是否是正确的方法。我会尽量使这个问题得到证实。

我们走了......

我有3张桌子:

  • 第一个表是“产品”表,它将存储有关每个产品的所有一般信息(id,name,sku,images,...)
  • 第二个表是“属性”表,它将存储所有属性(例如颜色,宽度,高度,has_bluetooth,...)但不存储值
  • 第三个表存储每个属性的值(表" attributes_values")

表:产品

Product_id     | Name           | SKU
------------------------------------------------------
1              | iPhone 7       | iphone7
2              | HTC One        | htcone
3              | Galaxy S8      | galaxys8

如您所见,我的数据库中有3个产品

表:属性

Attribute_id    | Name
---------------------------------------
1               | Color
2               | Weight
3               | Height

如您所见,我的数据库中有3个不同的属性 - 请注意,某些产品不具备每个属性

表:attributes_values

Attribute_value_id    | Attribute_id    | Product_id    | Value
-----------------------------------------------------------------------
 1                    | 1               | 1             | Black
 2                    | 2               | 1             | 0,125 kg
 3                    | 3               | 1             | 10 cm
 4                    | 1               | 2             | Gold
 5                    | 1               | 2             | 0,15 kg

如您所见,产品1(iphone)有3个属性,产品2(htc one)有2个属性,而product 3(galaxy s8)属性为零。

我的问题

首先,这是一个好方法吗?我想在PHP中创建一个“仪表板”,我可以在向数据库添加新类型的产品时动态添加新属性。这就是为什么我在2个不同的表中分离属性名称和值。

其次,如何从数据库中获取信息。我想选择产品+它拥有的所有属性(以及与每个属性相关的值)。我认为这是做到这一点的方法。如果我错了,请纠正我。

SELECT
        p.name, // the product name
        p.sku,    // the product SKU
        v.value, // the attribute value
        a.name // the attribute name
FROM
        products AS p
LEFT JOIN
        attributes_values AS v
ON
        p.product_id = v.product_id
LEFT JOIN
        attributes AS a
ON
        v.attribute_id = a.attribute_id

我希望我的问题尽可能清楚。如果没有,请随时问。英语不是我的母语,所以请原谅我的一些语法错误。谢谢大家!

我找到了以下链接,也许他们可以提供帮助。

0 个答案:

没有答案