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