Skip to main content

เนื้อหาภาษาไทย / Thai content

System guide Content reviewed

การเลือก Data Types ที่เหมาะสมกับข้อมูล

บทความนี้กล่าวถึงความสำคัญของการเลือก Data Types ที่เหมาะสมหลังจากการทำ Normalization เพื่อให้ฐานข้อมูลมีประสิทธิภาพ, ประหยัดพื้นที่ และลดข้อผิดพลาด โดยอธิบาย D...

การเลือก Data Types ที่เหมาะสมกับข้อมูล

หลังจากที่เราได้ทำการ Normalization เพื่อจัดระเบียบข้อมูลในฐานข้อมูลของเราแล้ว ขั้นตอนต่อไปที่สำคัญไม่แพ้กันคือการเลือก Data Types ที่เหมาะสมกับประเภทข้อมูลที่เราจะจัดเก็บ การเลือก Data Types ที่ถูกต้องจะช่วยให้ฐานข้อมูลของเรามีประสิทธิภาพ, ประหยัดพื้นที่, และลดโอกาสที่จะเกิดข้อผิดพลาด

ในบทนี้ เราจะมาเรียนรู้เกี่ยวกับ Data Types พื้นฐานที่ใช้กันทั่วไปใน MySQL (ซึ่งแนวคิดส่วนใหญ่สามารถนำไปปรับใช้กับระบบจัดการฐานข้อมูลอื่นๆ ได้เช่นกัน), วิธีการเลือก Data Types ให้เหมาะสมกับประเภทข้อมูล, และข้อควรพิจารณาต่างๆ ในการตัดสินใจเลือก Data Types ที่ดีที่สุดสำหรับฐานข้อมูลของคุณ

Data Types พื้นฐานใน MySQL

MySQL มี Data Types ให้เลือกใช้งานมากมาย แต่ในระดับเริ่มต้น เราจะเน้นไปที่ Data Types พื้นฐานที่ใช้กันบ่อยๆ ดังนี้:

  • Numeric Types: ใช้สำหรับเก็บข้อมูลที่เป็นตัวเลข
    • INT: เก็บเลขจำนวนเต็ม (Integer) ขนาดปกติ (4 bytes) เหมาะสำหรับเก็บ ID, จำนวนสินค้า, หรือข้อมูลอื่นๆ ที่เป็นจำนวนเต็ม
    • TINYINT: เก็บเลขจำนวนเต็มขนาดเล็ก (1 byte) เหมาะสำหรับเก็บค่าสถานะ (เช่น เปิด/ปิด, ใช่/ไม่ใช่)
    • SMALLINT: เก็บเลขจำนวนเต็มขนาดเล็กกว่า INT (2 bytes)
    • BIGINT: เก็บเลขจำนวนเต็มขนาดใหญ่ (8 bytes) เหมาะสำหรับเก็บข้อมูลที่มีค่าสูงมากๆ เช่น จำนวนวิวของวิดีโอ
    • FLOAT: เก็บเลขทศนิยม (Floating-point number) ความแม่นยำปานกลาง (4 bytes)
    • DOUBLE: เก็บเลขทศนิยมความแม่นยำสูง (8 bytes)
    • DECIMAL: เก็บเลขทศนิยมที่ต้องการความแม่นยำสูง (ขนาดเปลี่ยนแปลงได้) เหมาะสำหรับเก็บข้อมูลทางการเงิน
  • String Types: ใช้สำหรับเก็บข้อมูลที่เป็นข้อความ
    • VARCHAR(size): เก็บข้อความที่มีความยาวไม่แน่นอน (Variable-length string) โดย `size` คือจำนวนตัวอักษรสูงสุดที่สามารถเก็บได้ (สูงสุด 65,535) เหมาะสำหรับเก็บชื่อ, ที่อยู่, หรือข้อมูลอื่นๆ ที่เป็นข้อความและมีความยาวไม่แน่นอน
    • CHAR(size): เก็บข้อความที่มีความยาวคงที่ (Fixed-length string) โดย `size` คือจำนวนตัวอักษรที่ต้องเก็บ (สูงสุด 255) เหมาะสำหรับเก็บรหัสไปรษณีย์ หรือข้อมูลอื่นๆ ที่เป็นข้อความและมีความยาวคงที่
    • TEXT: เก็บข้อความขนาดยาว เหมาะสำหรับเก็บเนื้อหาบทความ หรือรายละเอียดอื่นๆ ที่มีความยาวมาก
    • MEDIUMTEXT: เก็บข้อความขนาดยาวปานกลาง
    • LONGTEXT: เก็บข้อความขนาดยาวมาก
  • Date and Time Types: ใช้สำหรับเก็บข้อมูลที่เป็นวันที่และเวลา
    • DATE: เก็บวันที่ (ปี, เดือน, วัน)
    • TIME: เก็บเวลา (ชั่วโมง, นาที, วินาที)
    • DATETIME: เก็บทั้งวันที่และเวลา
    • TIMESTAMP: เก็บวันที่และเวลา โดยจะถูกแปลงเป็น UTC (Coordinated Universal Time) เหมาะสำหรับการบันทึกเวลาที่เกิดเหตุการณ์ต่างๆ
  • Boolean Type: (ไม่มีใน MySQL โดยตรง) ใช้สำหรับเก็บค่าที่เป็นจริงหรือเท็จ
    • TINYINT(1): โดยทั่วไปใช้ TINYINT(1) เพื่อแทนค่า Boolean (0 คือ False, 1 คือ True)

