โปรเจกต์จำลองระบบฐานข้อมูล ร้านค้าออนไลน์ (E-commerce) สำหรับใช้โชว์พอร์ตโฟลิโอ/สมัครงานสาย Data/Backend ออกแบบให้ครอบคลุมทั้ง database design, data generation, และ SQL query ระดับที่ใช้ในงานจริง
ทุกไฟล์ในโปรเจกต์นี้ ทดสอบรันจริงบน PostgreSQL 16 แล้ว ไม่มี error
| ไฟล์ | รายละเอียด |
|---|---|
schema.sql |
(PostgreSQL) CREATE TABLE ครบ 11 ตาราง พร้อม constraints, indexes, trigger, view |
mysql_schema.sql |
เวอร์ชัน MySQL/MariaDB — ใช้กับ Laragon + HeidiSQL |
generate_data.py |
สคริปต์ Python (ใช้ Faker) สำหรับสร้างข้อมูลตัวอย่าง → output เป็น seed_data.sql |
seed_data.sql |
(PostgreSQL) ข้อมูลตัวอย่างพร้อมใช้ |
mysql_seed_data.sql |
เวอร์ชัน MySQL/MariaDB ของข้อมูลตัวอย่างชุดเดียวกัน |
queries.sql |
(PostgreSQL) Query ตัวอย่าง 12 แบบ |
mysql_queries.sql |
เวอร์ชัน MySQL/MariaDB ของ query ชุดเดียวกัน |
ทุกไฟล์ทั้ง PostgreSQL และ MySQL/MariaDB ทดสอบรันจริงแล้ว ไม่มี error
- เปิด Laragon แล้วกด Start All (จะรัน MySQL/MariaDB ให้อัตโนมัติ)
- เปิด HeidiSQL (คลิกขวาที่ Laragon tray icon > Database > HeidiSQL หรือเปิดจาก Laragon > Menu > MySQL > HeidiSQL)
- เชื่อมต่อ session แรก (ปกติ Laragon ตั้งไว้ให้แล้ว): user
root, password ว่างเปล่า, host127.0.0.1 - คลิกขวาที่ฝั่งซ้าย (รายชื่อ database) > Create new > Database ตั้งชื่อ เช่น
ecommerce_db - คลิกที่ database ที่สร้าง แล้วไปแท็บ Query ด้านบน
- เปิดไฟล์ผ่านเมนู File > Load SQL file... เลือก
mysql_schema.sqlแล้วกด Execute (F9) ทั้งไฟล์ - ทำซ้ำ: โหลด
mysql_seed_data.sqlแล้ว Execute - ทำซ้ำ: โหลด
mysql_queries.sqlแล้ว Execute ทีละ query (เลือกข้อความ query ที่ต้องการแล้วกด F9 เพื่อรันเฉพาะอันนั้น)
ข้อควรระวัง: ไฟล์ตระกูล mysql_* ใช้กับ Laragon ได้เลย ส่วนไฟล์ schema.sql, seed_data.sql, queries.sql (ไม่มี prefix mysql_) เขียนด้วย syntax ของ PostgreSQL ซึ่ง ใช้กับ Laragon ไม่ได้ (Laragon ให้ MySQL/MariaDB เป็นค่าเริ่มต้น)
# 1. สร้างฐานข้อมูล
createdb ecommerce_db
# 2. สร้าง schema
psql -d ecommerce_db -f schema.sql
# 3. (ถ้าต้องการ regenerate ข้อมูล) ติดตั้ง faker แล้วรัน
pip install faker
python generate_data.py
# 4. โหลดข้อมูลตัวอย่าง
psql -d ecommerce_db -f seed_data.sql
# 5. ลองรัน query ตัวอย่าง
psql -d ecommerce_db -f queries.sqlปรับจำนวนข้อมูลได้ที่ตัวแปร N_* ด้านบนของ generate_data.py (เช่น N_CUSTOMERS, N_ORDERS)
- Window Function —
RANK() OVER (PARTITION BY ...)หา Top N สินค้าขายดีต่อหมวดหมู่ - Running Total / Moving Average —
SUM() OVER,AVG() OVER (ROWS BETWEEN ...) - Recursive CTE — ไล่ต้นไม้หมวดหมู่สินค้า (
WITH RECURSIVE) - Customer Segmentation (RFM) — Recency/Frequency/Monetary +
CASEbusiness logic - Self-Join — Market Basket Analysis (สินค้าที่มักซื้อคู่กัน)
- Subquery + HAVING — หาลูกค้าที่ใช้จ่ายเกินค่าเฉลี่ย
- Anti-Join (LEFT JOIN + IS NULL) — สินค้าขายดีแต่ไม่มีรีวิว
- Weighted Average — Bayesian-style rating เพื่อกันรีวิวน้อยแต่คะแนนสุดโต่ง
- Conditional Aggregation —
FILTER (WHERE ...)คำนวณ cancellation rate รายเดือน - Multi-table Join + Date Filtering — Low stock alert พร้อมยอดขาย 30 วันล่าสุด
- EXPLAIN ANALYZE — อ่าน query plan เพื่อ optimize
- VIEW — reporting layer สำหรับ dashboard
- Trigger
trg_deduct_stock: ตัดสต็อกอัตโนมัติทุกครั้งที่มีการ insertorder_itemsพร้อม log ลงstock_movementsและ raise exception ถ้าสต็อกไม่พอ (ทดสอบแล้วว่าทำงานถูกต้อง — สต็อกไม่มีทางติดลบ) - Self-referencing category รองรับหมวดหมู่ย่อยไม่จำกัดชั้น
- Price snapshot:
order_items.unit_priceเก็บราคา ณ เวลาซื้อ ไม่ผูกกับราคาปัจจุบันของสินค้า (ป้องกันข้อมูลย้อนหลังเพี้ยนถ้าราคาสินค้าถูกแก้ทีหลัง) - 10 indexes ครอบคลุม foreign key และ pattern การ query ที่ใช้บ่อย (filter by customer, date, status)
- เพิ่ม
EXPLAIN ANALYZEเทียบก่อน-หลังใส่ index แบบมี screenshot ผล - ทำ dashboard ง่ายๆ ด้วย Python (matplotlib/streamlit) ดึงจาก
vw_daily_sales - เขียน stored procedure สำหรับ "checkout flow" ที่ครอบคลุม transaction + rollback
- Deploy ขึ้น Supabase/Railway (ฟรี) แล้วแปะ live demo link ใน README