根据变体和价格为产品设计数据库模式

Database schema design for products depending on the variants and prices

我们正在为电子商务应用程序和网站设计数据库。我们遇到了阻碍我们进行搜索和试验的障碍,但 none 的解决方案有效,因为数据中会有冗余。

我们做了一些我们拒绝的设计。我不会展示所有的设计,但我会在这里展示其中的一些以及我们即将实现的最后一个设计。

  1. 这是我们拒绝的第一个设计,因为它过度规范化并且过于复杂。

  1. 第二个设计也是一样。

  1. 这是我们最后一次尝试的设计,但过于简化,冗余会很多。

在那之后,我们尝试搜索并寻找一种可以工作并适合我们以前的设计的设计 table。我们在这里找到了一个,我们对设计做了一些修改,但它也不适合我们,因为 color_id 和 size_id 会发生冗余,而且它不是外键。

我们要设计接受这些情况的 tables:

  1. 我有一个产品有不同的颜色和不同的尺寸,而且尺寸不取决于颜色,反之亦然,它们的价格都一样。

  2. 我有一个产品有不同的颜色和尺寸,但尺寸取决于颜色,例如(颜色:红色)有(尺寸:S、M、L)和(颜色:黑色) 有(尺码:M、L)并且价格不同。

  3. 我有一个产品,它有不同的尺寸,价格变化取决于尺寸,例如产品 table(尺寸:S)和(价格:50 美元)但是(尺码:L)有(价格:100 美元)。但是它没有颜色变体。

产品不会被我们插入,而是一些卖家。颜色和尺寸将是下拉菜单中的所有选项。尺寸将仅根据类别显示。例如,Categories Tops 将只有 (S,M,L,...) 而没有其他尺寸

从实体和关系开始。完成后,每个实体都会获得自己的 table。坚持不懈地理解您的现实世界实体和它们的数据世界表示。

  • 你的product绝对是一个实体。
  • 一个产品variant也是一个实体。
  • 一个product有一个或多个variant。那是一对多的关系。 (如果产品没有尺寸或颜色,variant 是通用的。
  • 每个 variant 都有库存属性,例如 sku_number 和 number_in_stock。

您不能使用 product 来保持库存。考虑一下:您的产品是一件 T 恤。但是你运行出T恤,你运行出小红T恤和你必须从你的供应商那里订购更多。

目前有两个实体:

product :1 to N: variant.

让我们考虑具有产品属性集合的变体。让我们让 attribute 成为一个实体。每个属性都有一个类型:例如 'size'、'color'、'accent_color'。所以你的 attribute table 包含这些列。

attribute_id PK
attribute_type VARCHAR(63)  'size', 'color', ...
attribute_value VARCHAR(63)  '30', 'red', ...

您有一个多对多联接 table variant_attribute。此 table 中存在一行表示变体具有属性。

variant_id    PK 
attribute_id  PK

所以,我们最多三个实体。

product :1 to N: variant :0-N to 0-N: attribute.

四个 table 就完成了,productvariantvariant_attributeattribute

(如果你想完全分开处理颜色和尺寸,你也可以这样做。但我提出的方案是领域可扩展的:如果有人告诉你卖'cold','warm' , 以及明年的 'hot' 种变体,您将不必重新发明轮子。)

这些是重要的实体和关系:它们描述了您的客户订购的商品,以及您必须出售的仓库中的商品。它们需要足够简单以便在午夜对生产进行故障排除,并且具有足够的表现力来代表您的真实世界实体。正确设置架构的那一部分。

然后才添加类别和部分。我无法从你的最后一张图表中看出你想要什么。您可能应该重新访问应用程序的那一部分的实体。

如果你想出售所有红色的东西,你可以这样做:

SELECT p.product_id, 
       p.product_name_ar,
       s.attribute_value size,
       c.attribute_value color,
       v.sku_number,
       v.price
  FROM product p  -- one to many with ...
  JOIN variant v ON p.product_id = v.product_id   -- many to many with ...
  JOIN variant_attribute cva ON v.variant_id = cva.variant_id
  JOIN attribute c   ON cva.attribute_id = c.attribute_id  -- ... color 
                    AND c.attribute_type = 'color'
  JOIN variant_attribute sva ON v.variant_id = sva.variant_id -- ... size
  JOIN attribute s   ON sva.attribute_id = s.attribute_id
                    AND s.attribute_type = 'size'
 WHERE c.attribute_value = 'red';  -- we want the red ones.