我希望标题有所帮助.我使用
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美元的蓝色产品.使用上述数据库结构,无法解析文本,这是我想避免的.
任何帮助/建议赞赏=)
解决方法
将规范化应用于您的问题,解决方案如同给定.运行并在小提琴上看到它
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);