เมื่อเราต้องแสดงชุดข้อมูลขนาดใหญ่บนเว็บแอปพลิเคชัน โดยเฉพาะข้อมูลที่มาจากการ Join ตารางหลายตาราง หรือข้อมูลที่ไม่มี Primary Key (PK) ที่ชัดเจน การอ้างอิงถึงลำดับของรายการ (Row Number) จะกลายเป็นความท้าทายที่สำคัญ
ในทางเทคนิค การสร้างเลขที่รายการนี้สามารถทำได้หลายวิธี แต่หากเราใช้ฟังก์ชันที่เกี่ยวข้องกับการนับแถวในระดับฐานข้อมูล (เช่น `ROWNUM` ใน Oracle หรือการใช้ `row_number()` ใน PostgreSQL) โดยตรงเพื่อดึงข้อมูลมาแสดงผล จะส่งผลให้เกิดภาระ (Overhead) อย่างมากต่อประสิทธิภาพของฐานข้อมูล โดยเฉพาะเมื่อชุดข้อมูลมีขนาดใหญ่มาก
ในฐานะ System Architect เราจึงแนะนำให้ย้ายภาระการสร้างลำดับแถวนี้ไปจัดการที่ฝั่งไคลเอนต์ (Client-side) โดยใช้ความสามารถของไลบรารีอย่าง DataTables อย่างไรก็ตาม หากจำเป็นต้องสร้างลำดับแถวในระดับ SQL เพื่อให้ DataTables สามารถดึงข้อมูลที่สมบูรณ์ที่สุด เราสามารถใช้ฟังก์ชัน Window Function ของ PostgreSQL ได้
การใช้ PostgreSQL Window Function: ROW_NUMBER()
PostgreSQL มีฟังก์ชัน Window Function ที่ทรงพลังอย่าง ROW_NUMBER() ซึ่งช่วยให้เราสามารถกำหนดลำดับให้กับแถวข้อมูลได้ โดยไม่จำเป็นต้องเพิ่มภาระให้กับตารางหลักมากเกินไป หลักการคือการกำหนดลำดับตามคอลัมน์ใดคอลัมน์หนึ่ง (เช่น ID หรือวันที่) เพื่อให้ได้ลำดับที่เสถียรและถูกต้อง
นี่คือตัวอย่างการใช้งานใน PostgreSQL โดยสมมติว่าเรามีตารางชื่อ products:
SQL
WITH ranked_products AS (\n SELECT\n p.product_id, -- Primary Key ที่ใช้ในการอ้างอิง\n p.product_name, -- ชื่อสินค้า\n p.price, -- ราคา\n -- ใช้ ROW_NUMBER() เพื่อสร้างลำดับแถวที่เสถียร\n ROW_NUMBER() OVER (ORDER BY p.product_id ASC) AS row_number\n FROM\n products p\n) \nSELECT\n row_number, -- คอลัมน์ลำดับที่ถูกสร้างขึ้น\n product_id, \n product_name, \n price\nFROM\n ranked_products\nORDER BY\n row_number;
คำอธิบายโค้ด:
ROW_NUMBER() OVER (ORDER BY p.product_id ASC): นี่คือหัวใจของการทำงาน เป็นการกำหนดหมายเลขลำดับที่เพิ่มขึ้นทีละ 1 สำหรับทุกแถว โดยการเรียงลำดับจะอ้างอิงจากproduct_id- ข้อควรระวัง: การใช้
ROW_NUMBER()ใน SQL จะเพิ่มภาระการประมวลผล (Computational Load) ให้กับฐานข้อมูล ดังนั้น หากเป็นไปได้ ควรให้ DataTables จัดการการแสดงลำดับแถวที่ฝั่ง JavaScript จะมีประสิทธิภาพกว่ามาก
สรุปและแนวทางปฏิบัติที่ดีที่สุด (Best Practice)
ในฐานะ Senior Architect เราขอเน้นย้ำว่า แม้ว่าการใช้ ROW_NUMBER() ใน PostgreSQL จะเป็นวิธีที่ถูกต้องทางเทคนิคในการดึงลำดับแถวจากฐานข้อมูล แต่ในทางปฏิบัติของการพัฒนาเว็บแอปพลิเคชันที่ใช้ DataTables เพื่อแสดงข้อมูลจำนวนมาก (Pagination) **แนวทางปฏิบัติที่ดีที่สุดคือการปล่อยให้ DataTables จัดการการแสดงเลขที่รายการ (Index) ในฝั่ง Client-side**
การทำเช่นนี้จะช่วยลดภาระของฐานข้อมูลได้อย่างมหาศาล ทำให้ Query ของเราสะอาดและรวดเร็วที่สุด โดยยังคงรักษาความสมบูรณ์ของข้อมูลที่ถูกดึงมาแสดงผลบนหน้าจอได้อย่างสมบูรณ์