Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 应用产品属性_Mysql_Database_Database Design_Attributes - Fatal编程技术网

Mysql 应用产品属性

Mysql 应用产品属性,mysql,database,database-design,attributes,Mysql,Database,Database Design,Attributes,我的数据库中有一个基本产品表 该表记录了每个产品共有的大部分产品价值,如价格、mrp、名称、sku等 现在,每个产品都有一些不同的属性,这些属性不适用于每个产品。衬衫有尺寸和颜色,显示器或手机有不同的显示分辨率,书有ISBN和作者姓名等等 我也需要这些属性。谁能给我一个如何做的提示 关于stackoverflow和google,我已经问了几个问题,但是我不知道怎么做才对,否则我就不会冒在stackoverflow上被否决的风险。尽管不是最好的选择,但我通常做的是定义一个名为attributes

我的数据库中有一个基本产品表

该表记录了每个产品共有的大部分产品价值,如价格、mrp、名称、sku等

现在,每个产品都有一些不同的属性,这些属性不适用于每个产品。衬衫有尺寸和颜色,显示器或手机有不同的显示分辨率,书有ISBN和作者姓名等等

我也需要这些属性。谁能给我一个如何做的提示


关于stackoverflow和google,我已经问了几个问题,但是我不知道怎么做才对,否则我就不会冒在stackoverflow上被否决的风险。

尽管不是最好的选择,但我通常做的是定义一个名为attributes的Varchar字段,它是一个json,包含我想要的数据

当然,这只有在从编程语言访问数据时才有用。请记住,这样您将无法对这些属性进行连接

另一个更面向数据库的可能性是定义一个项目类型,然后为每个类型定义一个属性表。例如,T恤衫的类型为0,那么您有类似于0的属性(或T恤衫属性)

一个主要缺点是,您无法在单个查询中检索每个项目及其属性。

计划A:

第一步。决定哪些字段将用于搜索或排序

第二步。将列表从第1步缩减到不超过5个字段。选择最有用的

第三步。创建一个包含这5个字段的表,再加上一个
TEXT
字段,用于
JSON
收集有关项目的所有杂项数据。(也可以包括5个。)

第四步。构建复合索引,以处理许多(但可能不是全部)常见查询

方案B:


转换为MariaDB并使用其“动态列”和其他技术,包括JSON文本中的索引字段。

这是一个很难解决的问题。事实上,它触及了数据建模的本质,即存在多个潜在的解决方案,但不一定所有的解决方案都一样好。哪一个是最好的取决于您的实际数据-有多少不同的产品子集,有多少属性在子集之间共享,有多少属性不共享,使用场景是什么(您的查询将访问所有产品还是仅访问类似产品的子集?),等等

因此,有些选择是:

  • 只有一个稀疏填充的表,其中包含所有属性,不适用于给定产品的属性为空。可能在顶部有一组视图(每个子集一个),这些视图限制了对给定产品子集有效的记录和属性

  • 一个用于公共属性的主表和用于每个子集的专用表—应用了一种规范化,因此可以避免空值。顶部的一组视图,将给定产品子集的主表与专用表连接起来。这种方法在某种程度上类似于OOP中的超类(主表)和子类(专用表)

  • EAV(否!)

  • 一个具有公共属性的主表+一组通用属性(ATTR_TYPE_1,ATTR_VAL_1),(属性类型,属性值)。这假定通用属性的数据类型相同。ATTR_TYPE#存储给定记录的属性信息(例如:颜色),ATTR_VAL#存储实际值(例如:黑色)

  • 类似于4。但不是通用属性,而是存储所有非共享属性的XML类型(或JSON)字段。此解决方案的适用性取决于您的数据库对此类数据类型的支持

  • 分析如何将非共享属性广义化(查看属性名称和域),使它们成为共享属性(或至少被更多子集共享)。例如:ISBN或UPC/EAN是特定的,产品代码更通用;制造商或作者具体,制造商更一般;大小和分辨率都可以称为大小;这可能同样适用于类型、段、变体-它们可能都是类型,等等。基于此分析,您可以创建一个数据模型,其中包含非常通用的列名,如大小、形式、类型、组等。但实际含义从上下文(实际查询的子集)中知道:衬衫的类型是T恤或长袖,书的类型是小说或字典,显示器的类型是LCD或CRT等

  • 剥离您的公司(只关注一种类型的产品,因此对数据模型的要求要简单得多)。;-)