根据变体和价格为产品设计数据库模式
Database schema design for products depending on the variants and prices
我们正在为电子商务应用程序和网站设计数据库。我们遇到了阻碍我们进行搜索和试验的障碍,但 none 的解决方案有效,因为数据中会有冗余。
我们做了一些我们拒绝的设计。我不会展示所有的设计,但我会在这里展示其中的一些以及我们即将实现的最后一个设计。
- 这是我们拒绝的第一个设计,因为它过度规范化并且过于复杂。
- 第二个设计也是一样。
- 这是我们最后一次尝试的设计,但过于简化,冗余会很多。
在那之后,我们尝试搜索并寻找一种可以工作并适合我们以前的设计的设计 table。我们在这里找到了一个,我们对设计做了一些修改,但它也不适合我们,因为 color_id 和 size_id 会发生冗余,而且它不是外键。
我们要设计接受这些情况的 tables:
我有一个产品有不同的颜色和不同的尺寸,而且尺寸不取决于颜色,反之亦然,它们的价格都一样。
我有一个产品有不同的颜色和尺寸,但尺寸取决于颜色,例如(颜色:红色)有(尺寸:S、M、L)和(颜色:黑色) 有(尺码:M、L)并且价格不同。
我有一个产品,它有不同的尺寸,价格变化取决于尺寸,例如产品 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 就完成了,product
,variant
,variant_attribute
,attribute
(如果你想完全分开处理颜色和尺寸,你也可以这样做。但我提出的方案是领域可扩展的:如果有人告诉你卖'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.
我们正在为电子商务应用程序和网站设计数据库。我们遇到了阻碍我们进行搜索和试验的障碍,但 none 的解决方案有效,因为数据中会有冗余。
我们做了一些我们拒绝的设计。我不会展示所有的设计,但我会在这里展示其中的一些以及我们即将实现的最后一个设计。
- 这是我们拒绝的第一个设计,因为它过度规范化并且过于复杂。
- 第二个设计也是一样。
- 这是我们最后一次尝试的设计,但过于简化,冗余会很多。
在那之后,我们尝试搜索并寻找一种可以工作并适合我们以前的设计的设计 table。我们在这里找到了一个,我们对设计做了一些修改,但它也不适合我们,因为 color_id 和 size_id 会发生冗余,而且它不是外键。
我们要设计接受这些情况的 tables:
我有一个产品有不同的颜色和不同的尺寸,而且尺寸不取决于颜色,反之亦然,它们的价格都一样。
我有一个产品有不同的颜色和尺寸,但尺寸取决于颜色,例如(颜色:红色)有(尺寸:S、M、L)和(颜色:黑色) 有(尺码:M、L)并且价格不同。
我有一个产品,它有不同的尺寸,价格变化取决于尺寸,例如产品 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 就完成了,product
,variant
,variant_attribute
,attribute
(如果你想完全分开处理颜色和尺寸,你也可以这样做。但我提出的方案是领域可扩展的:如果有人告诉你卖'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.