Virtual Generated Columns ของ PostgreSQL 18 จุดประกายการถ่เถียงเรื่องการวางตำแหน่งตรรกะของฐานข้อมูล

ทีมชุมชน BigGo
Virtual Generated Columns ของ PostgreSQL 18 จุดประกายการถ่เถียงเรื่องการวางตำแหน่งตรรกะของฐานข้อมูล

PostgreSQL 18 นำเสนอ virtual generated columns ซึ่งเป็นฟีเจอร์ที่คำนวณค่าตามต้องการโดยไม่ต้องจัดเก็บไว้ในดิสก์ แม้ว่าความสามารถนี้จะสร้างความตื่นเต้นในการทำให้ชุดฟีเจอร์ของ PostgreSQL สมบูรณ์เมื่อเทียบกับคู่แข่งอย่าง MySQL แต่ก็ได้จุดประกายการอภิปรายที่มีความหมายในชุมชนนักพัฒนาเกี่ยวกับตำแหน่งที่ตรรกะของฐานข้อมูลควรอยู่และข้อจำกัดที่ยังคงเหลืออยู่

ชุมชนตั้งคำถามกับทางเลือกที่มีอยู่

นักพัฒนาบางคนกำลังตั้งคำถามว่า virtual generated columns มีข้อได้เปรียบที่สำคัญเหนือฟีเจอร์ที่มีอยู่แล้วใน PostgreSQL หรือไม่ ฐานข้อมูลนี้รองรับ function-based virtual columns ผ่าน syntactic sugar มาเป็นเวลานานแล้ว โดยนักพัฒนาสามารถสร้างฟังก์ชันที่รับ record type ของตารางเป็น input และส่งคืนค่าที่คำนวณแล้ว อย่างไรก็ตาม วิธีการนี้ต้องการให้ไคลเอนต์รู้เกี่ยวกับฟังก์ชันเหล่านี้และไม่รวมค่าที่คำนวณแล้วในการดำเนินการมาตรฐานอย่างคิวรี SELECT * virtual generated columns ใหม่นี้ผสานรวมเข้ากับ table schema ได้อย่างราบรื่นมากขึ้น ทำให้มองเห็นได้ในการโต้ตอบกับฐานข้อมูลทั้งหมดโดยไม่ต้องการความรู้พิเศษจากนักพัฒนาแอปพลิเคชัน

การเปรียบเทียบ Virtual Generated Columns กับ Stored Generated Columns

คุณสมบัติ Virtual Generated Columns Stored Generated Columns
การจัดเก็บข้อมูล ไม่ต้องใช้พื้นที่จัดเก็บบนดิสก์ เก็บถาวรบนดิสก์
ประสิทธิภาพ คำนวณในแต่ละครั้งที่มีการสืบค้น อ่านข้อมูลเร็ว แต่เขียนข้อมูลช้ากว่า
การสร้างดัชนี ไม่รองรับ สามารถสร้างดัชนีได้เหมือนคอลัมน์ปกติ
การเปลี่ยนแปลงโครงสร้าง เพิ่มได้ทันที อาจต้องเขียนตารางใหม่ทั้งหมด
กรณีการใช้งานที่เหมาะสม นิพจน์ที่เบา คุณสมบัติทดลอง การคำนวณที่ซับซ้อน ข้อมูลที่มีการสืบค้นบ่อย

ข้อจำกัดเน้นย้ำความสามารถที่ขาดหายไปของ PostgreSQL

การนำเสนอ virtual generated columns ได้ให้ความสนใจกับข้อจำกัดที่สำคัญบางประการในสถาปัตยกรรมปัจจุบันของ PostgreSQL generated columns สามารถอ้างอิงข้อมูลภายในแถวปัจจุบันเท่านั้น ป้องกันการคำนวณที่ซับซ้อนกว่าที่อาจเกี่ยวข้องกับแถวหรือตารางอื่น ข้อจำกัดนี้ได้ทำให้เกิดการเรียกร้องใหม่สำหรับ automatic incremental view maintenance ซึ่งเป็นฟีเจอร์ที่จะช่วยให้ฐานข้อมูลสามารถรักษาผลลัพธ์ที่คำนวณแล้วข้ามหลายตารางได้อย่างมีประสิทธิภาพ

Stored generated columns จะมีประโยชน์มากกว่านี้หากสามารถอ้างอิงแถวและตารางอื่นได้ แต่ตอนนี้จำกัดเฉพาะแถวปัจจุบันเท่านั้น

