Możesz mieć projekt taki jak:
+---------------+ +-------------------+
| 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 |
+---------------+
Z kluczem podstawowym, unikalnym i obcym:
- PRODUKTY
- PK:identyfikator produktu
- Wielka Brytania:nazwa_produktu
- OPCJE
- PK:identyfikator_opcji
- Wielka Brytania:nazwa_opcji
- OPTION_VALUES
- PK:identyfikator_opcji, identyfikator_wartości
- Wielka Brytania:option_id, value_name
- FK:option_id OPCJE ODNIESIENIA (option_id)
- OPCJE_PRODUKTU
- PK:identyfikator produktu, identyfikator opcji
- FK:product_id REFERENCJE PRODUKTY (product_id)
- FK:option_id OPCJE ODNIESIENIA (option_id)
- WARIANTY_PRODUKTU
- PK:identyfikator produktu, identyfikator wariantu
- Wielka Brytania:sku_id
- FK:product_id REFERENCJE PRODUKTY (product_id)
- VARIANT_VALUES
- PK:identyfikator_produktu, identyfikator_wariantu, identyfikator_opcji
- FK:identyfikator_produktu, identyfikator_wariantu REFERENCJE PRODUKT_WARIANTY (identyfikator_produktu, identyfikator_wariantu)
- FK:product_id, option_id REFERENCES PRODUCT_OPTIONS (product_id, option_id)
- FK:option_id, value_id REFERENCES OPTION_VALUES (option_id, value_Id)
Masz:
- PRODUKTY m.in. Koszula, sweter, spodnie
- OPCJE np. Rozmiar, kolor, długość
- WARTOŚCI_OPCJI np. rozmiar — mały, średni, duży; Kolor — czerwony, biały, niebieski
- OPCJE_PRODUKTU np. Koszula - Rozmiar, Kolor; Spodnie — długość, kolor
Następnie musisz utworzyć tablicę n-wymiarową, w której liczba wymiarów jest równa liczbie opcji produktu. Każdy element tablicy odpowiada wariantowi produktu. Dla każdego produktu zawsze będzie co najmniej jeden wariant produktu; ponieważ zawsze istnieje opcja pseudo produktu "tak jak jest"
- PRODUKTY_WARIANTY np. Koszula 1, Koszula 2
- VARIANT_VALUES np. Koszula 1:Mała Czerwona; Koszula 2:mała biała
Możesz chcieć uzyskać weryfikację, aby upewnić się, że kod SKU nie jest przypisany, chyba że określono wartości dla wszystkich opcji związanych z produktem.
Na podstawie arkusza kalkulacyjnego pokazującego, jak widzisz swoje dane, możesz wprowadzić dane do swoich tabel w następujący sposób:
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)
Wydaje się, że w Twoim projekcie nie ma nic, co mogłoby powstrzymać dodawanie wpisu rekordu (product_variant_option_id:2; sku_id 1), dzięki czemu SKU W1SSCW ma teraz obie opcje Small i Large. Nic nie może zatrzymać wpisu rekordu (product_variant_option_id:7; sku_id:1), więc SKU W1SSCW ma również opcję Amateur.
Na podstawie arkusza kalkulacyjnego pokazującego, jak widzisz swoje dane, możesz wprowadzić dane do moich tabel w następujący sposób:
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)
W moim projekcie nie można było wprowadzić dodatkowego rekordu VARIANT_VALUES (id_produktu:1; identyfikator_wariantu:1; identyfikator_opcji:1; identyfikator_wartości:2) — tak, że SKU W1SSCW ma teraz obie opcje Small i Large — ze względu na klucz podstawowy w VARIANT_VALUES oraz istniejący rekord VARIANT_VALUES (id_produktu:1; id_wariantu:1; id_opcji:1; id_wartości:1). W moim projekcie nie można było wprowadzić rekordu VARIANT_VALUES (id_produktu:1; id_wariantu:1; id_opcji:4; id_wartości:1) - więc SKU W1SSCW ma również opcję Amatorski - ze względu na klucz obcy odwołujący się do OPCJI_PRODUKTU i brak rekord w tej tabeli (product_id:1; option_id:4) wskazujący, że Klasa jest prawidłową opcją dla produktu Widget 1.
EDYTUJ :projekt bez tabeli PRODUCT_OPTIONS
Możesz mieć projekt taki jak:
+---------------+ +---------------+
| 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 |
+---------------+
Z kluczem podstawowym, unikalnym i obcym:
- PRODUKTY
- PK:identyfikator produktu
- Wielka Brytania:nazwa_produktu
- OPCJE
- PK:identyfikator produktu, identyfikator opcji
- Wielka Brytania:identyfikator produktu, nazwa_opcji
- OPTION_VALUES
- PK:identyfikator_produktu, identyfikator_opcji, identyfikator_wartości
- Wielka Brytania:product_id, option_id, value_name
- FK:identyfikator produktu, identyfikator opcji ODNIESIENIA OPCJE (id produktu, identyfikator opcji)
- PRODUCT_SKUS
- PK:identyfikator produktu, identyfikator sku
- Wielka Brytania:sku_id
- FK:product_id REFERENCJE PRODUKTY (product_id)
- SKU_VALUES
- PK:identyfikator produktu, identyfikator sku, identyfikator opcji
- FK:product_id, sku_id REFERENCES PRODUCT_SKUS (product_id, sku_id)
- FK:product_id, option_id ODNIESIENIA OPCJE (product_id, option_id)
- FK:product_id, option_id, value_id REFERENCES OPTION_VALUES (product_id, option_id, value_id)
Na podstawie arkusza kalkulacyjnego pokazującego, jak widzisz swoje dane, możesz wprowadzić dane w tych tabelach w następujący sposób:
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)