Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Produktvarianten modellieren

Sie könnten ein Design haben wie:

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

Mit den primären, eindeutigen und fremden Schlüsseln:

  • PRODUKTE
    • PK:Produkt-ID
    • UK:Produktname
  • OPTIONEN
    • PK:Options-ID
    • UK:Optionsname
  • OPTION_VALUES
    • PK:Options-ID, Wert-ID
    • UK:Options-ID, Wertname
    • FK:option_id VERWEISE OPTIONEN (option_id)
  • PRODUCT_OPTIONS
    • PK:Produkt-ID, Options-ID
    • FK:product_id REFERENZEN PRODUKTE (product_id)
    • FK:option_id VERWEISE OPTIONEN (option_id)
  • PRODUCT_VARIANTS
    • PK:Produkt-ID, Varianten-ID
    • Großbritannien:sku_id
    • FK:product_id REFERENZEN PRODUKTE (product_id)
  • VARIANT_VALUES
    • PK:Produkt-ID, Varianten-ID, Options-ID
    • FK:Produkt_ID, Varianten_ID REFERENZEN PRODUKT_VARIANTEN (Produkt_ID, Varianten_ID)
    • FK:product_id, option_id REFERENCES PRODUCT_OPTIONS (product_id, option_id)
    • FK:option_id, value_id REFERENCES OPTION_VALUES (option_id, value_Id)

Sie haben:

  • PRODUKTE z.B. Hemd, Pullover, Hose
  • OPTIONEN z.B. Größe, Farbe, Länge
  • OPTION_VALUES z. B. Größe - Klein, Mittel, Groß; Farbe - Rot, Weiß, Blau
  • PRODUCT_OPTIONS z.B. Shirt - Größe, Farbe; Hose - Länge, Farbe

Sie müssen dann ein n-dimensionales Array erstellen, wobei die Anzahl der Dimensionen der Anzahl der Optionen für das Produkt entspricht. Jedes Element im Array entspricht einer Produktvariante. Für jedes Produkt wird es immer mindestens eine Produktvariante geben; da es immer die Pseudo-Option des Produkts "as-is" gibt

  • PRODUCT_VARIANTS z. B. Shirt 1, Shirt 2
  • VARIANT_VALUES z. B. Shirt 1:klein rot; Shirt 2:Kleines Weiß

Möglicherweise möchten Sie eine Validierung durchführen lassen, um sicherzustellen, dass eine SKU nicht zugewiesen wird, es sei denn, es wurden Werte für alle Optionen angegeben, die einem Produkt zugeordnet sind.

Basierend auf der Tabelle, wie Sie Ihre Daten sehen, könnten Sie wie folgt Daten in Ihre Tabellen eingeben:

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)

Es scheint nichts in Ihrem Design zu geben, das das Hinzufügen des Eintrags des Datensatzes (product_variant_option_id:2; sku_id 1) verhindert, sodass SKU W1SSCW jetzt sowohl die Optionen Small als auch Large hat. Dem Eintrag des Datensatzes (product_variant_option_id:7; sku_id:1) steht nichts im Wege, sodass die SKU W1SSCW auch die Option Amateur hat.

Basierend auf der Tabelle, wie Sie Ihre Daten sehen, könnten Sie wie folgt Daten in meine Tabellen eingeben:

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 meinem Design konnten Sie den zusätzlichen VARIANT_VALUES-Datensatz (product_id:1; variation_id:1; option_id:1; value_id:2) nicht eingeben - so dass SKU W1SSCW jetzt sowohl die Optionen Small als auch Large hat - aufgrund des Primärschlüssels auf VARIANT_VALUES und der vorhandene VARIANT_VALUES-Datensatz (product_id:1; variation_id:1; option_id:1; value_id:1). In meinem Design konnten Sie den VARIANT_VALUES-Datensatz (product_id:1; variation_id:1; option_id:4; value_id:1) nicht eingeben - so dass SKU W1SSCW auch die Option Amateur hat - aufgrund des Fremdschlüssels, der auf PRODUCT_OPTIONS verweist, und des Fehlens von a Eintrag in dieser Tabelle (product_id:1; option_id:4), der angibt, dass Klasse eine gültige Option für Produkt-Widget 1 ist.

BEARBEITEN :Design ohne PRODUCT_OPTIONS-Tabelle

Sie könnten ein Design haben wie:

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

Mit den primären, eindeutigen und fremden Schlüsseln:

  • PRODUKTE
    • PK:Produkt-ID
    • UK:Produktname
  • OPTIONEN
    • PK:Produkt-ID, Options-ID
    • UK:Produkt-ID, Optionsname
  • OPTION_VALUES
    • PK:Produkt-ID, Options-ID, Wert-ID
    • UK:Produkt-ID, Options-ID, Wertname
    • FK:Produkt-ID, Options-ID REFERENZEN OPTIONEN (Produkt-ID, Options-ID)
  • PRODUCT_SKUS
    • PK:product_id, sku_id
    • Großbritannien:sku_id
    • FK:product_id REFERENZEN PRODUKTE (product_id)
  • SKU_VALUES
    • PK:product_id, sku_id, option_id
    • FK:product_id, sku_id VERWEISE PRODUCT_SKUS (product_id, sku_id)
    • FK:product_id, option_id REFERENZEN OPTIONEN (product_id, option_id)
    • FK:product_id, option_id, value_id REFERENCES OPTION_VALUES (product_id, option_id, value_id)

Basierend auf der Tabelle, wie Sie Ihre Daten sehen, könnten Sie wie folgt Daten in diese Tabellen eingeben:

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)