Я надеюсь, что название несколько полезно. Я использую MySQL в качестве моей базы данных
Я создаю базу данных продуктов и не уверен, как справляться с хранением цен /SKU вариаций продукта. Продукт может иметь неограниченные вариации, и каждая вариационная комбинация имеет свою цену /SKU/etc..
Вот как у меня на данный момент установлена моя таблица продуктов/вариантов:
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 материала), а Product 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 долларов. С приведенной выше структурой базы данных невозможно обойтись без разбора текста, и этого я хочу избежать.
Любая помощь/предложения приветствуются =)