ทำไม Data Modelling ถึงเป็นหัวใจสำคัญของงานสายข้อมูล
เวลาเราเริ่มฝึกเขียนโปรแกรมหรือทำโปรเจกต์เกี่ยวกับฐานข้อมูล หลายคนมักพุ่งเป้าไปที่การเขียนคำสั่งดึงข้อมูลทันที แต่ถ้าเราไม่วางโครงสร้างให้ดีตั้งแต่ต้น เหมือนการสร้างบ้านโดยไม่มีพิมพ์เขียว สุดท้ายเราจะเจอปัญหาข้อมูลซ้ำซ้อนหรือดึงข้อมูลมาใช้งานได้ยากมาก Data Modelling (กระบวนการออกแบบโครงสร้างข้อมูล) จึงเป็นขั้นตอนแรกที่สำคัญที่สุดในการจัดระเบียบข้อมูลให้เป็นระบบ
ลองจินตนาการว่าคุณต้องจัดเก็บข้อมูลร้านค้าออนไลน์ ถ้าคุณเอาทุกอย่างใส่ลงในกระดาษแผ่นเดียว ทั้งชื่อลูกค้า สินค้าที่ซื้อ และที่อยู่ร้าน คุณจะพบว่าเมื่อลูกค้าซื้อซ้ำ คุณต้องเขียนชื่อและที่อยู่เดิมซ้ำๆ หลายครั้ง Data Modelling จะเข้ามาช่วยแบ่งข้อมูลเหล่านี้ออกเป็นหมวดหมู่ที่ชัดเจน เพื่อให้เราจัดการข้อมูลได้ง่ายและไม่เสียพื้นที่จัดเก็บโดยเปล่าประโยชน์
สำหรับมือใหม่ การทำความเข้าใจโครงสร้างข้อมูลคือทักษะที่แยกโปรแกรมเมอร์ที่ทำงานเป็นระบบออกจากคนที่ทำแค่ให้เสร็จไปวันๆ เมื่อเราออกแบบโมเดลได้แข็งแรง การเขียนโปรแกรมหรือการเขียน Query (คำสั่งถามข้อมูลจากฐานข้อมูล) ในอนาคตจะราบรื่นขึ้นมาก เพราะเราเห็นภาพชัดเจนว่าข้อมูลแต่ละส่วนเชื่อมโยงกันอย่างไร
แยก Fact และ Dimension เพื่อจัดระเบียบข้อมูล
ในการออกแบบฐานข้อมูล เรามักแบ่งตารางออกเป็นสองประเภทหลักคือ Fact Table (ตารางเก็บข้อมูลเชิงปริมาณ) และ Dimension Table (ตารางเก็บข้อมูลบริบทหรือรายละเอียด) การแยกแบบนี้ช่วยให้เราไม่ต้องเก็บข้อมูลซ้ำซ้อน และทำให้การวิเคราะห์ข้อมูลทำได้เร็วขึ้นมาก เหมือนการแยก "ตัวเลขยอดขาย" ออกจาก "ข้อมูลชื่อลูกค้า"
Fact Table จะเป็นตารางที่เก็บเหตุการณ์ที่เกิดขึ้นจริง เช่น รายการสั่งซื้อสินค้าแต่ละครั้ง ซึ่งมักจะเป็นตัวเลขที่นำไปคำนวณได้ ส่วน Dimension Table จะเก็บรายละเอียดที่ช่วยให้เราเข้าใจ Fact ได้มากขึ้น เช่น ชื่อลูกค้า ที่อยู่ หรือชื่อสินค้า การแยกกันแบบนี้ทำให้เวลาเราอยากเปลี่ยนที่อยู่ลูกค้า เราก็แค่แก้ในตาราง Dimension ตารางเดียว ข้อมูลในตาราง Fact ก็จะอัปเดตตามไปเองโดยอัตโนมัติ
การแยกตารางแบบนี้ช่วยลดโอกาสเกิดข้อผิดพลาดในการป้อนข้อมูลได้มหาศาล มือใหม่มักพลาดด้วยการพยายามเก็บทุกอย่างไว้ในตารางเดียว (Flat Table) ซึ่งจะนำไปสู่ปัญหาข้อมูลไม่ตรงกันในอนาคต การฝึกแยก Fact และ Dimension จึงเป็นการฝึกคิดเชิงตรรกะที่โปรแกรมเมอร์ทุกคนต้องมีติดตัวไว้
รู้จักกับ Star Schema และ Snowflake Schema
หลังจากที่เราแยกตารางข้อมูลได้แล้ว คำถามต่อมาคือเราจะเชื่อมโยงตารางเหล่านี้เข้าหากันอย่างไร วิธีที่นิยมที่สุดสองแบบคือ Star Schema (โครงสร้างแบบรูปดาว) และ Snowflake Schema (โครงสร้างแบบเกล็ดหิมะ) ซึ่งทั้งคู่มีจุดประสงค์ต่างกันในการใช้งาน
Star Schema คือรูปแบบที่ตาราง Fact อยู่ตรงกลาง และมีตาราง Dimension ล้อมรอบเหมือนดาว เหมาะมากสำหรับงานวิเคราะห์ข้อมูล เพราะมันเข้าใจง่ายและทำความเร็วได้ดีเยี่ยม ส่วน Snowflake Schema คือการนำตาราง Dimension มาแตกย่อยออกไปอีกชั้นหนึ่งเพื่อลดการเก็บข้อมูลที่ซ้ำซ้อนกันจริงๆ ในกรณีที่ข้อมูลมีความซับซ้อนสูงและต้องการความแม่นยำระดับสูงสุด
สำหรับการเริ่มต้นทำโปรเจกต์แนะนำให้ลองใช้ Star Schema ก่อนเสมอ เพราะมันเป็นมาตรฐานที่เรียบง่ายและยืดหยุ่นพอสำหรับโปรเจกต์ส่วนใหญ่ การออกแบบที่ซับซ้อนเกินไปตั้งแต่เริ่มอาจทำให้เราหลงทางได้ง่ายๆ ดังนั้นให้เน้นที่ความเรียบง่ายและประสิทธิภาพในการดึงข้อมูลเป็นหลัก
การสร้างความสัมพันธ์ (Relationships) ระหว่างตาราง
เมื่อเรามีตารางหลายใบแล้ว เราต้องสร้าง Relationships (ความสัมพันธ์เชิงตรรกะระหว่างตาราง) เพื่อให้ฐานข้อมูลรู้ว่าข้อมูลบรรทัดนี้ในตารางลูกค้า สัมพันธ์กับข้อมูลบรรทัดไหนในตารางยอดขาย โดยปกติเราจะใช้ Primary Key (ตัวระบุข้อมูลหลักที่ไม่ซ้ำกัน) เชื่อมกับ Foreign Key (ตัวระบุที่ใช้เชื่อมโยงไปยังตารางอื่น)
ความสัมพันธ์ที่พบบ่อยที่สุดคือ One-to-Many (หนึ่งต่อกลุ่ม) เช่น ลูกค้าหนึ่งคนสามารถมีรายการสั่งซื้อได้หลายครั้ง เราจะใช้ ID ของลูกค้าเป็นตัวเชื่อมระหว่างตารางลูกค้าและตารางยอดขาย นี่คือพื้นฐานสำคัญที่ทำให้เราสามารถดึงข้อมูลมาแสดงผลได้อย่างถูกต้องและครบถ้วน
-- ตัวอย่างการสร้างความสัมพันธ์เบื้องต้นด้วย SQL
-- สร้างตารางลูกค้า
CREATE TABLE Customers (
CustomerID int PRIMARY KEY, -- ตัวระบุหลักของลูกค้า
CustomerName varchar(255)
);
-- สร้างตารางยอดขายที่เชื่อมกับลูกค้า
CREATE TABLE Sales (
SalesID int PRIMARY KEY,
CustomerID int, -- เชื่อมโยงไปยัง Customers
Amount decimal,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);
ในโค้ดชุดนี้ บรรทัดที่ระบุ PRIMARY KEY คือการกำหนดว่า ID นี้ห้ามซ้ำ ส่วน FOREIGN KEY คือการบอกฐานข้อมูลว่า CustomerID ในตาราง Sales ต้องไปอ้างอิงกับตาราง Customers เท่านั้น เป็นการป้องกันไม่ให้เราใส่ข้อมูลมั่วๆ เข้าไปในระบบ
ผลลัพธ์ที่ควรเห็นคือ เราสามารถเขียนคำสั่งดึงข้อมูลของลูกค้าและยอดขายมาแสดงรวมกันได้แม่นยำ โดยไม่ต้องกังวลว่าข้อมูลจะหลุดหายไปไหน เพราะฐานข้อมูลได้ตรวจสอบความสัมพันธ์ให้เราเรียบร้อยแล้ว
ทำความเข้าใจการทำ Joins เพื่อดึงข้อมูลมาใช้
เมื่อเราออกแบบตารางและสร้างความสัมพันธ์ไว้แล้ว ขั้นตอนต่อไปคือการดึงข้อมูลออกมาแสดงผลด้วย Joins (คำสั่งรวมตารางข้อมูลเข้าด้วยกัน) การทำ Inner Join จะเป็นการดึงเฉพาะข้อมูลที่มีอยู่ในทั้งสองตารางมาแสดง ทำให้เราได้ผลลัพธ์ที่ตรงไปตรงมาและชัดเจน
มือใหม่มักจะสับสนระหว่าง Left Join และ Inner Join ให้จำไว้ว่า Left Join จะดึงข้อมูลจากตารางฝั่งซ้ายมาทั้งหมด แม้ว่าฝั่งขวาจะไม่มีข้อมูลที่ตรงกันก็ตาม ส่วน Inner Join จะต้องมีข้อมูลตรงกันทั้งสองฝั่งถึงจะแสดงออกมา การเลือกใช้ให้ถูกสถานการณ์จะช่วยให้คุณได้ข้อมูลที่ถูกต้องตามความต้องการของโปรเจกต์
-- ดึงข้อมูลยอดขายพร้อมชื่อลูกค้า
SELECT Sales.SalesID, Customers.CustomerName, Sales.Amount
FROM Sales
INNER JOIN Customers ON Sales.CustomerID = Customers.CustomerID;
คำสั่ง SELECT ระบุคอลัมน์ที่ต้องการ ส่วน INNER JOIN ทำหน้าที่เชื่อมตาราง Sales กับ Customers โดยใช้ CustomerID เป็นสะพานเชื่อมเพื่อให้ได้ข้อมูลที่สัมพันธ์กันจริงๆ
ผลลัพธ์ที่ได้จะเป็นตารางแสดงรายการยอดขายที่มาพร้อมกับชื่อลูกค้า ซึ่งคุณสามารถนำไปทำรายงานหรือแสดงบนหน้าเว็บไซต์ได้ทันที นี่คือจุดที่ทำให้การออกแบบฐานข้อมูลที่ดีแสดงพลังออกมาให้เห็นชัดที่สุด
สรุปและแนวทางการนำไปใช้งานจริง
การเข้าใจ Data Modelling ไม่ใช่เรื่องไกลตัว แต่เป็นทักษะที่ทุกคนในสายงานซอฟต์แวร์ต้องมี เริ่มจากการฝึกออกแบบตารางที่แยก Fact และ Dimension ให้ชัดเจน แล้วค่อยๆ สร้างความสัมพันธ์ระหว่างตารางด้วย Relationships ที่เหมาะสม เมื่อทำจนคล่องแล้ว การดึงข้อมูลด้วย Joins จะกลายเป็นเรื่องที่ง่ายและเป็นธรรมชาติสำหรับคุณ
สำหรับคนที่กำลังฝึกเขียนโค้ด ลองนำไปปรับใช้กับโปรเจกต์เล็กๆ เช่น ระบบทำบัญชีรายรับ-รายจ่ายส่วนตัว แทนที่จะเก็บทุกอย่างไว้ในไฟล์ Excel หรือตารางเดียว ลองแยกตาราง "รายการจ่าย" เป็น Fact และตาราง "หมวดหมู่ค่าใช้จ่าย" เป็น Dimension ดู แล้วคุณจะเห็นว่าการจัดการข้อมูลนั้นสนุกและเป็นระเบียบขึ้นแค่ไหน
หัวใจสำคัญคือการเริ่มจากจุดเล็กๆ ที่จับต้องได้ ไม่ต้องรีบออกแบบฐานข้อมูลระดับองค์กรตั้งแต่แรก แค่คุณเริ่มวางโครงสร้างให้เป็นระบบตั้งแต่วันนี้ ทักษะการวิเคราะห์และออกแบบข้อมูลของคุณจะพัฒนาขึ้นอย่างรวดเร็ว และทำให้คุณก้าวเข้าใกล้การเป็นโปรแกรมเมอร์ที่เก่งและทำงานเป็นระบบมากขึ้นในทุกๆ วัน
ที่มา: Data Modelling, Relationships & Joins — DEV Community