0Pricing
SQL Academy · บทเรียน

JSONB เทียบกับ JSON: ควรใช้แบบใด

เลือกระหว่าง JSON (ข้อความ รักษาช่องว่าง) กับ JSONB (ไบนารี สร้างดัชนีได้ และกำจัดคีย์ซ้ำ) เพื่อจัดเก็บข้อมูลอย่างเหมาะสม

JSONB เทียบกับ JSON: ควรใช้แบบใด เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

ชนิดข้อมูลเจสันสองแบบใน PostgreSQL

  • JSON — จัดเก็บข้อความที่คุณใส่เข้ามาแบบตรงตามต้นฉบับ
  • JSONB — รูปแบบไบนารีที่แยกโครงสร้างแล้ว ขจัดคีย์ซ้ำ และสร้างดัชนีได้

เจสัน: การจัดเก็บข้อความ

JSON จะรักษาช่องว่าง ลำดับคีย์ และคีย์ที่ซ้ำกันไว้ โดยต้องแยกวิเคราะห์ใหม่ทุกครั้งที่อ่าน ไม่รองรับดัชนี GIN และแทบไม่ใช่ตัวเลือกที่เหมาะสมสำหรับโค้ดใหม่

INSERT INTO docs (data) VALUES ('{"a": 1, "a": 2}'::JSON);
SELECT data->'a' FROM docs;     -- whatever the parser picks

JSONB: ไบนารีและสร้างดัชนีได้

JSONB:

  • จัดเก็บในรูปแบบที่แยกโครงสร้างแล้ว → ไม่ต้องแยกวิเคราะห์ใหม่ตอนอ่าน
  • คีย์ที่ซ้ำกันจะถูกรวมเหลือรายการเดียว โดยใช้ค่ารายการสุดท้าย
  • ไม่รักษาลำดับคีย์
  • รองรับการสร้างดัชนี GIN
  • รองรับตัวดำเนินการพาธที่หลากหลาย

ตัวอย่าง JSONB

ตารางเหตุการณ์อย่างง่าย:

CREATE TABLE events (
  id BIGSERIAL PRIMARY KEY,
  ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  data JSONB NOT NULL
);

INSERT INTO events (data) VALUES
  ('{"type":"login","user_id":42,"ip":"1.2.3.4"}');

ตัวดำเนินการพาธ

JSONB มีตัวดำเนินการที่หลากหลาย ซึ่งจะกล่าวถึงในบทเรียนถัดไป:

SELECT data->'user_id'   FROM events;       -- → JSONB
SELECT data->>'user_id'  FROM events;       -- → TEXT
SELECT data #>> '{user,name}' FROM events;  -- nested text path

การมีข้อมูลครอบคลุม

ตัวดำเนินการ JSONB ที่มีประโยชน์ที่สุด: @> (มีข้อมูลที่ระบุอยู่)

SELECT * FROM events WHERE data @> '{"type":"login"}';

-- Combined with a GIN index, this is fast even on billions of rows.

ความเท่ากันของ JSONB

ค่า JSONB สองค่าจะเท่ากันเมื่อเนื้อหาตรงกัน โดยไม่คำนึงถึงลำดับคีย์:

SELECT '{"a":1,"b":2}'::JSONB = '{"b":2,"a":1}'::JSONB;    -- TRUE

การแปลงระหว่างชนิดข้อมูล

แปลงชนิดข้อมูลได้อย่างอิสระ:

SELECT '{"a":1}'::JSONB->'a';                -- 1 (as JSONB)
SELECT ('{"a":1}'::JSONB)->>'a';             -- '1' (as TEXT)
SELECT ('{"a":1}'::JSONB)->'a'::INT;          -- 1 (as INT after extraction)

กรณีที่ไม่ควรใช้ JSONB

หากข้อมูลมีโครงสร้างตายตัว ให้ใช้คอลัมน์จริง:

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

JSONB เหมาะอย่างยิ่งเมื่อโครงสร้างข้อมูลแตกต่างกันหรือเปลี่ยนแปลงอย่างรวดเร็ว

การออกแบบแบบผสม

แนวปฏิบัติที่ดีคือใช้คอลัมน์ที่มีโครงสร้างสำหรับฟิลด์ที่คงที่ และใช้ JSONB สำหรับข้อมูลเพิ่มเติมที่เปลี่ยนแปลงได้:

CREATE TABLE events (
  id BIGSERIAL PRIMARY KEY,
  ts TIMESTAMPTZ NOT NULL,
  event_type TEXT NOT NULL,
  user_id BIGINT,
  extra JSONB NOT NULL DEFAULT '{}'::JSONB
);

การตรวจสอบความถูกต้อง

JSONB จัดเก็บ JSON ที่ถูกต้องได้ทุกแบบ สำหรับข้อจำกัดที่มีโครงสร้าง ให้ใช้ข้อจำกัด CHECK หรือบังคับใช้โครงสร้างข้อมูลในชั้นแอปพลิเคชัน:

ALTER TABLE events
  ADD CONSTRAINT data_has_type CHECK (data ? 'type');

สรุป

JSONB ดีกว่าเจสันสำหรับกรณีใช้งานจริงแทบทั้งหมด

  • JSONB: ไบนารี สร้างดัชนีได้ และเข้าถึงพาธได้รวดเร็ว
  • เจสัน: ใช้สำหรับการแปลงกลับเป็นข้อความเท่านั้น
  • ใช้ JSONB กับโครงสร้างที่เปลี่ยนแปลงได้ และใช้คอลัมน์จริงกับโครงสร้างตายตัว

ตรวจสอบความเข้าใจอย่างรวดเร็ว

คุณกำลังออกแบบตารางใหม่เพื่อจัดเก็บเอกสารเจสันที่ผู้ใช้อัปโหลดและต้องค้นหาตามเนื้อหา ควรใช้เจสันหรือ JSONB

คำถามที่พบบ่อย

บทเรียน “JSONB เทียบกับ JSON: ควรใช้แบบใด” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “JSONB เทียบกับ JSON: ควรใช้แบบใด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “JSONB เทียบกับ JSON: ควรใช้แบบใด”

เลือกระหว่าง JSON (ข้อความ รักษาช่องว่าง) กับ JSONB (ไบนารี สร้างดัชนีได้ และกำจัดคีย์ซ้ำ) เพื่อจัดเก็บข้อมูลอย่างเหมาะสม คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “JSONB เทียบกับ JSON: ควรใช้แบบใด” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม

ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. JSONB เทียบกับ JSON: ควรใช้แบบใด
  2. ตัวดำเนินการเส้นทาง: -> ->> @>
  3. การสร้างดัชนี JSONB ด้วย GIN
  4. การสร้างแบบจำลอง: เมื่อ JSONB เหมาะกว่าการทำให้เป็นบรรทัดฐาน
← กลับไปที่ SQL Academy