0
1.2 ฐานข้อมูลเชิงสัมพันธ์ (Relational Database) คืออะไร | SQL for Data Analyst
บทที่ 1 — SQL คืออะไร & โลกของฐานข้อมูล
บทที่ 1 A B C D E
บทที่ 1 · ตอนที่ 1.2

ฐานข้อมูลเชิงสัมพันธ์ (Relational Database) คืออะไร

ตอนที่แล้วเรารู้จัก SQL แบบผิวเผินแล้ว ตอนนี้เราจะเจาะลึกไปที่ “บ้าน” ของ SQL นั่นคือฐานข้อมูลเชิงสัมพันธ์ ว่าทำไมข้อมูลถึงถูกเก็บเป็นตาราง และตารางแต่ละใบสัมพันธ์กันยังไง

⏱ อ่านประมาณ 13 นาที 📈 ระดับ: เริ่มต้น
ตอนแรกที่ผมเห็นคำว่า “ฐานข้อมูลเชิงสัมพันธ์” ก็รู้สึกว่าฟังดูวิชาการน่ากลัวเหมือนกันครับ 😅 แต่พอเข้าใจแล้วจะรู้ว่ามันคือแนวคิดง่าย ๆ ที่เราคุ้นเคยอยู่แล้วในชีวิตประจำวัน แค่เรายังไม่เคยเรียกมันด้วยชื่อนี้เท่านั้นเอง มาดูกันครับว่าทำไม

ฐานข้อมูลเชิงสัมพันธ์ คืออะไร

ฐานข้อมูลเชิงสัมพันธ์ (Relational Database) คือฐานข้อมูลที่เก็บข้อมูลในรูปแบบ “ตาราง” (table) หลาย ๆ ใบ โดยแต่ละตารางเก็บข้อมูลเรื่องใดเรื่องหนึ่งโดยเฉพาะ แล้วตารางเหล่านั้นก็ “สัมพันธ์” กันผ่านคอลัมน์ที่เชื่อมโยงกันได้

ลองนึกภาพร้านค้าออนไลน์ร้านหนึ่ง แทนที่จะเก็บทุกอย่างไว้ในตารางเดียวยาวเป็นพรืด เขาจะแยกเป็นตารางย่อยตามหัวข้อ เช่น

  • customers — เก็บข้อมูลลูกค้า (ชื่อ, อีเมล, วันที่สมัคร)
  • orders — เก็บข้อมูลคำสั่งซื้อ (วันที่สั่ง, ลูกค้าคนไหนสั่ง, ยอดรวม)
  • products — เก็บข้อมูลสินค้า (ชื่อสินค้า, ราคา, หมวดหมู่)

แต่ละตารางแยกเรื่องกันชัดเจน แล้วเชื่อมกันด้วย “กุญแจ” ที่บอกว่าออเดอร์นี้เป็นของลูกค้าคนไหน ซึ่งเราจะเรียกกุญแจนี้ว่า Key (จะเจาะลึกเรื่อง Primary Key และ Foreign Key ต่อในบทที่ 4 เรื่อง JOIN)

ทำไมต้องแยกเป็นหลายตาราง

คำถามที่มือใหม่มักสงสัยคือ “ทำไมไม่รวมทุกอย่างไว้ในตารางเดียวไปเลย จะได้ไม่ต้องเชื่อมให้ยุ่งยาก” คำตอบคือ ถ้ารวมทุกอย่างไว้ตารางเดียว จะเกิดปัญหาข้อมูลซ้ำซ้อนมหาศาล เช่น ถ้าลูกค้าคนหนึ่งสั่งซื้อ 50 ครั้ง ก็ต้องพิมพ์ชื่อ อีเมล ที่อยู่ของลูกค้าคนนั้นซ้ำถึง 50 แถว ทำให้:

  • ไฟล์ข้อมูลใหญ่โตเกินจำเป็น
  • ถ้าลูกค้าเปลี่ยนอีเมล ต้องไปแก้ทีละ 50 แถว เสี่ยงตกหล่น
  • ข้อมูลไม่สอดคล้องกัน (แถวหนึ่งอีเมลเก่า อีกแถวอีเมลใหม่)

การแยกตารางแล้วเชื่อมด้วย Key จึงช่วยให้ข้อมูลแต่ละเรื่อง ถูกเก็บแค่ที่เดียว และอัปเดตง่าย ถูกต้อง สอดคล้องกันเสมอ