ข้อจำกัดนี้หมายความว่าแม้ว่า virtual generated columns จะทำงานได้ดีสำหรับการแปลงง่าย ๆ เช่น การแปลงตัวพิมพ์หรือการแยกฟิลด์ JSON แต่ก็ไม่สามารถจัดการตรรกะทางธุรกิจที่ซับซ้อนกว่าที่ต้องการการคำนวณข้ามแถวหรือข้ามตารางได้

ข้อจำกัดของ Generated Column

  • สามารถอ้างอิงได้เฉพาะคอลัมน์ภายในแถวปัจจุบันเท่านั้น
  • ไม่สามารถอ้างอิงตารางหรือแถวอื่น ๆ ได้
  • ไม่สามารถใช้ subquery หรือ aggregate function ได้
  • จำกัดเฉพาะ expression แบบ deterministic เท่านั้น
  • ต้องพิจารณาด้านความปลอดภัยเมื่อใช้ custom function และ user-defined type

การวางตำแหน่งตรรกะแอปพลิเคชันยังคงเป็นที่ถกเถียง

ฟีเจอร์นี้ได้จุดประกายการถกเถียงคลาสสิกเกี่ยวกับตำแหน่งที่ตรรกะการคำนวณควรอยู่ในแอปพลิเคชันสมัยใหม่ นักพัฒนาบางคนโต้แย้งว่าการดำเนินการง่าย ๆ เช่น การจัดการสตริงควรอยู่ในโค้ดแอปพลิเคชันแทนที่จะถูกผลักลงไปยังชั้นฐานข้อมูล พวกเขามอง virtual generated columns เป็นความซับซ้อนที่ไม่จำเป็นสำหรับการดำเนินการที่ตรงไปตรงมาในการใช้งานในภาษาโปรแกรมมิ่งส่วนใหญ่ ในขณะที่คนอื่น ๆ โต้แย้งว่าการรวมศูนย์ตรรกะนี้ในฐานข้อมูลช่วยให้เกิดความสอดคล้องกันในทุกแอปพลิเคชันและลดความเป็นไปได้ของความแตกต่างในการใช้งานระหว่างไคลเอนต์ต่าง ๆ ที่เข้าถึงข้อมูลเดียวกัน

การแลกเปลี่ยนประสิทธิภาพกำหนดรูปแบบการใช้งาน

virtual generated columns นำเสนอการแลกเปลี่ยนประสิทธิภาพที่ชัดเจนเมื่อเทียบกับ stored counterparts ในขณะที่ stored generated columns เพิ่ม overhead ระหว่างการดำเนินการเขียนแต่ช่วยให้อ่านได้เร็วด้วยการรองรับการจัดทำดัชนี virtual columns ช่วยให้การเขียนเบาลงแต่ต้องแลกกับการคำนวณค่าในทุกคิวรี สิ่งนี้ทำให้ virtual columns น่าสนใจเป็นพิเศษสำหรับฟีเจอร์ทดลองหรือฟิลด์ที่คำนวณแล้วที่เข้าถึงไม่บ่อย ซึ่ง storage overhead ของค่าที่ materialized แล้วจะเป็นการสิ้นเปลือง

ความสามารถในการแก้ไข schema แบบทันทีของ virtual columns ยังแก้ไขข้อกังวลเชิงปฏิบัติสำหรับฐานข้อมูลที่ใช้งานจริง การเพิ่ม virtual columns ไม่ต้องการการเขียนตารางใหม่หรือการดำเนินการ backfilling ทำให้ปลอดภัยกว่าสำหรับการทดสอบฟีเจอร์ใหม่โดยไม่เสี่ยงต่อการล็อกฐานข้อมูลหรือช่วงการบำรุงรักษาที่ยาวนาน

virtual generated columns แสดงถึงวิวัฒนาการอย่างต่อเนื่องของ PostgreSQL สู่ความสมบูรณ์ของฟีเจอร์กับระบบฐานข้อมูลหลักอื่น ๆ แม้ว่าอาจไม่ได้ปฏิวัติการออกแบบฐานข้อมูล แต่ก็ให้ความยืดหยุ่นแก่นักพัฒนามากขึ้นในการจัดระเบียบตรรกะข้อมูลและลด storage overhead ที่เกี่ยวข้องกับค่าที่คำนวณแล้วที่ไม่ต้องการการจัดทำดัชนีหรือการเข้าถึงบ่อย ๆ

อ้างอิง: My favorite PostgreSQL 18 Feature: Virtual Generated Columns