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

I'm trying to design a database for products attributes (dimensions, weight, method of cleaning, etc..) and their variants (colors, sizes, etc..)

我是初学者,这是我的第一个真正的项目。 下图显示了我一直试图达到的目标。但它变得如此之快和令人困惑。所以我问是否有不同的方法可以更轻松地设计 tables,同时记住几个键:

  1. 属性不会重复。

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

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

  4. 不同的颜色可能有不同的尺码等等

This is what I have reached so far

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

提前感谢大家的回答

看起来你正在尝试在这里做 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]

那么你的属性tables

attribute:
entity: 1
attribute:type
value: shirt

attribute:
entity: 1
attribute:color
value: red

attribute:
entity: 1
attribute:size
value: large

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

您可以进一步向下移动枢轴 tables,这就是您在此处尝试使用枢轴 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"

不管什么大事。

  1. 父级应该是子级table的属性,也就是'entity'部分。不需要另一个 table 映射关系。还可以更轻松地 运行 向下递归调用以获得您想要的作为最终答案)

  2. 像价格这样的东西(通常)不适合这个模型,也应该被指定为顶层实体的一列。在决定如何构建顶级实体时请记住这一点。

  3. 确保将复合索引添加到所有数据透视表。

根据您想要的内容进行编辑:

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

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 架构有一些主要缺点,因为它变得更加复杂。它可以非常灵活。它还可以根据其构建方式创建极其低效的系统(你好,医疗行业)。