设计一个多对多关系的组合的SQL模式(产品的变体)

前端之家收集整理的这篇文章主要介绍了设计一个多对多关系的组合的SQL模式(产品的变体)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我希望标题有所帮助.我使用 MySQL作为我的数据库

我正在建立一个产品数据库,不知道如何处理存储价格/产品变化的SKU.产品可能有无限的变化,每种变化组合都有自己的价格/ SKU /等等.

这是我现在有我的产品/变化表设置:

PRODUCTS
+--------------------------+
| id | name | description  |
+----+------+--------------+
| 1  | rug  | a cool rug   |
| 2  | cup  | a coffee cup |
+----+------+--------------+

PRODUCT_VARIANTS
+----+------------+----------+-----------+
| id | product_id | variant  | value     |
+----+------------+----------+-----------+
| 1  | 1          | color    | red       |
| 2  | 1          | color    | blue      |
| 3  | 1          | color    | green     |
| 4  | 1          | material | wool      |
| 5  | 1          | material | polyester |
| 6  | 2          | size     | small     |
| 7  | 2          | size     | medium    |
| 8  | 2          | size     | large     |
+----+------------+----------+-----------+

(`products.id` is a foreign key of `product_variants.product_id`)

我创建了一个sqlFiddle这个示例数据:http://sqlfiddle.com/#!2/2264d/1

允许用户输入任何变体名称(product_variants.variant),并可以为其分配任何值(product_variants.value).不应该限制用户可能输入的变化/值的数量.

这就是我的问题出现的地方:存储每个变体的价格/ SKU,而每次有人添加一个以前不存在的变体的产品时,不添加新的表/列.

每个变体可能具有相同的价格,但SKU是每个产品唯一的.
例如,产品1具有6种不同的组合(3种颜色* 2种材料),而产品2只有3种不同的组合(3种尺寸* 1).

我已经考虑把这些组合作为文本存储,即:

+------------+-----------------+-------+------+
| product_id | combination     | price | SKU  |
+------------+-----------------+-------+------+
| 1          | red-wool        | 50.00 | A121 |
| 1          | red-polyester   | 50.00 | A122 |
| 1          | blue-wool       | 50.00 | A123 |
| 1          | blue-polyester  | 50.00 | A124 |
| 1          | green-wool      | 50.00 | A125 |
| 1          | green-polyester | 50.00 | A125 |
| 2          | small           | 4.00  | CD12 |
| 2          | medium          | 4.00  | CD13 |
| 2          | large           | 3.50  | CD14 |
+------------+-----------------+-------+------+

但是,必须有一个更好的,归一化的方式来表示这些数据.假设情况:我想要搜索一个小于10美元的蓝色产品.使用上述数据库结构,无法解析文本,这是我想避免的.

任何帮助/建议赞赏=)

解决方法

将规范化应用于您的问题,解决方案如同给定.运行并在小提琴上看到它

Fiddle

CREATE TABLE products 
    (
     product_id int auto_increment primary key,name varchar(20),description varchar(30)

    );

INSERT INTO products
(name,description)
VALUES
('Rug','A cool rug'  ),('Cup','A coffee cup');

create table variants (variant_id int auto_increment primary key,variant varchar(50)
                       );
insert into variants (variant)
values ('color'),('material'),('size') ;   
create table variant_value(value_id int auto_increment primary key,variant_id int,value varchar(50)
                           );

insert into variant_value (variant_id,value)
values (1,'red'),(1,'blue'),'green'),(2,'wool'),'polyester'),(3,'small'),'medium'),'large');



create table product_Variants( product_Variants_id int  auto_increment primary key,product_id int,productVariantName varchar(50),sku varchar(50),price float
                            );




create table product_details(product_detail_id int auto_increment primary key,product_Variants_id int,value_id int
                             );

insert into product_Variants(product_id,productVariantName,sku,price)
values (1,'red-wool','a121',50);

insert into product_details(product_Variants_id,value_id)
values( 1,1),4);

insert into product_Variants(product_id,'red-polyester','a122',value_id)
values( 2,5);

猜你在找的MsSQL相关文章