Podrías tener un diseño como:
+---------------+ +-------------------+
| PRODUCTS |-----< PRODUCT_VARIANTS |
+---------------+ +-------------------+
| #product_id | | #product_id |
| product_name | | #variant_id |
+---------------+ | sku_id |
| +-------------------+
| |
+--------^--------+ +--------^--------+
| PRODUCT_OPTIONS |-----< VARIANT_VALUES |
+-----------------+ +-----------------+
| #product_id | | #product_id |
| #option_id | | #variant_id |
+--------v--------+ | #option_id |
| | value_id |
+-----------------+ +--------v--------+
| OPTIONS | |
+-----------------+ |
| #option_id | |
| option_name | |
+-----------------+ |
| |
+-------^-------+ |
| OPTION_VALUES |---------------+
+---------------+
| #option_id |
| #value_id |
| value_name |
+---------------+
Con las Claves Primaria, Única y Foránea:
- PRODUCTOS
- PK:id_producto
- Reino Unido:nombre_producto
- OPCIONES
- PK:option_id
- Reino Unido:option_name
- VALORES_OPCIONES
- PK:option_id, value_id
- Reino Unido:option_id, value_name
- FK:option_id REFERENCIAS OPCIONES (option_id)
- OPCIONES_DE_PRODUCTOS
- PK:product_id, option_id
- FK:product_id REFERENCIAS PRODUCTOS (product_id)
- FK:option_id REFERENCIAS OPCIONES (option_id)
- VARIANTES_DE_PRODUCTO
- PK:product_id, variant_id
- Reino Unido:sku_id
- FK:product_id REFERENCIAS PRODUCTOS (product_id)
- VALORES_VARIANTES
- PK:product_id, variant_id, option_id
- FK:product_id, variant_id REFERENCIAS PRODUCT_VARIANTS (product_id, variant_id)
- FK:product_id, option_id REFERENCIAS PRODUCT_OPTIONS (product_id, option_id)
- FK:option_id, value_id REFERENCIAS OPTION_VALUES (option_id, value_Id)
Tienes:
- PRODUCTOS, p. Camisa, Jersey, Pantalones
- OPCIONES p. ej. Tamaño, color, longitud
- OPTION_VALUES, por ejemplo, Tamaño:pequeño, mediano, grande; Color:rojo, blanco, azul
- OPCIONES_DE_PRODUCTO p. ej. Camisa - Talla, Color; Pantalones - Largo, Color
Luego debe crear una matriz n-dimensional, con el número de dimensiones igual al número de opciones para el producto. Cada elemento de la matriz corresponde a una variante del producto. Siempre habrá al menos una variante de producto para cada producto; ya que siempre existe la pseudo opción del producto "tal cual"
- PRODUCT_VARIANTS, por ejemplo, camiseta 1, camiseta 2
- VARIANT_VALUES, por ejemplo, camiseta 1:pequeña roja; Camiseta 2:Blanca Pequeña
Es posible que desee tener una validación para garantizar que no se asigne un SKU a menos que se hayan especificado valores para todas las opciones asociadas con un producto.
Según la hoja de cálculo de cómo ve sus datos, podría ingresar datos en sus tablas de la siguiente manera:
PRODUCTS
========
id name
--- --------
1 Widget 1
2 Widget 2
3 Widget 3
PRODUCT_VARIANTS
================
id product_id name
--- ---------- ------
1 1 Size (Widget 1)
2 1 Color (Widget 1)
3 2 Size (Widget 2)
4 3 Class (Widget 3)
5 3 Size (Widget 3)
PRODUCT_VARIANT_OPTIONS
=======================
id product_variant_id name
--- ------------------ -------------
1 1 Small (Widget 1; Size)
2 1 Large (Widget 1; Size)
3 2 White (Widget 1; Color)
4 2 Black (Widget 1; Color)
5 3 Small (Widget 2; Size)
6 3 Medium (Widget 2; Size)
7 4 Amateur (Widget 3; Class)
8 4 Professional (Widget 3; Class)
9 5 Medium (Widget 3; Size)
10 5 Large (Widget 3; Size)
SKUS
====
id product_id sku price
--- ---------- ------ -----
1 1 W1SSCW 10 (Widget 1)
2 1 W1SSCB 10 (Widget 1)
3 1 W1SLCW 12 (Widget 1)
4 1 W1SLCB 15 (Widget 1)
5 2 W2SS 100 (Widget 2)
6 2 W2SM 100 (Widget 2)
7 3 W3CASM 50 (Widget 3)
8 3 W3CASL 50 (Widget 3)
9 3 W3CPSM 150 (Widget 3)
10 3 W3CPSL 160 (Widget 3)
PRODUCT_VARIANT_OPTION_COMBINATIONS
===================================
product_variant_option_id sku_id
------------------------- ------
1 1 (W1SSCW; Size; Small)
3 1 (W1SSCW; Color; White)
1 2 (W1SSCB; Size; Small)
4 2 (W1SSCB; Color; Black)
2 3 (W1SLCW; Size; Large)
3 3 (W1SLCW; Color; White)
2 4 (W1SLCB; Size; Large)
4 4 (W1SLCB; Color; Black)
5 5 (W2SS; Size; Small)
6 6 (W2SM; Size; Medium)
7 7 (W3CASM; Class; Amateur)
9 7 (W3CASM; Size; Medium)
7 8 (W3CASL; Class; Amateur)
10 8 (W3CASL; Size; Large)
8 9 (W3CPSM; Class; Professional)
9 9 (W3CPSM; Size; Medium)
8 10 (W3CPSL; Class; Professional)
10 10 (W3CPSL; Size; Large)
Parece que no hay nada en su diseño que detenga la adición de la entrada del registro (product_variant_option_id:2; sku_id 1), por lo que SKU W1SSCW tiene ahora las opciones Small y Large. No hay nada que detenga la entrada del registro (product_variant_option_id:7; sku_id:1) para que SKU W1SSCW también tenga la opción Amateur.
Según la hoja de cálculo de cómo ve sus datos, podría ingresar datos en mis tablas de la siguiente manera:
PRODUCTS
========
product_id product_name
---------- ------------
1 Widget 1
2 Widget 2
3 Widget 3
OPTIONS
=======
option_id option_name
--------- -----------
1 Size SL
2 Color
3 Size SM
4 Class
5 Size ML
OPTION_VALUES
=============
option_id value_id value_name
--------- -------- ------------
1 1 Small (Size SL)
1 2 Large (Size SL)
2 1 White (Color)
2 2 Black (Color)
3 1 Small (Size SM)
3 2 Medium (Size SM)
4 1 Amateur (Class)
4 2 Professional (Class)
5 1 Medium (Size ML)
5 2 Large (Size ML)
PRODUCT_OPTIONS
===============
product_id option_id
---------- ---------
1 1 (Widget 1; Size SL)
1 2 (Widget 1; Color)
2 3 (Widget 2; Size SM)
3 4 (Widget 3; Class)
3 5 (Widget 4; Size ML)
PRODUCT_VARIANTS
================
product_id variant_id sku_id
---------- ---------- ------
1 1 W1SSCW (Widget 1)
1 2 W1SSCB (Widget 1)
1 3 W1SLCW (Widget 1)
1 4 W1SLCB (Widget 1)
2 1 W2SS (Widget 2)
2 2 W2SM (Widget 2)
3 1 W3CASM (Widget 3)
3 2 W3CASL (Widget 3)
3 3 W3CPSM (Widget 3)
3 4 W3CPSL (Widget 3)
VARIANT_VALUES
==============
product_id variant_id option_id value_id
---------- ---------- --------- --------
1 1 1 1 (W1SSCW; Size SL; Small)
1 1 2 1 (W1SSCW; Color; White)
1 2 1 1 (W1SSCB; Size SL; Small)
1 2 2 2 (W1SSCB; Color; Black)
1 3 1 2 (W1SLCW; Size SL; Large)
1 3 2 1 (W1SLCW; Color; White)
1 4 1 2 (W1SLCB; Size SL; Large)
1 4 2 2 (W1SLCB; Color; Black)
2 1 3 1 (W2SS; Size SM; Small)
2 2 3 2 (W2SM; Size SM; Medium)
3 1 4 1 (W3CASM; Class; Amateur)
3 1 5 1 (W3CASM; Size ML; Medium)
3 2 4 1 (W3CASL; Class; Amateur)
3 2 5 2 (W3CASL; Size ML; Large)
3 3 4 2 (W3CPSM; Class; Professional)
3 3 5 1 (W3CPSM; Size ML; Medium)
3 4 4 2 (W3CPSL; Class; Professional)
3 4 5 2 (W3CPSL; Size ML; Large)
En mi diseño, no pudo ingresar el registro VARIANT_VALUES adicional (product_id:1; variant_id:1; option_id:1; value_id:2), por lo que SKU W1SSCW ahora tiene las opciones Small y Large, debido a la clave principal en VARIANT_VALUES y el registro VARIANT_VALUES existente (product_id:1; variant_id:1; option_id:1; value_id:1). En mi diseño, no pudo ingresar el registro VARIANT_VALUES (product_id:1; variant_id:1; option_id:4; value_id:1), por lo que SKU W1SSCW también tiene la opción Amateur, debido a la clave externa que hace referencia a PRODUCT_OPTIONS y la falta de un registro en esta tabla de (product_id:1; option_id:4) que indica que Class es una opción válida para el producto Widget 1.
EDITAR :Diseño sin tabla PRODUCT_OPTIONS
Podrías tener un diseño como:
+---------------+ +---------------+
| PRODUCTS |-----< PRODUCT_SKUS |
+---------------+ +---------------+
| #product_id | | #product_id |
| product_name | | #sku_id |
+---------------+ | sku |
| | price |
| +---------------+
| |
+-------^-------+ +------^------+
| OPTIONS |------< SKU_VALUES |
+---------------+ +-------------+
| #product_id | | #product_id |
| #option_id | | #sku_id |
| option_name | | #option_id |
+---------------+ | value_id |
| +------v------+
+-------^-------+ |
| OPTION_VALUES |-------------+
+---------------+
| #product_id |
| #option_id |
| #value_id |
| value_name |
+---------------+
Con las Claves Primaria, Única y Foránea:
- PRODUCTOS
- PK:id_producto
- Reino Unido:nombre_producto
- OPCIONES
- PK:product_id, option_id
- Reino Unido:product_id, option_name
- VALORES_OPCIONES
- PK:product_id, option_id, value_id
- Reino Unido:product_id, option_id, value_name
- FK:product-id, option_id REFERENCIAS OPCIONES (product_id, option_id)
- SKU_PRODUCTO
- PK:product_id, sku_id
- Reino Unido:sku_id
- FK:product_id REFERENCIAS PRODUCTOS (product_id)
- SKU_VALUES
- PK:product_id, sku_id, option_id
- FK:product_id, sku_id REFERENCIAS PRODUCT_SKUS (product_id, sku_id)
- FK:product_id, option_id REFERENCIAS OPCIONES (product_id, option_id)
- FK:product_id, option_id, value_id REFERENCIAS OPTION_VALUES (product_id, option_id, value_id)
Según la hoja de cálculo de cómo ve sus datos, podría ingresar datos en estas tablas de la siguiente manera:
PRODUCTS
========
product_id product_name
---------- ------------
1 Widget 1
2 Widget 2
3 Widget 3
OPTIONS
=======
product_id option_id option_name
---------- --------- -----------
1 1 Size (Widget 1)
1 2 Color (Widget 1)
2 1 Size (Widget 2)
3 1 Class (Widget 3)
3 2 Size (Widget 3)
OPTION_VALUES
=============
product_id option_id value_id value_name
---------- --------- -------- ------------
1 1 1 Small (Widget1; Size)
1 1 2 Large (Widget1; Size)
1 2 1 White (Widget1; Color)
1 2 2 Black (Widget1; Color)
2 1 1 Small (Widget2; Size)
2 1 2 Medium (Widget2; Size)
3 1 1 Amateur (Widget3; Class)
3 1 2 Professional (Widget3; Class)
3 2 1 Medium (Widget3; Size)
3 2 2 Large (Widget3; Size)
PRODUCT_SKUS
============
product_id sku_id sku
---------- ------ ------
1 1 W1SSCW (Widget 1)
1 2 W1SSCB (Widget 1)
1 3 W1SLCW (Widget 1)
1 4 W1SLCB (Widget 1)
2 1 W2SS (Widget 2)
2 2 W2SM (Widget 2)
3 1 W3CASM (Widget 3)
3 2 W3CASL (Widget 3)
3 3 W3CPSM (Widget 3)
3 4 W3CPSL (Widget 3)
SKU_VALUES
==========
product_id sku_id option_id value_id
---------- ------ --------- --------
1 1 1 1 (W1SSCW; Size; Small)
1 1 2 1 (W1SSCW; Color; White)
1 2 1 1 (W1SSCB; Size; Small)
1 2 2 2 (W1SSCB; Color; Black)
1 3 1 2 (W1SLCW; Size; Large)
1 3 2 1 (W1SLCW; Color; White)
1 4 1 2 (W1SLCB; Size; Large)
1 4 2 2 (W1SLCB; Color; Black)
2 1 1 1 (W2SS; Size; Small)
2 2 1 2 (W2SM; Size; Medium)
3 1 1 1 (W3CASM; Class; Amateur)
3 1 2 1 (W3CASM; Size; Medium)
3 2 1 1 (W3CASL; Class; Amateur)
3 2 2 2 (W3CASL; Size; Large)
3 3 1 2 (W3CPSM; Class; Professional)
3 3 2 1 (W3CPSM; Size; Medium)
3 4 1 2 (W3CPSL; Class; Professional)
3 4 2 2 (W3CPSL; Size; Large)