Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Mô hình hóa các biến thể sản phẩm

Bạn có thể có một thiết kế như:

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

Với các khóa chính, duy nhất và ngoại:

  • SẢN PHẨM
    • PK:product_id
    • Vương quốc Anh:product_name
  • TÙY CHỌN
    • PK:option_id
    • Vương quốc Anh:option_name
  • OPTION_VALUES
    • PK:option_id, value_id
    • Vương quốc Anh:option_id, value_name
    • FK:option_id THAM KHẢO CÁC TÙY CHỌN (option_id)
  • PRODUCT_OPTIONS
    • PK:product_id, option_id
    • FK:product_id THAM KHẢO SẢN PHẨM (product_id)
    • FK:option_id THAM KHẢO CÁC TÙY CHỌN (option_id)
  • PRODUCT_VARIANTS
    • PK:product_id, variant_id
    • Vương quốc Anh:sku_id
    • FK:product_id THAM KHẢO SẢN PHẨM (product_id)
  • VARIANT_VALUES
    • PK:product_id, variant_id, option_id
    • FK:product_id, variant_id THAM KHẢO SẢN PHẨM_VARIANTS (product_id, variant_id)
    • FK:product_id, option_id THAM KHẢO PRODUCT_OPTIONS (product_id, option_id)
    • FK:option_id, value_id THAM KHẢO OPTION_VALUES (option_id, value_Id)

Bạn có:

  • SẢN PHẨM, ví dụ:Áo sơ mi, áo liền quần, quần dài
  • TÙY CHỌN, ví dụ:Kích thước, màu sắc, chiều dài
  • OPTION_VALUES ví dụ:Kích thước - Nhỏ, Trung bình, Lớn; Màu - Đỏ, Trắng, Xanh dương
  • PRODUCT_OPTIONS, ví dụ:Áo sơ mi - Kích cỡ, Màu sắc; Quần - Chiều dài, Màu sắc

Sau đó, bạn cần tạo một mảng n chiều, với số chiều bằng số tùy chọn cho sản phẩm. Mỗi phần tử trong mảng tương ứng với một biến thể sản phẩm. Sẽ luôn có ít nhất một biến thể sản phẩm cho mỗi sản phẩm; vì luôn có tùy chọn giả của sản phẩm "nguyên trạng"

  • PRODUCT_VARIANTS, ví dụ:Áo sơ mi 1, Áo sơ mi 2
  • VARIANT_VALUES ví dụ:Áo sơ mi 1:Màu đỏ nhỏ; Áo 2:Trắng nhỏ

Bạn có thể muốn xác thực để đảm bảo SKU không được chỉ định trừ khi các giá trị đã được chỉ định cho tất cả các tùy chọn được liên kết với một sản phẩm.

Dựa trên bảng tính về cách bạn nhìn thấy dữ liệu của mình, bạn có thể nhập dữ liệu vào các bảng của mình như sau:

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)

Dường như không có gì trong thiết kế của bạn ngăn chặn việc thêm mục nhập bản ghi (product_variant_option_id:2; sku_id 1) để SKU W1SSCW hiện có cả hai tùy chọn Nhỏ và Lớn. Không có gì để ngăn việc nhập bản ghi (product_variant_option_id:7; sku_id:1) để SKU W1SSCW cũng có tùy chọn Nghiệp dư.

Dựa trên bảng tính về cách bạn nhìn thấy dữ liệu của mình, bạn có thể nhập dữ liệu vào các bảng của tôi như sau:

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)

Trong thiết kế của tôi, bạn không thể nhập bản ghi VARIANT_VALUES bổ sung (product_id:1; variant_id:1; option_id:1; value_id:2) - để SKU W1SSCW hiện có cả hai tùy chọn Nhỏ và Lớn - do khóa chính trên VARIANT_VALUES và bản ghi VARIANT_VALUES hiện có (product_id:1; variant_id:1; option_id:1; value_id:1). Trong thiết kế của tôi, bạn không thể nhập bản ghi VARIANT_VALUES (product_id:1; variant_id:1; option_id:4; value_id:1) - do đó SKU W1SSCW cũng có tùy chọn Nghiệp dư - do khóa ngoại tham chiếu đến PRODUCT_OPTIONS và thiếu ghi lại trong bảng này về (product_id:1; option_id:4) chỉ ra rằng Lớp là một tùy chọn hợp lệ cho Tiện ích sản phẩm 1.

CHỈNH SỬA :Thiết kế không có bảng PRODUCT_OPTIONS

Bạn có thể có một thiết kế như:

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

Với các khóa chính, duy nhất và ngoại:

  • SẢN PHẨM
    • PK:product_id
    • Vương quốc Anh:product_name
  • TÙY CHỌN
    • PK:product_id, option_id
    • Vương quốc Anh:product_id, option_name
  • OPTION_VALUES
    • PK:product_id, option_id, value_id
    • Vương quốc Anh:product_id, option_id, value_name
    • FK:product-id, option_id THAM KHẢO CÁC TÙY CHỌN (product_id, option_id)
  • PRODUCT_SKUS
    • PK:product_id, sku_id
    • Vương quốc Anh:sku_id
    • FK:product_id THAM KHẢO SẢN PHẨM (product_id)
  • SKU_VALUES
    • PK:product_id, sku_id, option_id
    • FK:product_id, sku_id THAM KHẢO PRODUCT_SKUS (product_id, sku_id)
    • FK:product_id, option_id THAM KHẢO TÙY CHỌN (product_id, option_id)
    • FK:product_id, option_id, value_id THAM KHẢO OPTION_VALUES (product_id, option_id, value_id)

Dựa trên bảng tính về cách bạn nhìn thấy dữ liệu của mình, bạn có thể nhập dữ liệu vào các bảng này như sau:

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. Cú pháp DELETE của SQL - Được DBMS liệt kê

  2. 15 câu hỏi phỏng vấn MySQL cơ bản dành cho quản trị viên cơ sở dữ liệu

  3. UTF-8 xuyên suốt

  4. Truy vấn Mysql để chuyển đổi động các hàng thành cột trên cơ sở hai cột

  5. So sánh phạm vi ngày