การเลือก Data Types ให้เหมาะสมกับประเภทข้อมูล

หลักการสำคัญในการเลือก Data Types คือการเลือก Data Type ที่เหมาะสมกับประเภทข้อมูลที่เราต้องการจัดเก็บ และมีขนาดเล็กที่สุดเท่าที่จะเป็นไปได้ เพื่อประหยัดพื้นที่จัดเก็บและเพิ่มประสิทธิภาพในการสืบค้นข้อมูล

ต่อไปนี้เป็นแนวทางการเลือก Data Types สำหรับข้อมูลประเภทต่างๆ:

  • ID (รหัสประจำตัว): ควรใช้ INT หรือ BIGINT (ถ้ามีโอกาสที่ ID จะมีค่าสูงมากๆ)
  • ชื่อ: ควรใช้ VARCHAR(size) โดยกำหนด `size` ให้เหมาะสมกับความยาวของชื่อที่คาดว่าจะเกิดขึ้น
  • ที่อยู่: ควรใช้ VARCHAR(size) หรือ TEXT ถ้าที่อยู่มีความยาวมาก
  • เบอร์โทรศัพท์: ควรใช้ VARCHAR(size) เพราะเบอร์โทรศัพท์อาจมีเครื่องหมายพิเศษ เช่น ขีดคั่น (-) หรือวงเล็บ ()
  • อีเมล: ควรใช้ VARCHAR(size)
  • ราคาสินค้า: ควรใช้ DECIMAL(precision, scale) โดย `precision` คือจำนวนหลักทั้งหมด และ `scale` คือจำนวนหลักหลังจุดทศนิยม เช่น DECIMAL(10, 2) หมายถึง ราคาสินค้าที่มีความยาวสูงสุด 10 หลัก และมีทศนิยม 2 ตำแหน่ง
  • วันที่เกิด: ควรใช้ DATE
  • เวลาที่ทำการสั่งซื้อ: ควรใช้ DATETIME หรือ TIMESTAMP
  • สถานะ (เช่น เปิด/ปิด, ใช่/ไม่ใช่): ควรใช้ TINYINT(1)

ตัวอย่าง:

