SQL สมัยใหม่เพิ่มการรองรับ JSON เพื่อเชื่อมช่องว่างระหว่าง Object-Relational

ทีมชุมชน BigGo
SQL สมัยใหม่เพิ่มการรองรับ JSON เพื่อเชื่อมช่องว่างระหว่าง Object-Relational

ความท้าทายที่มีมายาวนานในการแปลงตารางฐานข้อมูลแบบเรียบเป็นโครงสร้างแบบลำดับชั้นสำหรับส่วนติดต่อผู้ใช้ได้จุดประกายการพิจารณาใหม่ในชุมชนนักพัฒนา ปัญหานี้เรียกว่า object-relational mismatch เกิดขึ้นเมื่อแอปพลิเคชันต้องแสดงความสัมพันธ์ที่ซับซ้อนในลำดับชั้นภาพที่แตกต่างกันขึ้นอยู่กับงานที่ต้องทำ

ข้อจำกัดของ SQL แบบดั้งเดิมสร้างปัญหาให้กับการพัฒนา

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

ชุมชนได้รับรู้จุดเจ็บปวดนี้มานาน การเชื่อมต่อเครือข่ายหลายครั้งกลายเป็นสิ่งจำเป็น และเครื่องมือ Object-Relational Mapping (ORM) ได้ถือกำเนิดขึ้นเป็นทางแก้ไข อย่างไรก็ตาม เครื่องมือเหล่านี้มักสร้างปัญหาของตัวเอง รวมถึงการโหลดข้อมูลที่ไม่สม่ำเสมอและปัญหาการผูกมัดกับภาษาเฉพาะ

แนวทางแบบดั้งเดิมเทียบกับ SQL สมัยใหม่

ด้าน SQL แบบดั้งเดิม SQL สมัยใหม่พร้อม JSON
การเดินทางข้อมูลผ่านเครือข่าย ต้องใช้หลายคำสั่งค้นหา สามารถใช้คำสั่งเดียวได้
การประกอบข้อมูล ต้อง join ด้วยตนเองในโค้ดแอปพลิเคชัน ฐานข้อมูลจัดการโครงสร้างให้
ประสิทธิภาพ มีความหน่วงสูงจากการเรียกหลายครั้ง ลดภาระการส่งข้อมูลผ่านเครือข่าย
ความสอดคล้อง มีความเสี่ยงของข้อมูลจากธุรกรรมที่แตกต่างกัน รับประกันธุรกรรมเดียว

ฟีเจอร์ JSON เปลี่ยนความสามารถของฐานข้อมูล

ฐานข้อมูล SQL สมัยใหม่ปัจจุบันรวมฟังก์ชันการรวม JSON ที่สามารถสร้างผลลัพธ์แบบลำดับชั้นในคิวรีเดียว ฟังก์ชัน jsonb_agg() ของ PostgreSQL และฟังก์ชันที่คล้ายกันในฐานข้อมูลอื่นๆ ช่วยให้นักพัฒนาสามารถสร้างโครงสร้างซ้อนที่ซับซ้อนโดยตรงจากข้อมูลเชิงสัมพันธ์ สิ่งนี้ช่วยขจัดความจำเป็นในการทำคิวรีหลายครั้งและลดการสับเปลี่ยนข้อมูลระหว่างชั้นฐานข้อมูลและแอปพลิเคชัน

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

การรองรับ JSON ในระบบฐานข้อมูลต่างๆ

PostgreSQL: jsonb_agg(), json_build_object(), LATERAL joins • SQLite: ตัวดำเนินการลูกศร JSON (->>, ->) พร้อมนิพจน์ที่จัดทำดัชนี
MariaDB: ฟังก์ชัน JSON_EXTRACT(), JSON_UNQUOTE()กรณีการใช้งานทั่วไป: ข้อมูลแบบลำดับชั้น การตอบสนอง API สคีมาที่ยืดหยุ่น

ชุมชนผลักดันให้มีการพัฒนา SQL ที่ดีขึ้น

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

เมื่อสิ่งใดใน SQL กลายเป็นเรื่องยุ่งยากหรือทำงานได้ยาก ผู้คนมักจะมีแนวโน้มสร้างทางแก้ไขใหม่ทั้งหมดแทนที่จะปรับปรุงสิ่งที่มีอยู่ นักพัฒนาเพียงไม่กี่คนที่ดูเหมือนจะสนใจในการปรับปรุง SQL เอง

การเปลี่ยนแปลงนี้แสดงถึงการเปลี่ยนแปลงพื้นฐานในวิธีที่นักพัฒนาคิดเกี่ยวกับความรับผิดชอบของฐานข้อมูล แทนที่จะปฏิบัติต่อฐานข้อมูลเป็นเพียงชั้นการจัดเก็บ แอปพลิเคชันสมัยใหม่ใช้ประโยชน์จากความสามารถของฐานข้อมูลสำหรับการแปลงข้อมูลและการสร้างโครงสร้าง

ประโยชน์ในทางปฏิบัติขับเคลื่อนการนำมาใช้

การปรับปรุงประสิทธิภาพมีความสำคัญอย่างมาก ทางแก้ไขแบบคิวรีเดียวลดค่าใช้จ่ายเครือข่ายและขจัดความจำเป็นในการถ่ายโอนคีย์การเชื่อมที่ไม่จำเป็นระหว่างฐานข้อมูลและแอปพลิเคชัน ฟีเจอร์ SQL สมัยใหม่เช่น LATERAL joins และ correlated subqueries ให้เครื่องมือที่ทรงพลังสำหรับการหลีกเลี่ยงข้อผิดพลาดทั่วไปเช่นการนับซ้ำในการรวมข้อมูล

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

อ้างอิง: SQL needed structure