La conception d'un schéma SQL pour une combinaison de plusieurs-à-plusieurs relations (des variations de produits)

J'espère que le titre est quelque peu utile. Je suis en utilisant MySQL comme ma base de données

Je suis la construction d'une base de données de produits et je suis pas sûr de la façon de gérer le stockage de prix/SKU des variantes d'un même produit. Un produit peut avoir illimité de variations, et chaque variation de la combinaison a son propre prix/STOCK/etc..

C'est de cette façon que j'ai mes produits et/ou des variations de table à l'instant:

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`)

J'ai créé un SQLFiddle avec cet exemple de données: http://sqlfiddle.com/#!2/2264d/1

L'utilisateur est autorisé à accéder à toute variation de nom (product_variants.variant) et peut attribuer une valeur (product_variants.value). Il ne devrait pas être une limite à la quantité de variations de valeurs ou un utilisateur peut entrer.

C'est là que mon problème se pose: le stockage de prix/SKU pour chaque variation sans l'ajout d'une nouvelle table/colonne chaque fois que quelqu'un ajoute un produit avec une variante qui n'existaient pas avant.

Chaque variante peut avoir le même prix, mais la référence est unique à chaque produit.
Par exemple Produit 1 a 6 combinaisons différentes (3 couleurs * 2 matériaux) et le Produit 2 a seulement 3 différentes combinaisons (3 tailles * 1).

J'ai pensé à stocker les combinaisons comme un texte, j'.e:

+------------+-----------------+-------+------+
| 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 |
+------------+-----------------+-------+------+

Mais il doit y avoir un mieux, normalisé, la manière de représenter ces données. Situation hypothétique: je veux être en mesure de rechercher un produit bleu qui est inférieur à 10$. Avec la structure de base de données, il n'est pas possible de le faire sans l'analyse du texte et c'est quelque chose que je veux éviter.

Toute aide/suggestions sont appréciés =)

OriginalL'auteur Xecure | 2013-10-02