ตัวอย่างตาราง
-- ตาราง customers
customer_id | name  | email
------------|-------|------------------
1           | Nisa   | nisa@mail.com
2           | Ton    | ton@mail.com

-- ตาราง orders (เชื่อมกับ customers ผ่าน customer_id)
order_id | customer_id | total
---------|-------------|-------
101      | 1           | 590
102      | 1           | 1200
103      | 2           | 350

สังเกตว่าตาราง orders ไม่ได้เก็บชื่อหรืออีเมลลูกค้าซ้ำอีก แต่เก็บแค่ customer_id ไว้ “อ้างอิง” กลับไปที่ตาราง customers เท่านั้น เวลาอยากรู้ว่าออเดอร์ 101 เป็นของใคร เราค่อยใช้ SQL เชื่อมสองตารางนี้เข้าด้วยกัน (เดี๋ยวเราจะเรียนคำสั่งนี้แบบเต็ม ๆ ในบทที่ 4)

💭
ลองเทียบกับตู้เอกสารในออฟฟิศ: แทนที่จะเก็บทุกอย่างไว้ในแฟ้มเดียวหนาเตอะ เรามักแยกเป็นแฟ้ม “ลูกค้า” แฟ้ม “ใบสั่งซื้อ” แฟ้ม “สินค้า” แล้วแปะเลขอ้างอิงเชื่อมกันไว้ — ฐานข้อมูลเชิงสัมพันธ์ก็ทำงานแบบเดียวกันนี่แหละครับ เพียงแค่เร็วกว่าและค้นหาได้อัตโนมัติ

ทำไม SQL ถึงเหมาะกับข้อมูลแบบนี้

SQL ถูกออกแบบมาตั้งแต่ต้นให้ทำงานกับข้อมูลรูปแบบตารางที่สัมพันธ์กันแบบนี้โดยเฉพาะ คำสั่งอย่าง JOIN ที่เราจะเรียนในบทที่ 4 ก็คือเครื่องมือหลักที่ใช้ “เชื่อม” ตารางเหล่านี้เข้าด้วยกันตอนดึงข้อมูลออกมาดู นี่คือเหตุผลที่แทบทุกระบบฐานข้อมูลในโลกธุรกิจ ไม่ว่าจะเป็น PostgreSQL, MySQL, BigQuery, Snowflake ล้วนใช้ SQL เป็นภาษาหลักในการสื่อสาร

💡
เคล็ดลับ: เวลาเจอฐานข้อมูลใหม่ที่ไม่คุ้นเคย ให้ลองถามตัวเองก่อนว่า “มีตารางอะไรบ้าง” และ “แต่ละตารางเก็บเรื่องอะไร” การเข้าใจโครงสร้างตารางก่อนเขียน query จะช่วยประหยัดเวลาได้เยอะมาก
📌
จำง่าย ๆ: ฐานข้อมูลเชิงสัมพันธ์ = ข้อมูลถูกแยกเก็บเป็นหลายตารางตามหัวข้อ แล้วเชื่อมกันด้วย Key เพื่อลดความซ้ำซ้อน

สรุปตอนนี้

  • ฐานข้อมูลเชิงสัมพันธ์เก็บข้อมูลเป็นตารางหลายใบ แยกตามหัวข้อ
  • ตารางเชื่อมกันด้วย Key (จะเรียนละเอียดในบทที่ 4 เรื่อง JOIN)
  • การแยกตารางช่วยลดข้อมูลซ้ำซ้อนและทำให้ข้อมูลสอดคล้องกัน
  • ตอนถัดไป: มาทำความรู้จัก Table, Row, Column และ Schema กันแบบละเอียดขึ้น
แบบฝึกหัด

ลองมือทำจริง

ยังไม่ต้องรันจริงก็ได้ครับ ลองตอบตามความเข้าใจ แล้วกด “ดูเฉลย” เพื่อเช็กว่าคิดถูกทางไหม

1. ถ้าคุณจะออกแบบฐานข้อมูลสำหรับร้านหนังสือออนไลน์ ลองเขียนชื่อตารางที่ควรมีอย่างน้อย 3 ตาราง พร้อมบอกสั้น ๆ ว่าแต่ละตารางเก็บอะไร

2. ทำไมการแยกข้อมูลลูกค้าออกจากตาราง orders ถึงช่วยลดปัญหาได้ ลองอธิบายด้วยคำพูดตัวเอง