CREATE TABLE products (
  product_id INT PRIMARY KEY AUTO_INCREMENT,
  product_name VARCHAR(255) NOT NULL,
  product_description TEXT,
  price DECIMAL(10, 2) NOT NULL,
  stock_quantity INT NOT NULL,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

ในตัวอย่างนี้ เราได้เลือก Data Types ดังนี้:

  • product_id: INT (สำหรับรหัสสินค้า)
  • product_name: VARCHAR(255) (สำหรับชื่อสินค้า)
  • product_description: TEXT (สำหรับรายละเอียดสินค้า)
  • price: DECIMAL(10, 2) (สำหรับราคาสินค้า)
  • stock_quantity: INT (สำหรับจำนวนสินค้าคงเหลือ)
  • created_at: DATETIME (สำหรับวันที่และเวลาที่สร้างสินค้า)

ข้อควรพิจารณาในการเลือก Data Types

นอกเหนือจากหลักการพื้นฐานที่กล่าวมาแล้ว ยังมีข้อควรพิจารณาอื่นๆ ที่ควรนำมาประกอบการตัดสินใจในการเลือก Data Types:

  • ขนาดของ Data Types: Data Types ที่มีขนาดใหญ่กว่าจะใช้พื้นที่จัดเก็บมากกว่า และอาจส่งผลต่อประสิทธิภาพในการสืบค้นข้อมูล ดังนั้นควรเลือก Data Type ที่มีขนาดเล็กที่สุดเท่าที่จะเป็นไปได้ โดยที่ยังสามารถเก็บข้อมูลได้อย่างถูกต้อง
  • ข้อจำกัดของ Data Types: Data Types บางประเภทมีข้อจำกัดในการเก็บข้อมูล เช่น INT สามารถเก็บเลขจำนวนเต็มได้ในช่วงที่กำหนดเท่านั้น หากข้อมูลมีค่าเกินช่วงที่กำหนด จะเกิดข้อผิดพลาด ดังนั้นควรตรวจสอบข้อจำกัดของ Data Types แต่ละประเภทก่อนเลือกใช้งาน
  • ความเข้ากันได้ของ Data Types: ในบางครั้ง เราอาจต้องทำการแปลง Data Types เพื่อให้ข้อมูลสามารถนำไปใช้งานร่วมกับ Data Types อื่นได้ ดังนั้นควรเลือก Data Types ที่มีความเข้ากันได้ดีกับ Data Types อื่นๆ ที่เราใช้งาน
  • Performance Considerations: การเลือก Data Type สามารถส่งผลต่อประสิทธิภาพของ query ได้ ตัวอย่างเช่น การใช้ INT สำหรับ ID มักจะเร็วกว่า VARCHAR ในการ JOIN tables
  • Indexing: Data Type ที่เลือกอาจส่งผลต่อประสิทธิภาพของการ indexing พิจารณา Data Type ที่ index ได้ง่ายและมีประสิทธิภาพ
  • Trade-offs: การเลือก Data Type ที่เหมาะสมอาจต้องมีการ trade-off ระหว่างขนาด, ความแม่นยำ, และประสิทธิภาพ ตัวอย่างเช่น การใช้ FLOAT อาจประหยัดพื้นที่กว่า DECIMAL แต่ความแม่นยำอาจน้อยกว่า
  • ความต้องการในอนาคต: พิจารณาถึงความเป็นไปได้ที่ความต้องการของข้อมูลจะเปลี่ยนแปลงไปในอนาคต ตัวอย่างเช่น หากคาดว่าจำนวนผู้ใช้งานจะเพิ่มขึ้นอย่างมากในอนาคต อาจต้องเลือกใช้ BIGINT แทน INT สำหรับ ID ผู้ใช้งาน

ตัวอย่างเพิ่มเติมเกี่ยวกับ Trade-offs:

สมมติว่าเรากำลังออกแบบฐานข้อมูลสำหรับระบบ e-commerce และต้องการเก็บข้อมูลเกี่ยวกับน้ำหนักของสินค้า

  • FLOAT: อาจเป็นทางเลือกที่ดูเหมือนจะเหมาะสม เพราะน้ำหนักมักจะเป็นเลขทศนิยม แต่ FLOAT มีความแม่นยำจำกัด และอาจทำให้เกิดข้อผิดพลาดในการคำนวณค่าขนส่ง
  • DECIMAL: เป็นทางเลือกที่ดีกว่า เพราะสามารถเก็บเลขทศนิยมที่มีความแม่นยำสูงได้ แต่จะใช้พื้นที่จัดเก็บมากกว่า FLOAT
  • INT (เก็บเป็นหน่วยย่อย): อีกทางเลือกหนึ่งคือการเก็บน้ำหนักเป็นหน่วยย่อย (เช่น กรัม) แทนที่จะเก็บเป็นกิโลกรัม ซึ่งจะทำให้เราสามารถใช้ INT แทน FLOAT หรือ DECIMAL ได้ แต่ต้องระวังเรื่องการแปลงหน่วยเมื่อนำข้อมูลไปใช้งาน

การตัดสินใจเลือก Data Type ที่ดีที่สุด ขึ้นอยู่กับความต้องการและข้อจำกัดของแต่ละโปรเจกต์ สิ่งสำคัญคือต้องทำความเข้าใจเกี่ยวกับ Data Types ต่างๆ และพิจารณาถึงข้อดีข้อเสียของแต่ละ Data Type อย่างรอบคอบ

ในบทถัดไป เราจะมาดูตัวอย่างกรณีศึกษาการออกแบบฐานข้อมูลสำหรับระบบห้องสมุด ซึ่งจะช่วยให้คุณเห็นภาพรวมของการออกแบบฐานข้อมูลตั้งแต่เริ่มต้นจนถึงขั้นตอนการเลือก Data Types

Office.in.th Custom Service

Want to build or adapt a system from this structure?

Office.in.th designs and develops enterprise web applications, API integrations, and public- and private-sector management systems, with long-term support.

See our software development service