PlusMagi's Blog By Pitt Phunsanit Backend,Database DataTables: แสดงเลขที่รายการ

DataTables: แสดงเลขที่รายการ

เมื่อเราต้องแสดงชุดข้อมูลขนาดใหญ่บนเว็บแอปพลิเคชัน โดยเฉพาะข้อมูลที่มาจากการ 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 ของเราสะอาดและรวดเร็วที่สุด โดยยังคงรักษาความสมบูรณ์ของข้อมูลที่ถูกดึงมาแสดงผลบนหน้าจอได้อย่างสมบูรณ์

Exit mobile version