sql >> Base de Datos >  >> RDS >> Mysql

Modelado de variantes de productos

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)