希望标题对您有所帮助。我使用 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 种 Material ),而产品 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 美元的蓝色产品。使用上述数据库结构,如果不解析文本就不可能完成,这是我想避免的事情。
任何帮助/建议表示赞赏 =)
最佳答案
对您的问题应用标准化,解决方案如下。运行并在 SQL 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'),
(1, 'green'),
(2, 'wool'),
(2, 'polyester'),
(3, 'small'),
(3, 'medium'),
(3, 'large');
-- ========================================
CREATE TABLE product_variants (
product_variants_id int AUTO_INCREMENT PRIMARY KEY,
product_id int,
productvariantname varchar(50),
sku varchar(50),
price float
);
INSERT INTO product_variants
(product_id, productvariantname, sku, price)
VALUES
(1, 'red-wool', 'a121', 50),
(1, 'red-polyester', 'a122', 50);
-- ========================================
CREATE TABLE product_details (
product_detail_id int AUTO_INCREMENT PRIMARY KEY,
product_variants_id int,
value_id int
);
INSERT INTO product_details
(product_variants_id, value_id)
VALUES
(1, 1),
(1, 4),
(2, 1),
(2, 5);
关于sql - 为多对多关系的组合设计 SQL 模式(产品的变体),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19144200/