【问题标题】:Database schema design for products depending on the variants and prices取决于变体和价格的产品数据库模式设计
【发布时间】:2022-01-25 06:35:28
【问题描述】:

我们正在为电子商务应用程序和网站设计数据库。我们遇到了一个障碍,使我们在搜索和试验中倒退了,但没有一个解决方案奏效,因为数据中存在冗余。

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

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

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

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

之后,我们尝试搜索并寻找一种设计,该设计将适用于我们之前的设计并适合其他桌子。我们在这里找到了一个,我们对设计进行了一些修改,但它也不适合我们,因为 color_id 和 size_id 会发生冗余,而且它不是外键。

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

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

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

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

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

【问题讨论】:

标签: mysql database-design relational-database entity-attribute-value


【解决方案1】:

从实体和关系开始。完成后,每个实体都会获得自己的表格。对了解您的真实世界实体及其在数据世界中的表示方式保持谨慎。

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

您不能使用product 来保持库存。考虑一下:您的产品是一件 T 恤。但是您并没有用完 T 恤,而是用完了 红色小 T 恤,您必须从供应商处订购更多。

目前有两个实体:

product:1 到 N:variant.

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

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

您有一个多对多连接表variant_attribute。此表中存在一行意味着该变体具有该属性。

variant_id    PK 
attribute_id  PK

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

product:1 到 N:variant:0-N 到 0-N:attribute

这是用四个表完成的,productvariantvariant_attributeattribute

(如果你想完全分开处理颜色和尺寸,你也可以这样做。但我提出的方案是可扩展的:如果有人告诉你销售“冷”、“暖”和“热”变体明年你就不必重新发明轮子了。)

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

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

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

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.

【讨论】:

  • 谢谢。对您的评论的回复表明您不明白我为什么使用这些类别。这是因为我只想显示每个类别的尺寸,而不是所有尺寸。我想说的是,我试图限制在添加产品时向卖家展示的尺码数量,并且只显示他选择的类别中的尺码。
猜你喜欢
  • 2011-11-27
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
相关资源
最近更新 更多