我正在尝试为产品属性(尺寸、重量、清洁方法等)及其变体(颜色、尺寸等)设计一个数据库

Posted

技术标签:

【中文标题】我正在尝试为产品属性(尺寸、重量、清洁方法等)及其变体(颜色、尺寸等)设计一个数据库【英文标题】:I'm trying to design a database for products attributes (dimensions, weight, method of cleaning, etc..) and their variants (colors, sizes, etc..) 【发布时间】:2022-01-21 06:09:26 【问题描述】:

我是初学者,这是我的第一个真正的项目。 下图显示了我一直试图达到的目标。但它变得如此复杂,如此之快,令人困惑。所以我问是否有不同的方法来设计表格更容易记住几个键:

    属性不会重复。

    颜色、尺寸、材料表具有不同的结构,例如(颜色 有 name_ar、name_en 和颜色图像的路径)。

    一开始我没有使用 SKU,但现在我想我可能需要 他们分开。

    不同的颜色可能有不同的尺寸等等

This is what I have reached so far

#Edit-1: 我试图考虑另一种设计方式,但它比以前增长得更多,多了一张桌子 。 但在那之后,我想不出另一种方法来达到我想要的结果。

提前谢谢大家的回答

【问题讨论】:

在我看来,你已经实现了“过度标准化”。您会发现该模式的编程非常繁琐且性能缓慢。阅读有关 EAV 的其他问答,以找到有关如何改进架构的部分解决方案。 【参考方案1】:

看起来你正在尝试在这里做 EAV 架构,但并不真正理解它的重点\问题。

EAV 架构的重点是垂直与水平构建数据库。看起来您只是在创建一堆旋转属性,而不是实际上的 EAV 设计。这在实践中的意思是,而不是:

Table: Shirts
Columns: ID, Label, Size, Color, Weave, Fabric, Made in, Class, Discount blah blah blah

你想要的:

Entity:
ID:1, [Label:'Cool Shirt', Price: 19.00, Other required properties]

然后是你的属性表

attribute:
entity: 1
attribute:type
value: shirt

attribute:
entity: 1
attribute:color
value: red

attribute:
entity: 1
attribute:size
value: large

这种架构风格的要点是,并非所有实体都需要所有属性,而且您不想制作一个包含实体可能拥有的所有潜在属性的超长表格。

您可以进一步深入透视表,这看起来就像您在此处尝试使用透视 ID \ 命名所做的那样:

attribute_values:
entity: 1
attribute:3
value: 5

Table attribute_map:
id: 3
value:"color"

Table property_map:
id:5
attribute:3
value:"red"

不管几件大事。

    父级应该是子表本身的属性,即“实体”部分。不需要另一个表映射关系。还可以更轻松地运行递归调用以获得您想要的最终答案)

    价格之类的东西(通常)不适合这个模型,也应该作为顶层实体的列进行分配。在决定如何构建***实体时请记住这一点。

    确保将复合索引添加到所有枢轴。

编辑你想做的事情:

所以请记住,每个实体都只是属性的集合。

Enitity 3: Shirt, White, XL
Enitity 4: Shirt, White, X

Shirt-White-X is the "SKU" as far as your database is concerned in EAV.

你只是递归地向下遍历所有树,直到所有属性\子属性都被完全表达。

请记住,“实体”只是属性的合并,在这种情况下,您还希望将其作为唯一键(基本上是 SKU)进行操作。奖励您可以使用唯一索引来强制执行它。

根据(确切地说)您所说的,您只是想计算库存,这可以通过几种方式完成。一般来说,你只需要再做一层(我猜我不知道你到底想做什么)。

Table: Inventory

Id (store): 1
Attribute (product_id): 4
Value (inventory): 7

您可以创建像商店这样的更高层实体,并实际创建分配给商店的产品对象。真的取决于你的系统是如何建模的,以及你想去兔子洞多远。

这有点抽象\你实际在做什么\你的整体架构是如何工作的。

成为 EAV 纯粹主义者很少有用。将附加到每个产品实体的价格等属性通常更容易直接添加到***实体。你不是想在这里重新构建 magento,纯 EAV 架构有一些主要缺点,因为它变得更加复杂。它可以非常灵活。它还可以创建效率极低的系统,具体取决于它的构建方式(你好医疗行业)。

【讨论】:

感谢您的回答@mason-stedman。您的回答是我试图实现的目标之一。还有另一部分是属性大小还取决于产品的颜色和材料。我想说的是,我还希望根据颜色改变尺寸,例如(白色 T 恤只有小号、中号和大号)等等。请原谅我不擅长解释东西 编辑以说明这一点 非常感谢您的解释。欣赏它

以上是关于我正在尝试为产品属性(尺寸、重量、清洁方法等)及其变体(颜色、尺寸等)设计一个数据库的主要内容,如果未能解决你的问题,请参考以下文章

京东“竖亥小车”秒测商品尺寸重量

MongoDB通过许多参数过滤(复合索引与否)

Woocommerce - 将属性值显示为下拉字段

检查尺寸值及其含义的功能

基于同一产品重量的不同价格的数据库设计

获取产品及其变体