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

การสร้างแบบจำลอง: เมื่อ JSONB เหมาะกว่าการทำให้เป็นบรรทัดฐาน

ตัดสินใจเลือกระหว่างคอลัมน์ JSONB กับตารางแยก — คุณลักษณะที่ยืดหยุ่นเทียบกับโครงสร้างข้อมูลที่เข้มงวด

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

ตัวเลือก

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

กรณีที่คอลัมน์จริงเหมาะกว่า

ใช้คอลัมน์จริงเมื่อข้อมูลมีลักษณะดังนี้:

  • ทราบรูปแบบแน่นอนและคงที่
  • มีการค้นหาบ่อยและใช้ดัชนี
  • ตรวจสอบด้วยข้อจำกัด CHECK / FK
  • นำไปทำรายงานหรือเชื่อมตาราง

กรณีที่ JSONB เหมาะกว่า

ใช้ JSONB เมื่อ:

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

รูปแบบแบบผสม

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

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

กับดัก EAV

แบบจำลอง entity-attribute-value แบบคลาสสิก ซึ่งใช้ตารางเดียวเก็บแถวในรูปแบบ (คีย์, ค่า) เคยเป็นทางเลือกเดียวสำหรับข้อมูลแบบเบาบาง ปัจจุบัน JSONB แทนที่ EAV ด้วยคอลัมน์เอกสารเพียงคอลัมน์เดียว:

-- Old EAV:
CREATE TABLE user_attrs (
  user_id BIGINT,
  attr TEXT,
  val TEXT
);

-- Modern:
ALTER TABLE users ADD COLUMN attrs JSONB NOT NULL DEFAULT '{}';

-- JSONB queries are faster and easier than the EAV joins.

กลยุทธ์การย้ายโครงสร้าง

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

ข้อจำกัดของ JSONB

เพิ่มข้อจำกัด CHECK เพื่อบังคับใช้โครงสร้างขั้นต่ำ:

ALTER TABLE events
  ADD CONSTRAINT data_has_type CHECK (data ? 'type'),
  ADD CONSTRAINT type_is_string CHECK (jsonb_typeof(data->'type') = 'string');

ย้ายฟิลด์ที่ใช้งานสูงมาเป็นคอลัมน์จริง

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

การดำเนินการแพตช์ JSONB

อัปเดตฟิลด์เดียว:

UPDATE users
SET attrs = jsonb_set(attrs, '{plan}', '"pro"')
WHERE id = 1;

อย่าจัดเก็บเงินใน JSONB

ค่าทางการเงินต้องใช้ชนิดข้อมูล NUMERIC ที่แม่นยำและมีข้อจำกัด ควรใช้คอลัมน์จริงเสมอ

กรณีที่ JSONB สร้างปัญหา

หากคุณต้องดึงและแปลงชนิดข้อมูลของคีย์ JSONB เดิมในทุกแบบสอบถาม นั่นเป็นสัญญาณว่าควรย้ายคีย์นั้นมาเป็นคอลัมน์ ต้นทุนสะสมของ (data->>'k')::INT เมื่อทำงานกับหลายล้านแถวจะเพิ่มขึ้นอย่างมาก

เอกสารโครงสร้างข้อมูล

คอลัมน์ JSONB เขียนข้อมูลได้ง่าย แต่จัดทำเอกสารได้ยาก ควรรักษาโครงสร้างข้อมูลภายนอก เช่น JSON Schema หรือโค้ดของแอปพลิเคชัน เพื่อให้ผู้ร่วมงานทราบว่าควรคาดหวังข้อมูลในรูปแบบใด

สรุป

JSONB เป็นเครื่องมือทรงพลัง ควรใช้กับส่วนที่เปลี่ยนแปลงได้ และใช้คอลัมน์จริงกับแกนข้อมูลที่คงที่ เมื่อพบรูปแบบการใช้งานที่ชัดเจน ควรย้ายฟิลด์ที่ใช้งานสูงมาเป็นคอลัมน์จริง

แบบทดสอบสั้น ๆ

คุณกำลังจัดเก็บเหตุการณ์ตรวจสอบ เหตุการณ์ทุกเหตุการณ์จะมีประเภทอยู่เสมอ ส่วนบางเหตุการณ์มีอาร์เรย์ของ "ผู้ดำเนินการ" ซึ่งมีโครงสร้างแตกต่างกัน คุณจะออกแบบแบบจำลองอย่างไร

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

บทเรียน “การสร้างแบบจำลอง: เมื่อ JSONB เหมาะกว่าการทำให้เป็นบรรทัดฐาน” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การสร้างแบบจำลอง: เมื่อ JSONB เหมาะกว่าการทำให้เป็นบรรทัดฐาน”

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

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

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

บทเรียน “การสร้างแบบจำลอง: เมื่อ JSONB เหมาะกว่าการทำให้เป็นบรรทัดฐาน” ใช้เวลานานแค่ไหน

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

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

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

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

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