Dev Nest


กำลังเตรียมห้องเรียน... 🎓
เรียนรู้ไปพร้อมกับเรา ทุกขั้นตอนของการพัฒนาซอฟต์แวร์
ถ้าคุณเขียนหน้าเว็บสวย ๆ ด้วย HTML/CSS/JS หรือ React ได้แล้ว แต่พอจะลองทำระบบ login, ตะกร้าสินค้า หรือฟีดโพสต์จริง ๆ กลับรู้สึกว่า "มีอะไรบางอย่างหายไป" — บทความนี้เขียนมาเพื่อคุณโดยเฉพาะ เราจะพาไปรู้จัก SQL และ Database แบบไม่ต้องท่องนิยาม แต่เห็นภาพว่ามันนั่งอยู่ตรงไหนของแอปจริง และทำไมมันคือ "ครึ่งหลัง" ที่จะเปลี่ยนคุณจากคนเขียนหน้าเว็บได้ ให้กลายเป็น Fullstack Developer เต็มตัว
ลองนึกถึงคำถามง่าย ๆ ข้อหนึ่ง — เวลาคุณสมัครสมาชิกเว็บไหนสักเว็บ แล้วปิดเบราว์เซอร์ไป พรุ่งนี้กลับมาเข้าระบบได้เหมือนเดิม คำถามคือ "ข้อมูลอีเมลกับรหัสผ่านของคุณไปอยู่ที่ไหน?"
มันไม่ได้อยู่ในหน้าเว็บที่คุณเขียนแน่นอน เพราะหน้าเว็บ (frontend) พอ refresh ทีก็ลืมทุกอย่าง คำตอบคือมันถูกเก็บไว้ใน database — ที่เก็บข้อมูลถาวรซึ่งทำงานอยู่เบื้องหลัง
ทุกแอปที่ "จำข้อมูลได้" ล้วนมี database อยู่ข้างหลังทั้งนั้น ไม่ว่าจะเป็น:
ปัญหาคือ มือใหม่ที่เริ่มสาย dev จาก frontend (เพราะมัน "เห็นผลทันตา" สนุกกว่า) มักรู้สึกว่าฝั่ง backend กับ database เป็นเรื่อง "น่ากลัว เป็นกล่องดำ" เลยข้ามไป แล้วก็ติดอยู่ตรงนั้นนาน ๆ บทความนี้จะพาคุณข้ามครึ่งหลังนี้ไปด้วยกัน ทีละก้าว
มาเคลียร์สองคำนี้ก่อน เพราะคนมักใช้ปนกัน
Database (ฐานข้อมูล) คือที่เก็บข้อมูลอย่างเป็นระบบ ลองนึกถึงตู้เอกสารขนาดใหญ่ที่จัดของเป็นหมวดหมู่อย่างเรียบร้อย ค้นหาเร็ว และเชื่อถือได้ — นั่นคือหน้าที่ของ database
SQL คือ "ภาษา" ที่เราใช้ "คุยกับ" ฐานข้อมูลเชิงสัมพันธ์ SQL ย่อมาจาก Structured Query Language (อ่านว่า "เอสคิวแอล" หรือ "ซีเควล" ก็ได้ ไม่ผิดทั้งคู่) มันคือภาษามาตรฐานสำหรับสั่งให้ฐานข้อมูลทำงาน เช่น "ขอข้อมูลลูกค้าทุกคนที่ยังใช้งานอยู่ให้หน่อย"
ส่วน SQL database ก็คือ relational database (ฐานข้อมูลเชิงสัมพันธ์) ที่เก็บข้อมูลในรูปแบบ ตาราง (table) ที่มีแถวและคอลัมน์ คล้ายไฟล์ Excel แต่ทรงพลังกว่ามาก เพราะแต่ละตารางสามารถ "เชื่อมโยง" กันได้ (เดี๋ยวเราจะพูดถึงเรื่องนี้ในหัวข้อ relational thinking)
นี่คือจุดที่มือใหม่สับสนกันมากที่สุด หลายคนคิดว่า SQL กับ MySQL เป็นสิ่งเดียวกัน — ไม่ใช่ครับ ลองแยกเป็น 3 ชั้นให้ชัด:
| ชั้น | คืออะไร | ตัวอย่าง |
|---|---|---|
| ภาษา | ภาษาที่ใช้สั่งงานฐานข้อมูล | SQL |
| DBMS (โปรแกรมจัดการฐานข้อมูล) | ซอฟต์แวร์ที่เข้าใจภาษา SQL | PostgreSQL, MySQL, SQLite |
| Database | ตัวข้อมูลจริง ๆ ที่ถูกเก็บ | ตาราง users, orders ในโปรเจกต์คุณ |
พูดง่าย ๆ คือ SQL เป็น "ภาษา" เหมือนภาษาอังกฤษ ส่วน MySQL กับ PostgreSQL เป็น "โปรแกรม" ที่ฟังภาษานั้นรู้เรื่อง MySQL เป็นแค่หนึ่งในหลาย ๆ DBMS ยอดนิยม ไม่ใช่ตัว SQL เอง
ถ้าคุณเสิร์ชหา "SQL คืออะไร" เป็นภาษาไทย เนื้อหาส่วนใหญ่จะเล่าในกรอบของสาย Data Analyst หรือ Data Analytics จนหลายคนเข้าใจว่า SQL เป็นเรื่องของคนทำรายงาน วิเคราะห์ตัวเลขเท่านั้น
ความจริงคือ web developer และ fullstack developer ใช้ SQL (หรือเครื่องมือที่ทำงานบน SQL) แทบทุกวัน เพราะทุกฟีเจอร์ที่ต้องอ่านหรือบันทึกข้อมูล ล้วนต้องคุยกับฐานข้อมูลทั้งนั้น พอเข้าใจตรงนี้แล้ว เรามาดูกันว่า database นั่งอยู่ตรงไหนของแอปจริง
ตรงนี้คือหัวใจของบทความ เพราะมันจะทำให้คุณเห็นภาพรวมที่หลายคนข้ามไป
ลองดูตัวอย่างจริง สมมติคุณกดปุ่ม "เข้าสู่ระบบ" บนเว็บ เบื้องหลังจะเกิดเหตุการณ์นี้ทีละสเต็ป:
เห็นไหมว่า database ไม่ได้คุยกับหน้าเว็บโดยตรง แต่มี backend เป็นตัวกลางคอยรับคำสั่งแล้วไปถามฐานข้อมูลให้
นี่แหละคือจุดที่คนเปลี่ยนสายมักมองไม่เห็น — frontend คือครึ่งแรก (ส่วนที่ผู้ใช้เห็นและกดได้) ส่วน backend + database คือครึ่งหลัง (ส่วนที่จัดการและจำข้อมูล) สองครึ่งนี้รวมกันถึงจะเรียกว่า Fullstack ถ้าคุณทำได้แค่ครึ่งแรก คุณก็ยังสร้างแอปที่ "จำอะไรไม่ได้" อยู่ดี
ข่าวดีคือคำสั่ง SQL ที่ใช้บ่อยจริง ๆ มีอยู่ไม่กี่กลุ่ม นักพัฒนาเรียกรวม ๆ ว่า CRUD ซึ่งย่อมาจาก Create, Read, Update, Delete ลองจับคู่กับการกระทำในแอปที่คุณคุ้นเคย:
| คำสั่ง SQL | ทำอะไร | ตัวอย่างในแอปจริง |
|---|---|---|
SELECT | อ่าน / ดึงข้อมูล | เปิดดูฟีดโพสต์ |
INSERT | เพิ่มข้อมูลใหม่ | สมัครสมาชิก / โพสต์ใหม่ |
UPDATE | แก้ไขข้อมูลเดิม | แก้โปรไฟล์ |
DELETE | ลบข้อมูล | ลบโพสต์ของตัวเอง |
ลองดูตัวอย่างคำสั่งจริง ที่อ่านแล้วเดาความหมายได้แทบจะทันที:
SELECT name, email FROM customers WHERE status = 'active';
แปลเป็นภาษาคนคือ "ขอ ชื่อ กับ อีเมล จากตาราง customers เฉพาะคนที่ status เป็น active" — เห็นไหมว่า SQL ออกแบบมาให้อ่านเหมือนประโยคภาษาอังกฤษ ไม่ได้น่ากลัวอย่างที่คิด
ทีนี้มาถึงแนวคิดที่ทำให้ relational database ทรงพลัง — แทนที่จะยัดข้อมูลทุกอย่างไว้ในตารางเดียว เราแยกเป็นหลายตารางแล้ว "เชื่อม" กัน
ลองนึกถึงร้านค้าออนไลน์ ผู้ใช้ 1 คน (User) สามารถมีคำสั่งซื้อ (Order) ได้หลายรายการ เราเรียกความสัมพันธ์แบบนี้ว่า one-to-many (หนึ่งต่อหลาย)
ถ้าเก็บข้อมูลผู้ใช้ซ้ำในทุกออเดอร์ พอผู้ใช้เปลี่ยนเบอร์โทร คุณต้องไล่แก้ทุกออเดอร์ ซึ่งเสี่ยงพังมาก แต่ถ้าแยกเป็นตาราง users กับ orders แล้วให้ออเดอร์เก็บแค่ "รหัสอ้างอิงถึงผู้ใช้" ข้อมูลก็ไม่ซ้ำซ้อน แก้ที่เดียวจบ การคิดแบบนี้แหละที่เรียกว่า relational thinking และมันคือทักษะสำคัญที่ทำให้คุณออกแบบระบบได้แข็งแรง (เรายังไม่ต้องลงลึกเรื่อง JOIN ตอนนี้ ขอแค่เห็นภาพว่าทำไมข้อมูลถึงแยกตารางก่อน)
มาถึงคำถามที่มือใหม่กังวลกันมาก — "แล้วฉันต้องนั่งเขียน SQL ดิบ ๆ ทุกบรรทัดเลยเหรอ?" คำตอบคือ ในงาน fullstack สมัยใหม่ ส่วนใหญ่ไม่ได้เขียน raw SQL ตรง ๆ ตลอดเวลา แต่ใช้เครื่องมือที่เรียกว่า ORM ช่วย
ORM ย่อมาจาก Object-Relational Mapping เป็นตัวกลางที่ให้เราเขียนโค้ดในภาษาที่ถนัด (เช่น TypeScript) แล้วมันแปลงเป็น SQL ให้เองเบื้องหลัง
ที่ DevNest เราใช้ Prisma เป็น ORM หลัก (คู่กับ PostgreSQL) Prisma เป็นเครื่องมือ open-source สำหรับแอป TypeScript/JavaScript ที่ให้ทั้ง data modeling, การทำ migration อัตโนมัติ และที่เด็ดสุดคือ type-safety — ช่วยให้โค้ดเช็กชนิดข้อมูลให้เราตั้งแต่ตอนเขียน ลดบั๊กไปได้เยอะ และมันรองรับฐานข้อมูลหลายตัว ทั้ง PostgreSQL, MySQL, SQLite ไปจนถึง MongoDB
วิธีที่เข้าใจง่ายที่สุดคือดูของจริงเทียบกัน สมมติเราอยากดึงข้อมูลผู้ใช้ทุกคน
ฝั่ง Prisma เขียนแบบนี้:
const users = await prisma.user.findMany();
เบื้องหลัง Prisma แปลงคำสั่งนี้เป็น SQL ประมาณนี้:
SELECT * FROM users;
จะเห็นว่าเราเขียนโค้ดสั้น อ่านง่าย และได้ type-safety แต่สุดท้ายแล้ว เบื้องหลังก็ยังเป็น SQL อยู่ดี Prisma แค่ทำหน้าที่ "แปล" ให้เรา ไม่ได้ทำให้ SQL หายไปไหน
หมายเหตุ: DevNest ใช้ Prisma เวอร์ชันล่าสุดในการสอน ตัวอย่างข้างบนเป็น syntax พื้นฐานที่เสถียร แต่บางฟีเจอร์ของ ORM อาจปรับเปลี่ยนตามเวอร์ชัน แนะนำให้เช็กกับเอกสารทางการของ Prisma เสมอเมื่อใช้งานจริง
อย่าเพิ่งดีใจว่ามี Prisma แล้วไม่ต้องเรียน SQL นะครับ นี่คือกับดักที่ทำให้ dev หลายคนติดอยู่กับที่
ORM ช่วยให้งานประจำเร็วขึ้นก็จริง แต่เมื่อไหร่ที่ระบบเริ่มซับซ้อนหรือช้า คุณจะต้องลงไปเข้าใจว่าเบื้องหลังเกิดอะไรขึ้น เหตุผลที่ความเข้าใจ SQL และ relational ยังจำเป็น:
สรุปสั้น ๆ คือ Prisma เป็น "เพื่อนช่วยทำงาน" ที่ดี แต่คุณต้องเข้าใจ SQL พอที่จะ "ตรวจงานเพื่อน" ได้
อีกหนึ่งความเข้าใจผิดคือคิดว่า NoSQL "ใหม่กว่า เลยดีกว่า" SQL ความจริงคือทั้งสองแบบมีจุดเด่นต่างกัน และเลือกใช้ตามลักษณะงาน
Rule of thumb ที่จำง่าย:
เสริมเชิงเทคนิคสั้น ๆ:
| SQL (Relational) | NoSQL | |
|---|---|---|
| โครงสร้าง | วาง schema ล่วงหน้าชัดเจน | ยืดหยุ่น ไม่ต้องกำหนดตายตัว |
| การ scale | มักขยายแนวตั้ง (เพิ่มสเปกเครื่อง) | ขยายแนวนอนได้ดี (เพิ่มจำนวนเครื่อง) |
| จุดแข็ง | ธุรกรรมหลายขั้นตอนที่ต้องแม่นยำ | ข้อมูลปริมาณมากที่โครงสร้างไม่ตายตัว |
สำหรับมือใหม่ คำแนะนำของชุมชน dev ตรงกันว่า เริ่มจาก relational database อย่าง PostgreSQL หรือ MySQL ก่อน เพราะมันสอนให้คุณคิดเป็นระบบ และเป็นพื้นฐานที่ใช้ได้กับงานส่วนใหญ่ในตลาด
อ่านมาถึงตรงนี้ คุณเห็นภาพรวมแล้ว ทีนี้มาลงมือจริงกัน นี่คือลำดับที่แนะนำสำหรับคนเริ่มจากศูนย์:
SELECT แรกของคุณ — ลองดึงข้อมูลออกมาดูให้รู้สึกว่า "ฉันคุยกับฐานข้อมูลได้แล้ว"users แล้วลอง INSERT ข้อมูลเข้าไปพอทำครบสี่ขั้นนี้ คุณจะปลดล็อก "ครึ่งหลัง" ของการเป็น dev เต็มตัว — จากคนที่ทำได้แค่หน้าเว็บ กลายเป็นคนที่สร้างระบบครบวงจรได้จริง
ถ้าคุณอยากข้ามจาก frontend ไปสู่ fullstack แบบมีคนนำทาง ไม่ต้องงมเองทีละจุด คอร์ส Fullstack ของ DevNest สอนจาก stack ที่เราใช้งานจริง — Next.js + Nest.js + PostgreSQL + Prisma ตัวเดียวกับที่อยู่ในบทความนี้ทั้งหมด คุณจะได้ฝึกทำ flow end-to-end จริง ไม่ใช่แค่ทฤษฎี
ถ้าจะหยิบ 3 ใจความกลับบ้าน ก็คือ:
backend กับ database ไม่ใช่กล่องดำที่น่ากลัวอย่างที่คิด มันแค่เป็นส่วนที่คุณยังไม่ได้ลองจับ และเมื่อจับแล้ว คุณจะมองแอปทุกตัวออกว่ามันทำงานยังไง ถ้าพร้อมจะเดินครึ่งหลังนี้แบบมีรุ่นพี่นำทาง DevNest พร้อมไปกับคุณเสมอ