โปรเจกต์จำลองระบบฐานข้อมูล ร้านค้าออนไลน์ (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
root, password ว่างเปล่า, host 127.0.0.1ecommerce_dbmysql_schema.sql แล้วกด Execute (F9) ทั้งไฟล์mysql_seed_data.sql แล้ว Executemysql_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)
RANK() OVER (PARTITION BY ...) หา Top N สินค้าขายดีต่อหมวดหมู่SUM() OVER, AVG() OVER (ROWS BETWEEN ...)WITH RECURSIVE)CASE business logicFILTER (WHERE ...) คำนวณ cancellation rate รายเดือนtrg_deduct_stock: ตัดสต็อกอัตโนมัติทุกครั้งที่มีการ insert order_items พร้อม log ลง stock_movements และ raise exception ถ้าสต็อกไม่พอ (ทดสอบแล้วว่าทำงานถูกต้อง — สต็อกไม่มีทางติดลบ)order_items.unit_price เก็บราคา ณ เวลาซื้อ ไม่ผูกกับราคาปัจจุบันของสินค้า (ป้องกันข้อมูลย้อนหลังเพี้ยนถ้าราคาสินค้าถูกแก้ทีหลัง)EXPLAIN ANALYZE เทียบก่อน-หลังใส่ index แบบมี screenshot ผลvw_daily_sales