PlusMagi's Blog By Pitt Phunsanit Database curl: ส่ง ฟอร์มแบบ get

curl: ส่ง ฟอร์มแบบ get

การจัดการ GET Parameters ใน PostgreSQL: เมื่อ cURL ส่งข้อมูลมา

ในโลกของการพัฒนาเว็บแอปพลิเคชัน การรับส่งข้อมูลระหว่าง Client และ Server เป็นหัวใจสำคัญ โดยเฉพาะอย่างยิ่งเมื่อเราใช้ HTTP Method GET ซึ่งข้อมูลจะถูกส่งผ่าน URL ในรูปแบบของ Query String (เช่น ?product=apple&color=red&price=100) แม้ว่า cURL จะเป็นเครื่องมือที่ใช้จำลองการส่งคำขอเหล่านี้ แต่ในมุมมองของ System Architect ที่ต้องออกแบบระบบฐานข้อมูลให้รองรับการประมวลผลข้อมูลที่เข้ามาอย่างมีโครงสร้าง PostgreSQL คือเครื่องมือหลักที่เราใช้ในการจัดการและวิเคราะห์ชุดข้อมูลเหล่านี้

ทำความเข้าใจ GET Parameters ในบริบทของ PostgreSQL

เมื่อระบบของเราต้องรับข้อมูลที่มาจาก Query String (GET parameters) ข้อมูลเหล่านั้นจะมาในรูปแบบข้อความ (String) ที่คั่นด้วยเครื่องหมาย & และประกอบด้วยคู่ Key-Value ที่คั่นด้วยเครื่องหมาย = หน้าที่ของ PostgreSQL คือการแยกส่วนประกอบเหล่านี้ออกจากกันให้กลายเป็นโครงสร้างข้อมูลที่มีระเบียบ ไม่ว่าจะเป็น JSONB หรือตารางเพื่อนำไปวิเคราะห์หรือจัดเก็บต่อ

เนื่องจาก Query String ไม่ได้มีรูปแบบที่ตายตัว การจะนำข้อมูลเหล่านี้ไปใช้ในตารางจึงต้องผ่านกระบวนการ Parsing ที่ซับซ้อน การทำความเข้าใจโครงสร้างของข้อมูลนี้จึงเป็นทักษะสำคัญสำหรับนักพัฒนาระบบฐานข้อมูล

เทคนิคการแยก Query String ด้วย PostgreSQL SQL

PostgreSQL ไม่มีฟังก์ชันสำเร็จรูปในการ Parse URL query string โดยตรงเหมือนภาษาโปรแกรม แต่เราสามารถใช้ความสามารถของฟังก์ชันจัดการข้อความ (String Manipulation) ร่วมกับ UNNEST และ regexp_split_to_table เพื่อจำลองกระบวนการนี้ได้อย่างมีประสิทธิภาพ

หลักการคือการแบ่งสตริง Query String ออกเป็นส่วนย่อยๆ ด้วย & ก่อน จากนั้นจึงแยกแต่ละส่วนย่อยออกเป็น Key และ Value ด้วย = เราจะใช้ตัวอย่าง Query String สมมติที่ได้จากการจำลองด้วย cURL:

SQL

-- สมมติว่าเราได้รับ Query String นี้มาเก็บในตัวแปรหรือคอลัมน์ชื่อ 'query_string'

นี่คือตัวอย่างการเขียน SQL เพื่อแยก Key-Value Pairs ออกมาเป็นแถวข้อมูลที่พร้อมใช้งาน:

SQL

WITH query_data AS (</code>
<code class="language-sql">    SELECT 'product=apple&color=red&price=100' AS query_string</code>
<code class="language-sql">)</code>
<code class="language-sql">SELECT</code>
<code class="language-sql">    (regexp_split_to_table(q.query_string, '&')) AS pair_string,</code>
<code class="language-sql">    split_part(pair_string, '=', 1) AS key,</code>
<code class="language-sql">    split_part(pair_string, '=', 2) AS value</code>
<code class="language-sql">FROM query_data q;

ผลลัพธ์ที่ได้:

  • pair_string: แสดงคู่ Key-Value ทั้งหมด (เช่น product=apple)
  • key: แยกเฉพาะชื่อพารามิเตอร์ (เช่น product)
  • value: แยกเฉพาะค่าของพารามิเตอร์ (เช่น apple)

การจัดเก็บข้อมูลที่ Parse แล้วใน JSONB

หากเราต้องการจัดเก็บข้อมูลที่ Parse แล้วทั้งหมดอย่างมีโครงสร้างและพร้อมสำหรับการเรียกใช้ในแอปพลิเคชัน เราควรใช้ประเภทข้อมูล JSONB การรวมผลลัพธ์จากขั้นตอนการ Parsing ข้างต้นเข้าสู่ JSONB จะช่วยให้เราสามารถ Query ข้อมูลที่ซับซ้อนได้อย่างรวดเร็วและมีประสิทธิภาพ

SQL

-- ตัวอย่างการรวม Key-Value Pairs เข้าเป็น JSONB Object</code>
<code class="language-sql">WITH query_data AS (</code>
<code class="language-sql">    SELECT 'product=apple&color=red&price=100' AS query_string</code>
<code class="language-sql">)</code>
<code class="language-sql">SELECT</code>
<code class="language-sql">    jsonb_object_agg(key, value) AS parsed_json</code>
<code class="language-sql">FROM (</code>
<code class="language-sql">    SELECT</code>
<code class="language-sql">        (regexp_split_to_table(q.query_string, '&')) AS pair_string,</code>
<code class="language-sql">        split_part(pair_string, '=', 1) AS key,</code>
<code class="language-sql">        split_part(pair_string, '=', 2) AS value</code>
<code class="language-sql">    FROM query_data q</code>
<code class="language-sql">) AS pairs;

บทสรุป

การรับส่งข้อมูลผ่าน GET Parameters จาก cURL เป็นเรื่องพื้นฐานของการสื่อสารเว็บ แต่การจัดการข้อมูลเหล่านี้ในระดับฐานข้อมูลด้วย PostgreSQL นั้นต้องอาศัยความเข้าใจในฟังก์ชันการจัดการข้อความ (String Manipulation) อย่างลึกซึ้ง การใช้ regexp_split_to_table ร่วมกับ split_part ทำให้เราสามารถแปลง Query String ที่เป็นข้อความดิบให้กลายเป็นโครงสร้างข้อมูลที่มีระเบียบอย่าง Key-Value Pairs และสามารถจัดเก็บในรูปแบบ JSONB ได้อย่างสมบูรณ์ ทำให้ระบบของเรามีความแข็งแกร่งและพร้อมสำหรับการประมวลผลข้อมูลที่มาจากแหล่งภายนอกได้อย่างมีประสิทธิภาพสูงสุด