การเลือกที่จะไม่ออกแบบ Table ตั้งแต่ต้น — การพัฒนาบน PostgreSQL Sample DB dvdrental
บทนำ
เมื่อตัดสินใจ “สร้าง web app” เป็น personal project คนส่วนใหญ่เริ่มต้นด้วย “การออกแบบ DB” การวาด ER diagram, สร้าง table, ใส่ sample data… แค่ขั้นตอนนั้นก็ใช้เวลาอย่างมาก
ครั้งนี้ เราข้ามขั้นตอนนั้นโดยตั้งใจ
เราใช้ dvdrental ฐานข้อมูล sample สำหรับเรียนรู้ PostgreSQL อย่างเป็นทางการเป็นฐาน และสร้างแอพบนนั้น
dvdrental คืออะไร?
เป็น sample DB ที่ใช้ใน tutorial PostgreSQL อย่างเป็นทางการ มีข้อมูลที่จำลองตามร้านเช่า DVD พร้อม table เช่น:
film,actor,categorycustomer,staff,storerental,payment,inventory
ประมาณ 15 table พร้อมข้อมูล relational และบันทึกหลายพันรายการรวมมาตั้งแต่แรก
ดาวน์โหลดได้จากหน้าอย่างเป็นทางการ:
https://www.postgresqltutorial.com/postgresql-getting-started/postgresql-sample-database/
ทำไมเราถึงไม่ออกแบบตั้งแต่ต้น
พูดตรงๆ “ไม่มีแรงออกแบบ DB ตั้งแต่ต้น” ไม่ใช่เหตุผลหลัก
อยากเห็นแอพที่ทำงานได้โดยเร็วที่สุด
ใน personal development ไม่มีใครกำหนด deadline ให้คุณ คนจำนวนมากล้มเลิกเมื่อติดขัดกับการออกแบบ table หรือการสร้าง sample data
กับ dvdrental คุณสามารถแสดงข้อมูลจริงบนหน้าจอแอพได้ตั้งแต่วันแรก
การสามารถเห็น “ฉันกำลังสร้างแอพแบบไหน” ตั้งแต่ตอนแรกสุดทำให้แรงจูงใจในการพัฒนาแตกต่างกันมาก
สิ่งที่เราทำจริงๆ
① เริ่ม dvdrental ด้วย Docker
# compose.yml (ตัดมา)
services:
postgres:
image: postgres:16
environment:
POSTGRES_DB: dvdrental
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
volumes:
- ./docker/postgres/init:/docker-entrypoint-initdb.d
ports:
- "15433:5432"
แค่วางไฟล์ .tar dvdrental และ initialization script ใน docker-entrypoint-initdb.d มันจะ auto-restore เมื่อ container เริ่ม
② เชื่อมต่อจาก Spring Boot และแสดงบนหน้าจอ
// FilmRepository.java (ตัดมา)
public interface FilmRepository extends JpaRepository<Film, Integer> {
List<Film> findAllByOrderByTitleAsc();
}
เนื่องจาก table มีอยู่แล้ว แค่กำหนด @Entity และชี้ JPA ไปที่มัน — ก็ทำงานได้ทันที
③ เพิ่มฟีเจอร์ที่จำเป็นแบบ incremental ด้วย Flyway
ความต้องการเพิ่มเติมอย่าง “อยากเพิ่มภาษาญี่ปุ่น” หรือ “อยากเพิ่ม tag” ถูกเพิ่มแบบ incremental ด้วย Flyway migrations
-- V2__add_japanese_title.sql
ALTER TABLE film ADD COLUMN title_ja VARCHAR(255);
วิธีนี้ช่วยให้สามารถขยายแบบ incremental ได้โดยไม่ทำลายข้อมูลที่มีอยู่
สิ่งที่เราเรียนรู้
สิ่งที่ได้ผลดี
เริ่มจาก “สถานะที่มีข้อมูล”
เมื่อแสดงรายการภาพยนตร์ มีบันทึกภาพยนตร์ประมาณ 1,000 รายการอยู่แล้ว
เมื่อ implement การค้นหาและกรอง คุณสามารถทดสอบด้วยปริมาณข้อมูลที่เป็นจริง
การเรียนรู้ relationships
หลายต่อหลายระหว่าง film → film_actor → actor, สายโซ่ rental → inventory → film — โครงสร้าง relational ที่เป็นจริงถูกสร้างมาตั้งแต่แรก ทำให้เป็นการฝึกที่ดีสำหรับ JOINs
รู้สึกเหมือนแอพธุรกิจจริง
เมื่อเริ่มตั้งแต่ต้น ข้อมูลมักกลายเป็น Test Taro หรือ Sample Movie 1
dvdrental มีชื่อนักแสดงจริง (ภาษาอังกฤษ) และชื่อภาพยนตร์ ดังนั้นหน้าจอดูแตกต่างกันมากเมื่อแสดง
ประเด็นที่ต้องระวัง
Sample data เป็นภาษาอังกฤษเป็นหลัก
ชื่อ, ที่อยู่ และคำอธิบายทั้งหมดเป็นภาษาอังกฤษ
สำหรับ UI ภาษาญี่ปุ่น จำเป็นต้องทำ Japanese localization แยกต่างหาก (ครอบคลุมในบทความอื่น)
จำนวนเงินเป็น USD
payment_amount ฯลฯ เป็น sample data ใน USD
ถ้าต้องการ spec เป็นเงินเยนญี่ปุ่น จำเป็นต้องพิจารณาการแปลงและการปัดเศษ
แนวคิดของ “การยืมฐาน”
การสร้างจาก “ของที่มีอยู่ 1 ถึง 10” มีอุปสรรคเริ่มต้นต่ำกว่า “การสร้าง 0 ถึง 1”
นี่เป็นวิธีคิดที่ใช้ได้ไม่เพียงแต่กับการพัฒนาแอพ แต่กับวิธีที่คุณเข้าหางานโดยทั่วไป
dvdrental เป็น sample สำหรับเรียนรู้ แต่จำลอง “โครงสร้างข้อมูลธุรกิจจริง”
ประสบการณ์ในการสร้างแอพบนนั้นให้ความรู้สึกใกล้เคียงกับงานในโลกจริง
สรุป
- การใช้
dvdrentalPostgreSQL sample DB เป็นฐานช่วยให้เริ่มพัฒนาได้โดยไม่มีต้นทุนการออกแบบ DB - เริ่มต้นด้วย Docker ได้ง่าย ดังนั้นสามารถยืนยันแอพที่ทำงานได้พร้อมข้อมูลจริงตั้งแต่วันแรก
- ฟีเจอร์ที่ขาดหายถูกเพิ่มแบบ incremental ด้วย Flyway ช่วยให้ขยายได้โดยไม่ทำลายข้อมูลที่มีอยู่
- แนวคิดของ “การยืมฐาน” ช่วยลดจุดที่ทำให้หมดไฟใน personal development ได้อย่างมาก
บทความที่เกี่ยวข้อง
→ การสร้างแอพ DVD Rental สำหรับผู้ใช้ควบคู่กับหน้าจัดการ — ภาพรวมโครงสร้าง Vue 3 + Spring Boot