sql - 为多对多关系的组合设计 SQL 模式(产品的变体)

标签 sql schema e-commerce database-schema entity-attribute-value

希望标题对您有所帮助。我使用 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/

相关文章:

mysql - 一个查询中较大的结果集*和*总结果集计数的分页 block ?

python - 更新字段可能为空的 SQL 表

nhibernate - 数据库建模或数据库设计: Which comes first?

node.js - 使用 Mongoose 在对象 ids 数组中查找对象 id 返回空数组

ruby-on-rails - 修复 Internet Explorer 8/9(仅限)显示 : IDs/Classes recognized by CSS but not functioning properly 的宽度问题

javascript - Magento Theme 在 IE (Javascript) 中将产品添加到购物车 2x

mysql - 最有效的 MySQL 查询来获取订单中的所有项目 - 如果任何一个项目满足条件

mysql - 等效于 MySQL ON DUPLICATE KEY UPDATE in Sql Server

php - 在 php 和 mysql 中从数据库组织问题和答案

mysql - 帮助我将 give ms access 查询转换为 MySQL 查询?