sql >> Database >  >> RDS >> Mysql

Productvarianten modelleren

Je zou een ontwerp kunnen hebben als:

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

Met de primaire, unieke en buitenlandse sleutels:

  • PRODUCTEN
    • PK:product_id
    • VK:product_name
  • OPTIES
    • PK:option_id
    • VK:option_name
  • OPTION_VALUES
    • PK:option_id, value_id
    • VK:option_id, value_name
    • FK:option_id REFERENTIES OPTIES (option_id)
  • PRODUCT_OPTIONS
    • PK:product_id, option_id
    • FK:product_id REFERENTIES PRODUCTEN (product_id)
    • FK:option_id REFERENTIES OPTIES (option_id)
  • PRODUCT_VARIANTS
    • PK:product_id, variant_id
    • VK:sku_id
    • FK:product_id REFERENTIES PRODUCTEN (product_id)
  • VARIANT_VALUES
    • PK:product_id, variant_id, option_id
    • FK:product_id, variant_id REFERENCES PRODUCT_VARIANTS (product_id, variant_id)
    • FK:product_id, option_id REFERENTIES PRODUCT_OPTIONS (product_id, option_id)
    • FK:option_id, value_id REFERENCES OPTION_VALUES (option_id, value_Id)

Je hebt:

  • PRODUCTEN bijv. Shirt, trui, broek
  • OPTIES bijv. Maat, Kleur, Lengte
  • OPTION_VALUES bijv. Grootte - Small, Medium, Large; Kleur - Rood, Wit, Blauw
  • PRODUCT_OPTIONS bijv. Overhemd - Maat, Kleur; Broek - lengte, kleur

Je moet dan een n-dimensionale array maken, waarbij het aantal dimensies gelijk is aan het aantal opties voor het product. Elk element in de array komt overeen met een productvariant. Per product is er altijd minimaal één productvariant; aangezien er altijd de pseudo-optie van het product "as-is" is

  • PRODUCT_VARIANTS bijv. Shirt 1, Shirt 2
  • VARIANT_VALUES bijv. Shirt 1:klein rood; Shirt 2:Klein Wit

Mogelijk wilt u validatie om ervoor te zorgen dat er geen SKU wordt toegewezen, tenzij er waarden zijn opgegeven voor alle opties die aan een product zijn gekoppeld.

Op basis van de spreadsheet met hoe u uw gegevens ziet, kunt u als volgt gegevens in uw tabellen invoeren:

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)

Er lijkt niets in uw ontwerp te zijn dat de toevoeging van de vermelding van het record (product_variant_option_id:2; sku_id 1) stopt, zodat SKU W1SSCW nu zowel de opties Small als Large heeft. Er is niets dat de invoer van het record (product_variant_option_id:7; sku_id:1) tegenhoudt, zodat SKU W1SSCW ook de optie Amateur heeft.

Op basis van de spreadsheet met hoe u uw gegevens ziet, kunt u als volgt gegevens in mijn tabellen invoeren:

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)

In mijn ontwerp kon je de extra VARIANT_VALUES-record (product_id:1; variant_id:1; option_id:1; value_id:2) - zodat SKU W1SSCW nu zowel de opties Small als Large heeft - vanwege de primaire sleutel op VARIANT_VALUES en de bestaande VARIANT_VALUES-record (product_id:1; variant_id:1; option_id:1; value_id:1). In mijn ontwerp kon je de VARIANT_VALUES-record (product_id:1; variant_id:1; option_id:4; value_id:1) - zodat SKU W1SSCW ook de optie Amateur heeft - vanwege de externe sleutel die verwijst naar PRODUCT_OPTIONS en het ontbreken van een noteer in deze tabel (product_id:1; option_id:4) wat aangeeft dat Class een geldige optie is voor product Widget 1.

BEWERKEN :Ontwerp zonder PRODUCT_OPTIONS tabel

Je zou een ontwerp kunnen hebben als:

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

Met de primaire, unieke en buitenlandse sleutels:

  • PRODUCTEN
    • PK:product_id
    • VK:product_name
  • OPTIES
    • PK:product_id, option_id
    • VK:product_id, option_name
  • OPTION_VALUES
    • PK:product_id, option_id, value_id
    • VK:product_id, option_id, value_name
    • FK:product-id, option_id REFERENTIES OPTIES (product_id, option_id)
  • PRODUCT_SKUS
    • PK:product_id, sku_id
    • VK:sku_id
    • FK:product_id REFERENTIES PRODUCTEN (product_id)
  • SKU_VALUES
    • PK:product_id, sku_id, option_id
    • FK:product_id, sku_id REFERENTIES PRODUCT_SKUS (product_id, sku_id)
    • FK:product_id, option_id REFERENTIES OPTIES (product_id, option_id)
    • FK:product_id, option_id, value_id REFERENCES OPTION_VALUES (product_id, option_id, value_id)

Op basis van de spreadsheet met hoe u uw gegevens ziet, kunt u als volgt gegevens in deze tabellen invoeren:

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)



  1. Retourneer een DML-triggertype op een tabel in SQL Server

  2. Migreren van MSSQL naar PostgreSQL - wat u moet weten

  3. Interne SQL Server:Plan Caching Pt. I – Plannen hergebruiken

  4. SQL Buddy - Een webgebaseerd MySQL-beheerprogramma