บทที่ 9: Database
“บ้านต้องมีที่เก็บของ Database คือตู้เก็บเอกสารของเว็บไซต์”
The Blueprint (พิมพ์เขียว)
Section titled “The Blueprint (พิมพ์เขียว)”ทุกแอปพลิเคชันต้อง “จำ” ข้อมูล:
- รายชื่อผู้ใช้
- สินค้าในระบบ
- ประวัติการสั่งซื้อ
Database = ตู้เก็บเอกสารดิจิทัล ที่ค้นหาได้เร็ว เก็บได้เยอะ และปลอดภัย
The Construction Site (หน้างานก่อสร้าง)
Section titled “The Construction Site (หน้างานก่อสร้าง)”📁 SQL vs NoSQL
Section titled “📁 SQL vs NoSQL”| Feature | SQL | NoSQL |
|---|---|---|
| โครงสร้าง | ตารางตายตัว | ยืดหยุ่น |
| ความสัมพันธ์ | Relational | Document-based |
| ตัวอย่าง | PostgreSQL, MySQL | MongoDB |
| เหมาะกับ | E-commerce, Finance | CMS, IoT |
🐘 PostgreSQL — ตู้เก็บเอกสารมีระเบียบ
Section titled “🐘 PostgreSQL — ตู้เก็บเอกสารมีระเบียบ”-- สร้างตารางCREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(255) UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT NOW());
-- ดึงข้อมูลSELECT * FROM users WHERE email LIKE '%@gmail.com';
-- เชื่อมตาราง (JOIN)SELECT orders.*, users.nameFROM ordersJOIN users ON orders.user_id = users.id;🍃 MongoDB — กล่องใส่ของยืดหยุ่น
Section titled “🍃 MongoDB — กล่องใส่ของยืดหยุ่น”// Document (เหมือน JSON){ "_id": "abc123", "name": "สมชาย", "email": "somchai@email.com", "orders": [ { "product": "iPhone", "price": 35000 }, { "product": "Case", "price": 500 } ]}Material Selection (เลือกสเปกวัสดุ)
Section titled “Material Selection (เลือกสเปกวัสดุ)”🟢 Supabase — PostgreSQL + BaaS
Section titled “🟢 Supabase — PostgreSQL + BaaS”import { createClient } from '@supabase/supabase-js';
const supabase = createClient(url, key);
// ดึงข้อมูลconst { data, error } = await supabase .from('products') .select('*') .eq('category', 'electronics');
// เพิ่มข้อมูลconst { data, error } = await supabase .from('products') .insert({ name: 'iPhone 15', price: 35000 });📊 Database Selection Guide
Section titled “📊 Database Selection Guide”| โปรเจกต์ | Database แนะนำ |
|---|---|
| E-commerce | PostgreSQL |
| Blog/CMS | MongoDB หรือ PostgreSQL |
| Real-time | Supabase |
| Analytics | ClickHouse |
Architect’s Note (บันทึกสถาปนิก)
Section titled “Architect’s Note (บันทึกสถาปนิก)”⚠️ ข้อควรระวัง
Section titled “⚠️ ข้อควรระวัง”- ใช้ Index — Query ที่ค้นหาบ่อยต้องมี Index
- Backup เป็นประจำ — Database หาย = ธุรกิจหาย
- อย่าเก็บ Password เป็น Plain Text — Hash ด้วย bcrypt
💡 Best Practices
Section titled “💡 Best Practices”- ใช้ ORM (Prisma, Drizzle) แทน Raw SQL
- Normalize ข้อมูล (ลดการซ้ำซ้อน)
- ใช้ Transactions สำหรับ operations ที่ต้องสำเร็จพร้อมกัน