ในฐานะสถาปนิกระบบฐานข้อมูล การจัดการประเภทข้อมูล (Data Type) เป็นสิ่งสำคัญอย่างยิ่ง โดยเฉพาะอย่างยิ่งเมื่อต้องจัดการกับค่าตัวเลขทศนิยม (Floating-point numbers) ซึ่งความแม่นยำของข้อมูลเป็นหัวใจหลักของความน่าเชื่อถือของระบบ
บทความนี้จะเจาะลึกถึงความแตกต่างระหว่างประเภทข้อมูลที่ใช้เก็บค่าทศนิยมใน PostgreSQL ได้แก่ real และ double precision พร้อมทั้งให้คำแนะนำจากมุมมองของ System Architect ว่าควรเลือกใช้ประเภทข้อมูลใดเพื่อป้องกันปัญหาความคลาดเคลื่อนของข้อมูล (Precision Loss) ที่อาจส่งผลกระทบต่อการคำนวณทางธุรกิจที่สำคัญ
ความแตกต่างทางสถาปัตยกรรม: REAL vs DOUBLE PRECISION ใน PostgreSQL
ใน PostgreSQL ค่าตัวเลขทศนิยมจะถูกจัดการด้วยมาตรฐาน IEEE 754 ซึ่งมีประเภทข้อมูลหลักที่ใช้คือ real และ double precision แม้ว่าทั้งสองจะถูกออกแบบมาเพื่อเก็บค่าทศนิยม แต่ก็มีความแตกต่างกันในแง่ของขนาดหน่วยความจำ (Storage Size) และความแม่นยำ (Precision) ที่รองรับ:
real: ใช้พื้นที่จัดเก็บ 4 ไบต์ (Single-precision float) มีความแม่นยำประมาณ 6-7 หลักทศนิยม เหมาะสำหรับข้อมูลที่ไม่ต้องการความแม่นยำสูงมากนัก เช่น การคำนวณทางวิทยาศาสตร์เบื้องต้นที่ไม่เกี่ยวข้องกับเงินdouble precision: ใช้พื้นที่จัดเก็บ 8 ไบต์ (Double-precision float) มีความแม่นยำสูงกว่าrealมาก รองรับความแม่นยำประมาณ 15 หลักทศนิยม เหมาะสำหรับงานที่ต้องการความแม่นยำสูงกว่า แต่ยังไม่ถึงระดับที่ต้องใช้สำหรับบัญชีการเงิน
ข้อควรระวังทางสถาปัตยกรรม: แม้ว่า double precision จะมีความแม่นยำสูงกว่า real แต่ทั้งสองประเภทก็ยังเป็น Floating-point type ซึ่งหมายความว่ามันเก็บค่าในรูปแบบของการประมาณค่า (Approximation) ไม่ใช่ค่าที่แน่นอน 100% ทำให้เกิดปัญหาความคลาดเคลื่อนทางคณิตศาสตร์ (Floating-point error) ได้เสมอ
ทางออกที่ถูกต้อง: การใช้ NUMERIC/DECIMAL สำหรับข้อมูลทางการเงิน
ในฐานะ Senior Architect ที่ออกแบบระบบที่เกี่ยวข้องกับการเงิน การบัญชี หรือการคำนวณที่ต้องมีความแม่นยำสูงสุด (Exact Precision) การใช้ real หรือ double precision ถือเป็นความเสี่ยงทางสถาปัตยกรรมที่ยอมรับไม่ได้
ทางออกที่ถูกต้องและเป็นมาตรฐานอุตสาหกรรมคือการใช้ประเภทข้อมูล NUMERIC (หรือ DECIMAL) ซึ่งเป็นประเภทข้อมูลที่เก็บค่าตัวเลขตามจำนวนหลักที่ผู้ใช้กำหนดอย่างแม่นยำ (Exact Storage) ไม่มีการประมาณค่าใดๆ เกิดขึ้น การกำหนดความแม่นยำ (Precision) และจำนวนตำแหน่งทศนิยม (Scale) จะช่วยให้มั่นใจว่าข้อมูลจะถูกเก็บและคำนวณอย่างถูกต้องตามหลักการบัญชี
ตัวอย่างการใช้งานใน PostgreSQL
นี่คือตัวอย่างการสร้างตารางที่เปรียบเทียบทั้งสามประเภทข้อมูล:
SQL
-- การสร้างตารางเพื่อเปรียบเทียบความแม่นยำของข้อมูลทศนิยม<br>CREATE TABLE precision_test (<code><br> float_real REAL,<br> float_double DOUBLE PRECISION,<br> exact_numeric NUMERIC(10, 2)<br>);<br><br>-- การแทรกค่าเพื่อสังเกตความแตกต่าง<br>INSERT INTO precision_test (float_real, float_double, exact_numeric) VALUES<br>('123.45', '123.45', '123.45');<br><br>-- การคำนวณที่แสดงปัญหาความคลาดเคลื่อน (ตัวอย่างสมมติ)<br>SELECT ('0.1'::real + '0.2'::real), ('0.1'::double precision + '0.2'::double precision), '0.3'::numeric;<br>
บทสรุปและข้อแนะนำจากสถาปนิกระบบ
โดยสรุปแล้ว แม้ว่า PostgreSQL จะมีประเภทข้อมูล real และ double precision สำหรับค่าทศนิยม แต่ในมุมมองของความมั่นคงและความถูกต้องของข้อมูลทางธุรกิจ (Business Integrity) ผู้เชี่ยวชาญด้านระบบควรยึดหลักการที่ว่า: ถ้าข้อมูลนั้นเกี่ยวข้องกับเงินหรือการคำนวณที่ต้องแม่นยำถึงทศนิยมตำแหน่งสุดท้าย ให้ใช้ NUMERIC เสมอ
การเลือกใช้ประเภทข้อมูลที่เหมาะสมตั้งแต่ขั้นตอนการออกแบบ (Schema Design) คือการลดความเสี่ยงที่สำคัญที่สุดในการพัฒนาแอปพลิเคชันฐานข้อมูลขนาดใหญ่