Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pemodelan Varian Produk

Anda bisa memiliki desain seperti:

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

Dengan Kunci Utama, Unik, dan Asing:

  • PRODUK
    • PK:product_id
    • Inggris Raya:product_name
  • OPSI
    • PK:option_id
    • Inggris Raya:option_name
  • OPTION_VALUES
    • PK:option_id, value_id
    • Inggris Raya:option_id, value_name
    • FK:option_id REFERENSI OPSI (option_id)
  • PRODUCT_OPTIONS
    • PK:product_id, option_id
    • FK:product_id REFERENSI PRODUK (product_id)
    • FK:option_id REFERENSI OPSI (option_id)
  • PRODUCT_VARIANTS
    • PK:product_id, varian_id
    • Inggris Raya:sku_id
    • FK:product_id REFERENSI PRODUK (product_id)
  • VARIANT_VALUES
    • PK:product_id, varian_id, option_id
    • FK:product_id, varian_id REFERENCES PRODUCT_VARIANTS (product_id, variant_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)

Anda memiliki:

  • PRODUK mis. Kemeja, Jumper, Celana
  • OPSI mis. Ukuran, Warna, Panjang
  • OPTION_VALUES mis. Ukuran - Kecil, Sedang, Besar; Warna - Merah, Putih, Biru
  • PRODUCT_OPTIONS mis. Kemeja - Ukuran, Warna; Celana - Panjang, Warna

Anda kemudian perlu membuat larik n-dimensi, dengan jumlah dimensi yang sama dengan jumlah opsi untuk produk. Setiap elemen dalam larik sesuai dengan varian produk. Akan selalu ada setidaknya satu varian produk untuk setiap produk; karena selalu ada opsi semu dari produk "apa adanya"

  • PRODUCT_VARIANTS misalnya Baju 1, Baju 2
  • VARIANT_VALUES mis. Kemeja 1:Merah Kecil; Baju 2:Putih Kecil

Anda mungkin ingin memiliki validasi untuk memastikan SKU tidak ditetapkan kecuali nilai telah ditentukan untuk semua opsi yang terkait dengan produk.

Berdasarkan spreadsheet tentang bagaimana Anda melihat data Anda, Anda dapat memasukkan data ke dalam tabel Anda sebagai berikut:

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)

Sepertinya tidak ada dalam desain Anda yang menghentikan penambahan entri catatan (product_variant_option_id:2; sku_id 1) sehingga SKU W1SSCW sekarang memiliki opsi Kecil dan Besar. Tidak ada yang menghentikan masuknya record (product_variant_option_id:7; sku_id:1) sehingga SKU W1SSCW juga memiliki opsi Amateur.

Berdasarkan spreadsheet bagaimana Anda melihat data Anda, Anda dapat memasukkan data di tabel saya sebagai berikut:

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)

Dalam desain saya, Anda tidak dapat memasukkan catatan VARIANT_VALUES tambahan (id_produk:1; varian_id:1; id_opsi:1; id_nilai:2) - sehingga SKU W1SSCW sekarang memiliki opsi Kecil dan Besar - karena kunci utama pada VARIANT_VALUES dan data VARIANT_VALUES yang ada (id_produk:1; id_varian:1; id_opsi:1; id_nilai:1). Dalam desain saya, Anda tidak dapat memasukkan catatan VARIANT_VALUES (id_produk:1; varian_id:1; id_opsi:4; id_nilai:1) - sehingga SKU W1SSCW juga memiliki opsi Amatir - karena kunci asing merujuk PRODUCT_OPTIONS dan kurangnya record dalam tabel ini (product_id:1; option_id:4) yang menunjukkan bahwa Kelas adalah opsi yang valid untuk produk Widget 1.

EDIT :Desain tanpa tabel PRODUCT_OPTIONS

Anda bisa memiliki desain seperti:

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

Dengan Kunci Utama, Unik, dan Asing:

  • PRODUK
    • PK:product_id
    • Inggris Raya:product_name
  • OPSI
    • PK:product_id, option_id
    • Inggris Raya:product_id, option_name
  • OPTION_VALUES
    • PK:product_id, option_id, value_id
    • Inggris Raya:product_id, option_id, value_name
    • FK:product-id, option_id REFERENSI OPSI (product_id, option_id)
  • PRODUCT_SKUS
    • PK:product_id, sku_id
    • Inggris Raya:sku_id
    • FK:product_id REFERENSI PRODUK (product_id)
  • SKU_VALUES
    • PK:product_id, sku_id, option_id
    • FK:product_id, sku_id REFERENSI PRODUCT_SKUS (product_id, sku_id)
    • FK:product_id, option_id REFERENSI OPSI (product_id, option_id)
    • FK:product_id, option_id, value_id REFERENCES OPTION_VALUES (product_id, option_id, value_id)

Berdasarkan spreadsheet tentang bagaimana Anda melihat data Anda, Anda dapat memasukkan data dalam tabel ini sebagai berikut:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jenis MySQL ENUM vs tabel gabungan

  2. Mengambil data dari database MySQL ke daftar dropdown html

  3. JSON_QUOTE() – Cara Menghilangkan Karakter dalam String yang digunakan sebagai Nilai JSON di MySQL

  4. Tips untuk Memantau MySQL untuk Moodle

  5. WEEKOFYEAR() Contoh – MySQL