ทำไมต้องรู้จักประเภทข้อมูล (Data Types) ในฐานข้อมูล
เวลาเราสร้างแอปพลิเคชัน ข้อมูลทุกอย่างต้องมีที่เก็บที่เป็นระเบียบ T-SQL Data Types (ประเภทของข้อมูลในภาษาสำหรับจัดการฐานข้อมูล) คือตัวกำหนดว่าช่องเก็บข้อมูลนั้นจะเก็บอะไรได้บ้าง เหมือนเราเตรียมกล่องใส่ของ ถ้าเราจะเก็บปากกา ก็ต้องเลือกกล่องที่ยาวพอ ถ้าจะเก็บเหรียญ ก็ต้องใช้กล่องใบเล็กที่ปิดสนิท
ถ้าเราเลือกประเภทข้อมูลไม่เหมาะสม Database (ระบบที่ใช้เก็บและจัดการข้อมูล) ของเราจะทำงานหนักเกินจำเป็น เหมือนเอาตู้คอนเทนเนอร์มาใส่แค่เข็มเล่มเดียว มันเสียพื้นที่และทำให้การค้นหาข้อมูลช้าลงมาก การเลือกประเภทข้อมูลให้ถูกต้องจึงเป็นทักษะพื้นฐานที่โปรแกรมเมอร์มือโปรต้องแม่นยำตั้งแต่เริ่มงาน
ในการทำงานจริง คุณจะได้เจอกับฐานข้อมูลของ Microsoft ที่เรียกว่า MS-SQL (ระบบจัดการฐานข้อมูลของไมโครซอฟท์) ซึ่งมีประเภทข้อมูลให้เลือกใช้เยอะมาก บทความนี้จะคัดเฉพาะตัวที่คุณต้องใช้บ่อยที่สุดมาให้เรียนรู้กัน เพื่อให้คุณออกแบบฐานข้อมูลได้เก่งเหมือนคนทำงานที่มีประสบการณ์
เก็บตัวเลขด้วย INT และ BIGINT
เมื่อต้องเก็บข้อมูลที่เป็นตัวเลขจำนวนเต็ม เราจะใช้ INT หรือ BIGINT ขึ้นอยู่กับว่าตัวเลขนั้นใหญ่แค่ไหน INT (เลขจำนวนเต็มขนาดมาตรฐาน) เหมาะสำหรับข้อมูลทั่วไป เช่น จำนวนสินค้าในสต็อก หรือลำดับไอดีของสมาชิก เพราะมันใช้พื้นที่เก็บน้อยและประมวลผลได้เร็ว
แต่ถ้าข้อมูลของคุณมีโอกาสพุ่งสูงเกิน 2 พันล้าน เช่น ยอดวิวรวมของวิดีโอหรือรหัสธุรกรรมระดับโลก คุณต้องใช้ BIGINT (เลขจำนวนเต็มขนาดใหญ่พิเศษ) แทน เพราะ INT จะเก็บค่าได้จำกัด ถ้าตัวเลขเกินขีดจำกัดจะทำให้เกิดข้อผิดพลาดที่เรียกว่า Overflow (ข้อมูลล้นจนระบบแจ้งเตือนว่าเก็บไม่ไหว)
จุดที่มือใหม่มักพลาดคือการเลือกใช้ BIGINT ไว้ก่อนเสมอเพราะกลัวไม่พอ จริงๆ แล้วการใช้พื้นที่เกินจำเป็นจะทำให้ฐานข้อมูลมีขนาดใหญ่ขึ้นโดยไม่จำเป็น ให้เลือกใช้ตามความเหมาะสมของงานเสมอ ถ้าเป็นจำนวนนับทั่วไป INT ก็เพียงพอแล้วครับ
-- สร้างตารางเก็บจำนวนสินค้า
CREATE TABLE Products (
ProductID INT, -- ใช้ INT เพราะสินค้าไม่น่าเกิน 2 พันล้านชิ้น
TotalViews BIGINT -- ใช้ BIGINT เผื่อยอดวิวสูงระดับโลก
);
คำอธิบาย: บรรทัด CREATE TABLE คือการสร้างตารางใหม่ขึ้นมา ในวงเล็บคือการกำหนดชื่อคอลัมน์และประเภทข้อมูล กำหนดให้ ProductID เป็น INT และ TotalViews เป็น BIGINT เพื่อรองรับขนาดข้อมูลที่ต่างกัน
ผลลัพธ์: ระบบจะสร้างตารางชื่อ Products ที่มีช่องสำหรับใส่ตัวเลขจำนวนเต็มตามขนาดที่กำหนดไว้
เก็บข้อมูลทศนิยมด้วย DECIMAL
เวลาเก็บเงินหรือค่าที่ต้องแม่นยำสูง เราห้ามใช้ตัวเลขแบบปกติเด็ดขาด เพราะคอมพิวเตอร์มักจะคำนวณทศนิยมผิดพลาดเล็กน้อย เราจึงต้องใช้ DECIMAL (ประเภทข้อมูลเลขทศนิยมที่แม่นยำสูง) ในการจัดเก็บค่าเหล่านี้แทนครับ
เวลาเขียน DECIMAL(10, 2) เลขตัวแรกคือจำนวนหลักรวมทั้งหมด และเลขตัวหลังคือจำนวนหลักหลังจุดทศนิยม ตัวอย่างเช่น 10, 2 หมายความว่าเราเก็บตัวเลขได้สูงสุด 10 หลัก โดยมีทศนิยม 2 ตำแหน่งเสมอ การกำหนดแบบนี้จะช่วยให้ข้อมูลเงินในแอปฯ ของคุณไม่หายไปแม้แต่สตางค์เดียว
โปรแกรมเมอร์ส่วนใหญ่จะใช้ DECIMAL กับระบบบัญชีหรือราคาขายเสมอ เพราะถ้าใช้ประเภทข้อมูลอื่นอาจเกิดปัญหาปัดเศษไม่ตรงกับความจริง ซึ่งเป็นเรื่องใหญ่มากในการทำระบบจัดการฐานข้อมูลให้ลูกค้า
-- เก็บราคาขายสินค้า
CREATE TABLE Sales (
Price DECIMAL(10, 2) -- เก็บตัวเลขรวม 10 หลัก มีทศนิยม 2 ตำแหน่ง
);
คำอธิบาย: คำสั่งนี้สร้างตารางสำหรับเก็บราคา โดยกำหนดให้คอลัมน์ Price เป็น DECIMAL ที่มีขนาด 10 หลักและมีทศนิยม 2 ตำแหน่ง เพื่อความแม่นยำในการคำนวณเงิน
ผลลัพธ์: จะได้คอลัมน์ Price ที่รองรับตัวเลขตั้งแต่ 0.00 ถึง 99,999,999.99
ข้อความและตัวอักษรด้วย NVARCHAR
ถ้าต้องการเก็บชื่อคน ที่อยู่ หรือคำบรรยาย เราจะใช้ NVARCHAR (ประเภทข้อมูลข้อความที่รองรับภาษาต่างประเทศ) ซึ่งตัว N ย่อมาจาก Unicode (มาตรฐานการเก็บตัวอักษรที่รองรับทั่วโลก) ทำให้มันเก็บตัวอักษรไทยได้โดยไม่เพี้ยนเป็นเครื่องหมายคำถาม
เรามักจะเห็น NVARCHAR(50) หรือ NVARCHAR(MAX) ในโค้ดบ่อยๆ ตัวเลขในวงเล็บคือจำนวนตัวอักษรสูงสุดที่ช่องนี้จะเก็บได้ ถ้าเราใส่ MAX ฐานข้อมูลจะพยายามยืดหยุ่นพื้นที่ให้ตามความยาวของข้อความที่เราใส่เข้าไปจริง
ข้อควรระวังคืออย่าใส่ MAX พร่ำเพรื่อครับ เพราะถ้าเราคุมความยาวไม่ได้ ระบบจะจัดการการอ่านข้อมูลได้ยากขึ้นและช้าลง การกำหนดความยาวให้พอดีกับข้อมูลที่คาดว่าจะใส่ เช่น ชื่อคนไม่เกิน 100 ตัวอักษร เป็นแนวปฏิบัติที่ดีของโปรแกรมเมอร์มืออาชีพ
-- เก็บชื่อลูกค้า
CREATE TABLE Customers (
FullName NVARCHAR(100), -- เก็บชื่อได้สูงสุด 100 ตัวอักษร
Bio NVARCHAR(MAX) -- เก็บคำอธิบายยาวๆ ได้ไม่จำกัด
);
คำอธิบาย: FullName ถูกจำกัดไว้ที่ 100 ตัวอักษรเพื่อคุมขนาดข้อมูล ส่วน Bio ใช้ MAX เพื่อรองรับข้อความยาวๆ ที่ไม่แน่นอน
ผลลัพธ์: ระบบจะสร้างคอลัมน์ FullName ที่ประหยัดพื้นที่ และ Bio ที่ยืดหยุ่นตามเนื้อหา
วันและเวลาด้วย DATETIME2
การเก็บเวลาในฐานข้อมูลเป็นเรื่องละเอียดอ่อน เราแนะนำให้ใช้ DATETIME2 (ประเภทข้อมูลวันและเวลาที่แม่นยำสูง) เพราะมันเก็บข้อมูลได้ละเอียดถึงเสี้ยววินาที และไม่มีปัญหากับการเทียบวันที่ในอนาคตหรืออดีตเหมือนประเภทข้อมูลรุ่นเก่า
เวลาคุณสร้างระบบ Log (บันทึกประวัติการใช้งาน) หรือระบบนัดหมาย DATETIME2 คือเพื่อนที่ดีที่สุด เพราะมันรองรับช่วงเวลาที่กว้างมาก ตั้งแต่ปีคริสต์ศักราช 0001 ไปจนถึงปี 9999 ทำให้ไม่ต้องกังวลเรื่องระบบจะพังเมื่อข้ามปี
มือใหม่บางคนชอบเก็บวันที่เป็นข้อความ (String) ซึ่งเป็นเรื่องที่ผิดมาก เพราะคุณจะไม่สามารถเอามาเรียงลำดับหรือคำนวณหาส่วนต่างของเวลาได้เลย จงใช้ DATETIME2 เสมอเมื่อต้องยุ่งเกี่ยวกับเวลา
-- เก็บเวลาที่สร้างข้อมูล
CREATE TABLE Logs (
CreatedAt DATETIME2 -- เก็บวันที่และเวลาอย่างละเอียด
);
คำอธิบาย: กำหนดคอลัมน์ CreatedAt เป็น DATETIME2 เพื่อให้ฐานข้อมูลบันทึกเวลาที่บันทึกข้อมูลนั้นลงไปโดยอัตโนมัติด้วยความแม่นยำสูง
ผลลัพธ์: จะได้คอลัมน์ที่เก็บค่าเวลาในรูปแบบปี-เดือน-วัน ชั่วโมง:นาที:วินาที.เสี้ยววินาที
สถานะจริงหรือเท็จด้วย BIT และรหัสไม่ซ้ำด้วย UNIQUEIDENTIFIER
สำหรับข้อมูลที่มีแค่สองค่า เช่น เปิดหรือปิด ใช่หรือไม่ เราใช้ BIT (ประเภทข้อมูลเก็บค่า 0 หรือ 1) ซึ่งกินพื้นที่น้อยมากแค่ 1 บิตเท่านั้น มันเหมาะที่สุดสำหรับสถานะที่เรียกว่า Boolean (ค่าตรรกศาสตร์ที่ตอบแค่จริงหรือเท็จ)
ส่วน UNIQUEIDENTIFIER (ประเภทข้อมูลเก็บรหัสสุ่มที่ไม่ซ้ำกัน) หรือที่เราเรียกกันว่า GUID (รหัสระบุตัวตนแบบสากล) คือตัวเลขยาวๆ ที่คอมพิวเตอร์สุ่มขึ้นมาเพื่อให้มั่นใจว่าข้อมูลชิ้นนี้จะไม่ซ้ำกับข้อมูลอื่นในโลกเลย มักใช้เป็นไอดีหลักของข้อมูลสำคัญ
ใช้ BIT เมื่อต้องการสวิตช์เปิดปิดข้อมูล และใช้ UNIQUEIDENTIFIER เมื่อต้องการสร้างรหัสที่ไม่ต้องกังวลว่าจะมีใครมาซ้ำกับเรา สองตัวนี้จะช่วยให้ระบบของคุณดูเป็นมืออาชีพและจัดการข้อมูลได้ง่ายขึ้นมาก
-- เก็บสถานะผู้ใช้และรหัสประจำตัว
CREATE TABLE Users (
UserID UNIQUEIDENTIFIER, -- รหัสไอดีที่ไม่ซ้ำใครในโลก
IsActive BIT -- เก็บค่า 1 (ใช้งานอยู่) หรือ 0 (ระงับใช้งาน)
);
คำอธิบาย: UserID ใช้ UNIQUEIDENTIFIER เพื่อให้รหัสไอดีมีความปลอดภัยและไม่ซ้ำกัน ส่วน IsActive ใช้ BIT เพื่อเก็บสถานะการใช้งาน
ผลลัพธ์: ระบบจะสร้างตารางที่รองรับการระบุตัวตนแบบปลอดภัยและสถานะการใช้งานที่กินพื้นที่น้อย
สรุป: การเลือกประเภทข้อมูลให้เหมาะกับงาน
หัวใจสำคัญของการเลือก Data Types คือการเข้าใจว่าเรากำลังจะเก็บข้อมูลอะไร และข้อมูลนั้นมีโอกาสเติบโตแค่ไหน การใช้ INT แทน BIGINT เมื่อไม่จำเป็น หรือใช้ DECIMAL ให้ถูกกับงานเงิน จะทำให้ฐานข้อมูลของคุณทำงานได้เร็วและมีประสิทธิภาพสูง
ลองนึกภาพว่าคุณกำลังสร้างระบบร้านค้าออนไลน์ คุณต้องใช้ INT สำหรับจำนวนสินค้าในสต็อก DECIMAL(10, 2) สำหรับราคาขาย NVARCHAR(100) สำหรับชื่อสินค้า BIT สำหรับสถานะสินค้าว่ายังขายอยู่ไหม และ DATETIME2 สำหรับวันที่เพิ่มสินค้าเข้าระบบ นี่คือตัวอย่างการนำไปใช้จริงที่โปรแกรมเมอร์ทุกคนต้องทำ
จำไว้ว่าการออกแบบฐานข้อมูลที่ดีคือจุดเริ่มต้นของซอฟต์แวร์ที่ไม่มีบั๊ก อย่ารีบเขียนโค้ดจนลืมวางแผนเรื่องประเภทข้อมูล เพราะการมาแก้ไขโครงสร้างฐานข้อมูลทีหลังเป็นงานที่เหนื่อยและเสี่ยงต่อการทำข้อมูลหายมากที่สุด ขอให้สนุกกับการฝึกฝนและออกแบบฐานข้อมูลอย่างมืออาชีพครับ