บทความ
ออกแบบฐานข้อมูลสินค้าแบบ Variations product
การออกแบบฐานข้อมูลสินค้าแบบ Variations product คือระบบเก็บข้อมูลของสินค้าที่มีคุณสมบัติแตกต่างกันในแต่ละตัวเลือก เช่น สี ขนาด น้ำหนัก เป็นต้น แต่ยังมีชื่อสินค้าเดียวกัน คุณจำเป็นต้องมีตารางที่สามารถจัดการคุณสมบัติของสินค้าและความสัมพันธ์ระหว่างกัน ตัวอย่างตารางมีดังนี้:
-
ตาราง products ที่เก็บข้อมูลของสินค้าจะประกอบด้วยคอลัมน์ดังนี้:
Column Name Data Type Description id (PK) INT รหัสสินค้า name VARCHAR(255) ชื่อสินค้า sku VARCHAR(100) รหัสสินค้า (Stock Keeping Unit) price DECIMAL(10,2) ราคาพื้นฐาน
- คอลัมน์ id เป็น Primary Key ที่ใช้ในการระบุรหัสสินค้า
- คอลัมน์ name เป็นชื่อของสินค้า
- คอลัมน์ sku เป็นรหัสของสินค้าที่ใช้ในการติดตามสินค้าในระบบ Inventory Management
- คอลัมน์ price เป็นราคาของสินค้าที่ถูกกำหนดไว้ตามค่าพื้นฐานของสินค้า
ตัวอย่างสำหรับตาราง products ที่เก็บข้อมูลของสินค้าต่าง ๆ จะประกอบด้วยคอลัมน์ดังนี้:
id name sku price 1 T-Shirt Black TSB-0001 250 2 T-Shirt White TSW-0001 250 3 Hoodie Black HDB-0001 650 4 Hoodie Gray HDG-0001 650 ในตัวอย่างนี้, คอลัมน์ id เป็น Primary Key ที่ใช้ในการระบุรายการสินค้าแต่ละรายการ คอลัมน์ name เป็นคอลัมน์ที่ใช้เก็บชื่อสินค้า คอลัมน์ sku เป็นคอลัมน์ที่ใช้เก็บรหัสสินค้า (Stock Keeping Unit) ซึ่งใช้ในการระบุสินค้าอย่างชัดเจน และคอลัมน์ price เป็นคอลัมน์ที่ใช้เก็บราคาพื้นฐานของสินค้า
-
ตาราง attributes ที่เก็บข้อมูลคุณสมบัติของสินค้าจะประกอบด้วยคอลัมน์ดังนี้:
Column Name Data Type Description id (PK) INT รหัสคุณสมบัติ name VARCHAR(255) ชื่อคุณสมบัติ
- คอลัมน์ id เป็น Primary Key ที่ใช้ในการระบุรหัสคุณสมบัติ
- คอลัมน์ name เป็นชื่อของคุณสมบัติของสินค้าที่ถูกกำหนดขึ้นมาเพื่อให้ผู้ใช้งานสามารถค้นหาสินค้าที่ต้องการได้ง่ายขึ้น
ตัวอย่างสำหรับตาราง attributes ที่เก็บข้อมูลคุณสมบัติของสินค้าจะประกอบด้วยคอลัมน์ดังนี้:
id | name |
---|---|
1 | Size |
2 | Color |
3 | Material |
ในตัวอย่างนี้, คอลัมน์ id เป็น Primary Key ที่ใช้ในการระบุรายการคุณสมบัติแต่ละรายการ คอลัมน์ name เป็นคอลัมน์ที่ใช้เก็บชื่อคุณสมบัติของสินค้า ซึ่งอาจมีความหลากหลายตามลักษณะของสินค้า ตัวอย่างเช่น ขนาด (Size) สี (Color) วัสดุ (Material) และอื่น ๆ ตามที่ต้องการ
-
ตาราง attribute_values ที่เก็บข้อมูลค่าคุณสมบัติของสินค้าจะประกอบด้วยคอลัมน์ดังนี้:
Column Name Data Type Description id (PK) INT รหัสค่าคุณสมบัติ attribute_id (FK) INT รหัสคุณสมบัติ (Foreign Key จากตาราง attributes) value VARCHAR(255) ค่าคุณสมบัติ
- คอลัมน์ id เป็น Primary Key ที่ใช้ในการระบุรหัสค่าคุณสมบัติ
- คอลัมน์ attribute_id เป็น Foreign Key ที่เชื่อมโยงกับตาราง attributes เพื่อแสดงความสัมพันธ์กับคุณสมบัติของสินค้า
- คอลัมน์ value เป็นค่าของคุณสมบัติของสินค้าที่ถูกกำหนดขึ้นเพื่ออธิบายลักษณะและลักษณะของสินค้าให้ผู้ใช้งานเห็นได้ชัดเจน
ตัวอย่างสำหรับตาราง attribute_values ที่เก็บข้อมูลค่าคุณสมบัติของสินค้าจะประกอบด้วยคอลัมน์ดังนี้:
id | attribute_id | value |
---|---|---|
1 | 1 | S |
2 | 1 | M |
3 | 1 | L |
4 | 1 | XL |
5 | 2 | Black |
6 | 2 | White |
7 | 2 | Red |
8 | 3 | Cotton |
9 | 3 | Polyester |
ในตัวอย่างนี้, คอลัมน์ id เป็น Primary Key ที่ใช้ในการระบุรายการค่าคุณสมบัติแต่ละรายการ คอลัมน์ attribute_id เป็น Foreign Key ที่เชื่อมโยงกับตาราง attributes ซึ่งเป็นคอลัมน์ที่ใช้เก็บรหัสคุณสมบัติ ส่วนคอลัมน์ value เป็นคอลัมน์ที่ใช้เก็บค่าคุณสมบัติของสินค้า ตัวอย่างเช่น ขนาดตัวอักษร (S, M, L, XL) สี (Black, White, Red) และวัสดุ (Cotton, Polyester)
-
ตาราง product_attributes ที่เก็บข้อมูลความสัมพันธ์ระหว่างสินค้ากับคุณสมบัติจะประกอบด้วยคอลัมน์ดังนี้:
Column Name Data Type Description id (PK) INT รหัสความสัมพันธ์ product_id (FK) INT รหัสสินค้า (Foreign Key จากตาราง products) attribute_id (FK) INT รหัสคุณสมบัติ (Foreign Key จากตาราง attributes)
- คอลัมน์ id เป็น Primary Key ที่ใช้ในการระบุรหัสความสัมพันธ์
- คอลัมน์ product_id เป็น Foreign Key ที่เชื่อมโยงกับตาราง products เพื่อแสดงความสัมพันธ์กับสินค้า
- คอลัมน์ attribute_id เป็น Foreign Key ที่เชื่อมโยงกับตาราง attributes เพื่อแสดงความสัมพันธ์กับคุณสมบัติของสินค้า
ตัวอย่างข้อมูลในตาราง product_attributes:
id | product_id | attribute_id |
---|---|---|
1 | 1001 | 1 |
2 | 1001 | 2 |
3 | 1002 | 1 |
4 | 1002 | 3 |
5 | 1002 | 4 |
- สินค้าที่มีรหัสสินค้าเป็น 1001 มีคุณสมบัติ 2 คุณสมบัติคือ 1 และ 2
- สินค้าที่มีรหัสสินค้าเป็น 1002 มีคุณสมบัติ 3 คุณสมบัติคือ 1, 3 และ 4
-
ตาราง product_variations ที่เก็บข้อมูลสินค้าย่อย (Variations) จะมีรูปแบบดังนี้:
Column Name Data Type Description id (PK) INT รหัสสินค้าย่อย product_id (FK) INT รหัสสินค้า (Foreign Key จากตาราง products) sku VARCHAR(255) รหัสสินค้าย่อย (Stock Keeping Unit) price DECIMAL(10,2) ราคาของสินค้าย่อย
ตัวอย่างสำหรับตาราง product_variations ที่เก็บข้อมูลสินค้าย่อย (Variations) จะประกอบด้วยคอลัมน์ดังนี้:
id | product_id | sku | price |
---|---|---|---|
1 | 1 | TSB-0001-S | 250 |
2 | 1 | TSB-0001-M | 250 |
3 | 1 | TSB-0001-L | 250 |
4 | 1 | TSB-0001-XL | 250 |
5 | 2 | TSW-0001-S | 250 |
6 | 2 | TSW-0001-M | 250 |
7 | 2 | TSW-0001-L | 250 |
8 | 2 | TSW-0001-XL | 250 |
9 | 3 | HDB-0001-S | 650 |
10 | 3 | HDB-0001-M | 650 |
11 | 3 | HDB-0001-L | 650 |
12 | 3 | HDB-0001-XL | 650 |
13 | 4 | HDG-0001-S | 650 |
14 | 4 | HDG-0001-M | 650 |
15 | 4 | HDG-0001-L | 650 |
16 | 4 | HDG-0001-XL | 650 |
ในตัวอย่างนี้, คอลัมน์ id เป็น Primary Key ที่ใช้ในการระบุรายการสินค้าย่อยแต่ละรายการ คอลัมน์ product_id เป็น Foreign Key ที่เชื่อมโยงกับตาราง products และเป็นคอลัมน์ที่ใช้เก็บรหัสสินค้าหลัก คอลัมน์ sku เป็นคอลัมน์ที่ใช้เก็บรหัสสินค้าย่อย (Stock Keeping Unit) ของแต่ละสินค้าย่อย และคอลัมน์ price เป็นคอลัมน์ที่ใช้เก็บราคาของสินค้าย่อยในแต่ละแบบซึ่งอาจแตกต่างกันไปตามคุณสมบัติของสินค้าย่อยแต่ละตัว
-
ตาราง product_variation_attributes: เก็บข้อมูลความสัมพันธ์ระหว่างสินค้าย่อยกับค่าคุณสมบัติ
id (PK): รหัสความสัมพันธ์
variation_id (FK): รหัสสินค้าย่อย
attribute_id (FK): รหัสคุณสมบัติ
attribute_value_id (FK): รหัสค่าคุณสมบัติ
โดยที่ data type เป็นดังนี้
id: INT
variation_id: INT
attribute_id: INT
attribute_value_id: INT
ตัวอย่างสำหรับตาราง product_variation_attributes: เก็บข้อมูลความสัมพันธ์ระหว่างสินค้าย่อยกับค่าคุณสมบัติ ดังนี้
id | variation_id | attribute_id | attribute_value_id |
---|---|---|---|
1 | 1 | 1 | 1 |
2 | 1 | 2 | 3 |
3 | 2 | 1 | 2 |
4 | 2 | 2 | 4 |
โดยที่ตารางนี้เก็บข้อมูลความสัมพันธ์ระหว่างสินค้าย่อยกับค่าคุณสมบัติ โดยใช้ id เป็น primary key และเชื่อมตารางนี้กับตารางสินค้าย่อย (product_variations) และตารางค่าคุณสมบัติ (attribute_values) ด้วย foreign key ที่เก็บไว้ใน column variation_id, attribute_id, และ attribute_value_id ตามลำดับ
7.ตาราง product_variation_stock ใช้ในการเก็บข้อมูลสต็อกสินค้าย่อย (Variations) โดยมีคอลัมน์หลักๆ ดังนี้:
id (PK): รหัสสต็อกสินค้าย่อย (Primary Key)
variation_id (FK): รหัสสินค้าย่อย (Foreign Key ที่เชื่อมโยงกับตาราง product_variations)
stock_quantity: ปริมาณสต็อกสินค้า
stock_status: สถานะสต็อกสินค้า (in_stock, out_of_stock, backorder, pre_order หรือ ค่าอื่นๆ ตามที่กำหนด)
low_stock_threshold: ค่าเกณฑ์ต่ำสุดสำหรับสต็อกสินค้า (เมื่อสต็อกลดลงเหลือเท่ากับหรือน้อยกว่าค่านี้ ระบบจะแจ้งเตือนหรือดำเนินการตามที่กำหนด)
Data type ที่ใช้ในตาราง product_variation_stock มีดังนี้
id: integer
variation_id: integer
stock_quantity: integer
stock_status: string
low_stock_threshold: integer
ตัวอย่างสำหรับตาราง product_variation_stock:
id | variation_id | stock_quantity | stock_status | low_stock_threshold |
---|---|---|---|---|
1 | 1 | 50 | in_stock | 10 |
2 | 2 | 0 | out_of_stock | 10 |
3 | 3 | 25 | in_stock | 10 |
ออกแบบฐานข้อมูล discount table
ออกแบบตารางส่วนลด (discount table) คุณสามารถมีตารางที่สามารถจัดการประเภทส่วนลด ความสัมพันธ์ระหว่างสินค้ากับส่วนลด และข้อมูลส่วนลดเอง ตัวอย่างตารางมีดังนี้:
- ตาราง discount_types: เก็บข้อมูลประเภทส่วนลด
id (PK): รหัสประเภทส่วนลด
name: ชื่อประเภทส่วนลด
ตัวอย่างสำหรับตาราง discount_types ที่เก็บข้อมูลประเภทส่วนลดจะประกอบด้วยคอลัมน์ดังนี้:
id name 1 ส่วนลดเปอร์เซ็นต์ 2 ส่วนลดจำนวนเงิน ในตัวอย่างนี้, คอลัมน์ id เป็น Primary Key ที่ใช้ในการระบุรหัสประเภทส่วนลด ส่วนคอลัมน์ name เป็นคอลัมน์ที่ใช้เก็บชื่อประเภทส่วนลดที่เป็นไปได้ในระบบของร้านค้า โดยในตัวอย่างนี้มีสองประเภทส่วนลดคือ ส่วนลดเปอร์เซ็นต์ และส่วนลดจำนวนเงิน
- ตาราง discounts: เก็บข้อมูลส่วนลด
id (PK): รหัสส่วนลด
discount_type_id (FK): รหัสประเภทส่วนลด
name: ชื่อส่วนลด
value: มูลค่าส่วนลด (เปอร์เซ็นต์หรือจำนวนเงิน)
start_date: วันเริ่มต้นส่วนลด
end_date: วันสิ้นสุดส่วนลด
min_purchase: จำนวนซื้อขั้นต่ำ (ถ้ามี)
max_discount_amount: จำนวนส่วนลดสูงสุด (ถ้ามี)
ตัวอย่างสำหรับตาราง discounts ที่เก็บข้อมูลส่วนลดจะประกอบด้วยคอลัมน์ดังนี้:
id discount_type_id name value start_date end_date min_purchase max_discount_amount 1 1 ส่วนลด 10% 10 2023-04-01 2023-04-30 1000 2 2 ส่วนลด 100 บาท 100 2023-04-15 2023-05-15 5000 500 3 1 ส่วนลด 5% 5 2023-05-01 2023-05-31 500 ในตัวอย่างนี้, คอลัมน์ id เป็น Primary Key ที่ใช้ในการระบุรหัสส่วนลด คอลัมน์ discount_type_id เป็น Foreign Key ที่เชื่อมโยงกับตาราง discount_types และเป็นคอลัมน์ที่ใช้เก็บรหัสประเภทส่วนลด คอลัมน์ name เป็นคอลัมน์ที่ใช้เก็บชื่อส่วนลด คอลัมน์ value เป็นคอลัมน์ที่ใช้เก็บมูลค่าส่วนลด เป็นเปอร์เซ็นต์หรือจำนวนเงิน คอลัมน์ start_date เป็นคอลัมน์ที่ใช้เก็บวันที่เริ่มต้นของส่วนลด คอลัมน์ end_date เป็นคอลัมน์ที่ใช้เก็บวันที่สิ้นสุดของส่วนลด คอลัมน์ min_purchase เป็นคอลัมน์ที่ใช้เก็บจำนวนซื้อขั้นต่ำที่ต้องการใช้ส่วนลด (ถ้ามี) ส่วนคอลัมน์ max_discount_amount เป็นคอลัมน์ที่ใช้เก็บจำนวนส่วนลดสูงสุดที่สามารถใช้ได้ (ถ้ามี)
- ตาราง product_discounts: เก็บข้อมูลความสัมพันธ์ระหว่างสินค้ากับส่วนลด
id (PK): รหัสความสัมพันธ์
product_id (FK): รหัสสินค้า
discount_id (FK): รหัสส่วนลด
ตัวอย่างสำหรับตาราง product_discounts ที่เก็บข้อมูลความสัมพันธ์ระหว่างสินค้ากับส่วนลดจะประกอบด้วยคอลัมน์ดังนี้:
id product_id discount_id 1 1 1 2 1 3 3 2 2 ในตัวอย่างนี้, คอลัมน์ id เป็น Primary Key ที่ใช้ในการระบุรหัสความสัมพันธ์ระหว่างสินค้ากับส่วนลด คอลัมน์ product_id เป็น Foreign Key ที่เชื่อมโยงกับตาราง products และเป็นคอลัมน์ที่ใช้เก็บรหัสสินค้า คอลัมน์ discount_id เป็น Foreign Key ที่เชื่อมโยงกับตาราง discounts และเป็นคอลัมน์ที่ใช้เก็บรหัสส่วนลด ดังนั้น, ความสัมพันธ์ในตาราง product_discounts จะแสดงว่าสินค้าในตาราง products ได้รับส่วนลดในตาราง discounts ได้แบบนี้:
- สินค้าที่มีรหัสสินค้าเป็น 1 ได้รับส่วนลดทั้งสองประเภท (รหัสส่วนลด 1 และ 3)
- สินค้าที่มีรหัสสินค้าเป็น 2 ได้รับส่วนลดประเภทเดียว (รหัสส่วนลด 2)
- ตาราง product_variation_discounts: เก็บข้อมูลความสัมพันธ์ระหว่างสินค้าย่อยกับส่วนลด
id (PK): รหัสความสัมพันธ์
variation_id (FK): รหัสสินค้าย่อย
discount_id (FK): รหัสส่วนลด
ตัวอย่างสำหรับตาราง product_variation_discounts ที่เก็บข้อมูลความสัมพันธ์ระหว่างสินค้าย่อยกับส่วนลดจะประกอบด้วยคอลัมน์ดังนี้:
id variation_id discount_id 1 1 1 2 1 3 3 2 2 ในตัวอย่างนี้, คอลัมน์ id เป็น Primary Key ที่ใช้ในการระบุรหัสความสัมพันธ์ระหว่างสินค้าย่อยกับส่วนลด คอลัมน์ variation_id เป็น Foreign Key ที่เชื่อมโยงกับตาราง product_variations และเป็นคอลัมน์ที่ใช้เก็บรหัสสินค้าย่อย คอลัมน์ discount_id เป็น Foreign Key ที่เชื่อมโยงกับตาราง discounts และเป็นคอลัมน์ที่ใช้เก็บรหัสส่วนลด ดังนั้น, ความสัมพันธ์ในตาราง product_variation_discounts จะแสดงว่าสินค้าย่อยในตาราง product_variations ได้รับส่วนลดในตาราง discounts ได้แบบนี้:
- สินค้าย่อยที่มีรหัสสินค้าย่อยเป็น 1 ได้รับส่วนลดทั้งสองประเภท (รหัสส่วนลด 1 และ 3)
- สินค้าย่อยที่มีรหัสสินค้าย่อยเป็น 2 ได้รับส่วนลดประเภทเดียว (รหัสส่วนลด 2)
SQL ฐานข้อมูลสินค้าแบบ Variable product
โดย Variable product หมายถึง สินค้าที่มีคุณสมบัติหลายรูปแบบหรือตัวเลือกสินค้าย่อย ที่มีรหัสสินค้าแตกต่างกันตามคุณสมบัติแต่ละตัว เช่น ตัวเลือกสีหรือขนาดของเสื้อผ้า
เราสามารถออกแบบฐานข้อมูลสินค้าแบบ Variable product ด้วยตารางข้อมูลต่อไปนี้:
- products (ตารางหลักของสินค้า)
- product_attributes (ตารางคุณสมบัติของสินค้า)
- attribute_values (ตารางค่าคุณสมบัติของสินค้า)
- product_variations (ตารางสินค้าย่อยหรือตัวเลือกสินค้า)
- product_variation_attributes (ตารางความสัมพันธ์ระหว่างสินค้าย่อยกับค่าคุณสมบัติ)
- product_variation_stock (ตารางสต็อกสินค้าย่อย)
- discounts (ตารางส่วนลด)
- discount_types (ตารางประเภทส่วนลด)
- product_discounts (ตารางความสัมพันธ์ระหว่างสินค้ากับส่วนลด)
- product_variation_discounts (ตารางความสัมพันธ์ระหว่างสินค้าย่อยกับส่วนลด)
ดังนั้นเราสามารถสร้างฐานข้อมูล Variable product ด้วย SQL ดังนี้:
ตาราง products:
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(255),
sku VARCHAR(50),
price DECIMAL(10,2)
);
ตาราง attributes:
CREATE TABLE attributes (
id INT PRIMARY KEY,
name VARCHAR(255)
);
ตาราง attribute_values:
CREATE TABLE attribute_values (
id INT PRIMARY KEY,
attribute_id INT,
value VARCHAR(255),
FOREIGN KEY (attribute_id) REFERENCES attributes(id)
);
ตาราง product_attributes:
CREATE TABLE product_attributes (
id INT PRIMARY KEY,
product_id INT,
attribute_id INT,
FOREIGN KEY (product_id) REFERENCES products(id),
FOREIGN KEY (attribute_id) REFERENCES attributes(id)
);
ตาราง product_variations:
CREATE TABLE product_variations (
id INT PRIMARY KEY,
product_id INT,
sku VARCHAR(50),
price DECIMAL(10,2),
FOREIGN KEY (product_id) REFERENCES products(id)
);
ตาราง product_variation_attributes:
CREATE TABLE product_variation_attributes (
id INT PRIMARY KEY,
variation_id INT,
attribute_value_id INT,
FOREIGN KEY (variation_id) REFERENCES product_variations(id),
FOREIGN KEY (attribute_value_id) REFERENCES attribute_values(id)
);
ตาราง product_variation_stock:
CREATE TABLE product_variation_stock (
id INT PRIMARY KEY,
variation_id INT,
stock_quantity INT,
stock_status VARCHAR(20),
low_stock_threshold INT,
FOREIGN KEY (variation_id) REFERENCES product_variations(id)
);
ตาราง discount_types:
CREATE TABLE discount_types (
id INT PRIMARY KEY,
name VARCHAR(255)
);
ตาราง discounts:
CREATE TABLE discounts (
id INT PRIMARY KEY,
discount_type_id INT,
name VARCHAR(255),
value DECIMAL(10,2),
start_date DATE,
end_date DATE,
min_purchase DECIMAL(10,2),
max_discount_amount DECIMAL(10,2),
FOREIGN KEY (discount_type_id) REFERENCES discount_types(id)
);
ตาราง product_discounts:
CREATE TABLE product_discounts (
id INT PRIMARY KEY,
product_id INT,
discount_id INT,
FOREIGN KEY (product_id) REFERENCES products(id),
FOREIGN KEY (discount_id) REFERENCES discounts(id)
);
ตาราง product_variation_discounts:
CREATE TABLE product_variation_discounts (
id INT PRIMARY KEY,
variation_id INT,
discount_id INT,
FOREIGN KEY (variation_id) REFERENCES product_variations(id),
FOREIGN KEY (discount_id) REFERENCES discounts(id)
);
หนังสือพัฒนาตัวเอง
จุดเริ่มต้นที่ชัดเจน