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 picksJSONB: ไบนารีและสร้างดัชนีได้
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- JSONB เทียบกับ JSON: ควรใช้แบบใด
- ตัวดำเนินการเส้นทาง: -> ->> @>
- การสร้างดัชนี JSONB ด้วย GIN
- การสร้างแบบจำลอง: เมื่อ JSONB เหมาะกว่าการทำให้เป็นบรรทัดฐาน