我的数据库中有一个基本的产品表
该表记录了每种产品常见产品的大部分价值,如价格,mrp,名称,sku等。
现在每个产品都有一些不适用于每种产品的不同属性。衬衫有尺寸和颜色,显示器或手机有不同的显示分辨率,书有ISBN和作者姓名等等
我也需要拥有这些属性。任何人都可以给我一个暗示它是如何做到的。
我在stackoverflow和google上经历了一些问题,但是无法弄清楚如何正确地做到这一点,否则我就不会冒险在stackoverflow上投票。
答案 0 :(得分:1)
计划A:
步骤1.确定将使用哪些字段进行搜索或排序。
步骤2.将步骤1中的列表缩小到不超过5个字段。选择最有用的。
步骤3.创建一个包含这5个字段的表格,以及一个TEXT
字段,用于收集有关该项目的所有杂项数据的JSON
个字段。 (它也可能包括5。)
步骤4.构建复合索引,这些索引将处理许多(但可能不是全部)常见查询。
More discussion -- mostly about why EAV is bad
B计划:
转换为MariaDB并使用其"动态列"和其他技术,包括在JSON文本中索引字段。
答案 1 :(得分:0)
我通常做的,尽管不是最好的选择,是定义一个名为attributes的Varchar字段,它是一个带有我想要的数据的json。
当然,这仅在您从编程语言访问数据时才有用。请记住,通过这种方式,您无法对这些属性进行连接。
另一种面向数据库的可能性是定义项类型,然后为每种类型定义一个属性表。例如,T-Shirts是0,那么你就有0_attributes(或t_shirt_attributes)。
一个主要的缺点是您无法在单个查询中检索每个项目及其属性。
答案 2 :(得分:0)
这是一个非常难以解决的问题。事实上,它涉及数据建模的本质,其中有多个潜在的解决方案,但不一定都是同样好的。哪一个最好取决于您的实际数据 - 有多少不同的产品子集,子集之间共享多少属性,多少不属于,使用方案是什么(您的查询将访问所有产品或仅访问子集类似的产品?)等。
所以,有些选择是:
只有一个包含所有属性的稀疏填充表,对于给定产品不适用的属性为NULL。可能有一组视图(每个子集一个),限制了对给定子集产品有效的记录和属性。
每个子集的公共属性和专用表的一个主表 - 应用了一种规范化,因此可以避免使用NULL。最上面的一组视图,它们将主表与给定子集产品的专用表连接起来。这种方法在某种程度上类似于OOP中的超类(主表)和子类(专用表)。
EAV(不!)
一个具有公共属性的主表+一组通用属性(ATTR_TYPE_1,ATTR_VAL_1),...,(ATTR_TYPE_N,ATTR_VAL_N)。这假设通用属性的数据类型相同。 ATTR_TYPE_#存储信息给定记录的属性(例如:COLOR)和ATTR_VAL_#存储实际值(例如:BLACK)。
与4.类似,但不是通用属性,而是存储所有非共享属性的XML类型(或JSON)字段。此解决方案的适用性取决于您对此类数据类型的数据库支持。
分析您的非共享属性如何推广(同时查看属性名称和域),以便它们成为共享属性(或至少由更多子集共享)。例如:ISBN或UPC / EAN是特定的,PRODUCT_CODE更一般;制造商或作者是具体的,MAKER更一般; SIZE和RESOLUTION可能都称为SIZE;同样适用于TYPE,SEGMENT,VARIANT - 它们可能都是TYPE等等。基于此分析,您可以创建一个具有非常通用的列名称的数据模型,如SIZE,FORM,TYPE,GROUP等,但实际上意义是从上下文(实际查询的子集)知道的:衬衫的TYPE是T恤或长袖,书的TYPE是新颖的或字典,监视器的类型是LCD或CRT等。
您的公司的剥离(仅关注一种类型的产品,因此您的数据模型的要求更加简单)。 ; - )