Php 如何在mysql中存储商品的属性?

Php 如何在mysql中存储商品的属性?,php,mysql,database,database-design,entity-attribute-value,Php,Mysql,Database,Database Design,Entity Attribute Value,现在我正在规划数据库产品的结构。有一个关于货物储存选择/参数的问题。 例如,如果是货物的大小,那么创建三个宽度/高度/深度字段就足够了,但是如果有几十个参数呢? 假设参数列表可以更改,我看到了关于此结构: 1-宽度 2-高度 ... 11色 但我不能像商品一样绑定它——可以使用json类型创建字段 {1:“20”,2“30”,…,11:“白色”} 然后在样品上处理商品,但我不知道如何再做过滤参数 谁能为正确的路径提供建议?基本上有两种方法可以做到这一点-您可以在表中创建一系列“udf”(用户定义

现在我正在规划数据库产品的结构。有一个关于货物储存选择/参数的问题。 例如,如果是货物的大小,那么创建三个宽度/高度/深度字段就足够了,但是如果有几十个参数呢? 假设参数列表可以更改,我看到了关于此结构: 1-宽度 2-高度 ... 11色

但我不能像商品一样绑定它——可以使用json类型创建字段

{1:“20”,2“30”,…,11:“白色”} 然后在样品上处理商品,但我不知道如何再做过滤参数


谁能为正确的路径提供建议?

基本上有两种方法可以做到这一点-您可以在表中创建一系列“udf”(用户定义字段)列,如udf1、udf2等-然后在应用程序的其他地方说“udf1==颜色,udf2==重量”

另一种方法是创建productmeta表,其结构如下:

id BIGINT AUTO_INCREMENT PRIMARY KEY
product_id INT
property VARCHAR(16)
propvalue VARCHAR(64)
因此,对于产品ID 137,您可能有多个记录:

|------------------------------------------|
| ID   | product_id | property | propvalue |
|------------------------------------------|
| 3137 | 137        | size     | large     |
| 3138 | 137        | color    | green     |
| 3139 | 137        | height   | 11.3      |
|------------------------------------------|
|------------------------------------------|
| id   | product_id | meta_key | meta_value|
|------------------------------------------|
| 3137 | 137        | size     | large     |
| 3138 | 137        | color    | green     |
| 3139 | 137        | height   | 11.3      |
|------------------------------------------|

缺点是这些表可能会变得非常大,非常快。

基本上有两种方法可以做到这一点-您可以在表中创建一系列“udf”(用户定义字段)列,如udf1、udf2等-然后在应用程序的其他地方说“udf1==颜色,udf2==重量”

另一种方法是创建productmeta表,其结构如下:

id BIGINT AUTO_INCREMENT PRIMARY KEY
product_id INT
property VARCHAR(16)
propvalue VARCHAR(64)
因此,对于产品ID 137,您可能有多个记录:

|------------------------------------------|
| ID   | product_id | property | propvalue |
|------------------------------------------|
| 3137 | 137        | size     | large     |
| 3138 | 137        | color    | green     |
| 3139 | 137        | height   | 11.3      |
|------------------------------------------|
|------------------------------------------|
| id   | product_id | meta_key | meta_value|
|------------------------------------------|
| 3137 | 137        | size     | large     |
| 3138 | 137        | color    | green     |
| 3139 | 137        | height   | 11.3      |
|------------------------------------------|

缺点是这些表可能变得非常大,非常快。

这可以通过三种方法实现

  • 产品表中添加所有
    独立列
  • 产品表
    的末尾添加一个带有longtext类型的
    ,通过json编码序列化在其中存储所有额外/动态参数
  • 最后一个是使用一个单独的元表来存储键、值对以及该表中的产品标识

    CREATE TABLE product_meta()
        id BIGINT AUTO_INCREMENT PRIMARY KEY,  // Primary key of this table
        product_id INT, // For joining purpose and reference
        meta_key VARCHAR(16),
        meta_value VARCHAR(64)
    );
    
  • 因此,对于产品ID 137,您可能有多个记录:

    |------------------------------------------|
    | ID   | product_id | property | propvalue |
    |------------------------------------------|
    | 3137 | 137        | size     | large     |
    | 3138 | 137        | color    | green     |
    | 3139 | 137        | height   | 11.3      |
    |------------------------------------------|
    
    |------------------------------------------|
    | id   | product_id | meta_key | meta_value|
    |------------------------------------------|
    | 3137 | 137        | size     | large     |
    | 3138 | 137        | color    | green     |
    | 3139 | 137        | height   | 11.3      |
    |------------------------------------------|
    

    这件事可以通过三种方法实现

  • 产品表中添加所有
    独立列
  • 产品表
    的末尾添加一个带有longtext类型的
    ,通过json编码序列化在其中存储所有额外/动态参数
  • 最后一个是使用一个单独的元表来存储键、值对以及该表中的产品标识

    CREATE TABLE product_meta()
        id BIGINT AUTO_INCREMENT PRIMARY KEY,  // Primary key of this table
        product_id INT, // For joining purpose and reference
        meta_key VARCHAR(16),
        meta_value VARCHAR(64)
    );
    
  • 因此,对于产品ID 137,您可能有多个记录:

    |------------------------------------------|
    | ID   | product_id | property | propvalue |
    |------------------------------------------|
    | 3137 | 137        | size     | large     |
    | 3138 | 137        | color    | green     |
    | 3139 | 137        | height   | 11.3      |
    |------------------------------------------|
    
    |------------------------------------------|
    | id   | product_id | meta_key | meta_value|
    |------------------------------------------|
    | 3137 | 137        | size     | large     |
    | 3138 | 137        | color    | green     |
    | 3139 | 137        | height   | 11.3      |
    |------------------------------------------|
    

    序列化它是行不通的——它几乎不可能进行任何适当的过滤(这是问题的一部分)。您要么在运行时反序列化每一列,要么使用复杂的正则表达式。这就是为什么我没有将其作为一个选项。您可以通过将
    product\u元表
    products表
    连接来进行过滤。您也可以对单独的列进行过滤,但在JSON中存储时,如果不使用正则表达式,或者使用类似于
    表达式的
    ,则不可能进行过滤。序列化它将不起作用-它几乎不可能进行任何适当的过滤(这是问题的一部分)。您要么在运行时反序列化每一列,要么使用复杂的正则表达式。这就是为什么我没有将其作为一个选项。您可以通过将
    product\u元表
    products表
    连接来进行过滤。您也可以对单独的列进行过滤,但在不使用正则表达式或类似于表达式的
    存储在JSON中时不可能这样做。谢谢。我希望你不要因为我选择的第一条而生气response@DmitriySkogorev因为它或多或少与我的回答完全相同,所以没关系;)非常感谢。我希望你不要因为我选择的第一条而生气response@DmitriySkogorev因为它或多或少与我的回答完全相同,所以没关系;)看我的,看我的。