Notes & software courses · Free to learn
Aph's Blog
On this page

Relational Model & ออกแบบตาราง

👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ

เข้าใจตาราง แถว คอลัมน์ key และความสัมพันธ์ — รากฐานของการออกแบบฐานข้อมูลที่ดี

เกือบทุกแอปจริงต้องเก็บข้อมูลถาวรในฐานข้อมูล (database) ชนิดที่นิยมสุดคือ relational database ที่เก็บข้อมูลเป็นตาราง หัวข้อนี้สอนวิธีคิดเรื่องการออกแบบตารางให้ดีตั้งแต่ต้น ก่อนเขียน SQL จริง

ตาราง แถว คอลัมน์ และ key

ข้อมูลเก็บเป็นตาราง แต่ละแถว (row) คือหนึ่งรายการ แต่ละคอลัมน์ (column) คือคุณสมบัติหนึ่ง

คำความหมาย
Tableตารางเก็บข้อมูลชนิดเดียวกัน (เช่น users)
Rowหนึ่งรายการ (ผู้ใช้หนึ่งคน)
Columnคุณสมบัติหนึ่ง (name, email)
Primary Keyคอลัมน์ที่ระบุแต่ละแถวไม่ซ้ำ (id)
Foreign Keyคอลัมน์ที่ชี้ไป primary key ของอีกตาราง
ตาราง users                    ตาราง posts
+----+--------+              +----+---------+----------+
| id | name   |              | id | title   | user_id  |  <- FK ชี้ไป users.id
+----+--------+              +----+---------+----------+
|  1 | Aph    |              |  1 | Hello   |    1     |
|  2 | Bee    |              |  2 | World   |    1     |
+----+--------+              +----+---------+----------+

ความสัมพันธ์ระหว่างตาราง

แบบตัวอย่างทำยังไง
One-to-Manyผู้ใช้ 1 คน มีหลายโพสต์posts มี FK user_id
Many-to-Manyนักเรียน-วิชา (ลงได้หลายวิชา)ตารางกลาง (enrollment)
One-to-Oneผู้ใช้ 1 คน มี 1 profileFK + unique

Normalization — อย่าเก็บข้อมูลซ้ำ

หลักการคือไม่เก็บข้อมูลเดียวกันซ้ำหลายที่ เพราะแก้ยากและเสี่ยงไม่ตรงกัน แยกข้อมูลออกเป็นตารางแล้วเชื่อมด้วย key แทน

# ❌ เก็บชื่อผู้ใช้ซ้ำในทุกโพสต์ (แก้ชื่อต้องตามแก้ทุกแถว)
posts: | id | title | user_name |

# ✅ เก็บ user_id ชี้ไปตาราง users (แก้ชื่อที่เดียว)
posts: | id | title | user_id |  ->  users: | id | name |
ออกแบบดีตั้งแต่ต้น = แก้ทีหลังน้อย

การวาง schema ให้ดีตั้งแต่แรก (แยกตารางตามชนิดข้อมูล, ตั้ง key ให้ถูก) ช่วยลดปัญหามหาศาลในอนาคต — เปลี่ยน schema ของระบบที่มีข้อมูลแล้วยุ่งยากกว่าเขียนโค้ดมาก

สรุปหัวข้อนี้

  • ข้อมูลเก็บเป็นตาราง: row (รายการ) × column (คุณสมบัติ)
  • Primary Key ระบุแถวไม่ซ้ำ; Foreign Key เชื่อมไปตารางอื่น
  • ความสัมพันธ์: 1-many (FK), many-many (ตารางกลาง), 1-1
  • Normalization: อย่าเก็บซ้ำ แยกตาราง+เชื่อมด้วย key
แบบฝึกหัด

1) ออกแบบ schema ระบบยืม-คืนหนังสือ (members, books, loans) 2) ระบุ primary key และ foreign key ของแต่ละตาราง 3) ระบุว่าความสัมพันธ์ member-loan เป็นแบบไหน 4) ชี้จุดที่ออกแบบผิดถ้าเก็บชื่อสมาชิกซ้ำในตาราง loans