7 คะแนน โดย GN⁺ 2024-11-13 | 2 ความคิดเห็น | แชร์ทาง WhatsApp

สิ่งที่ควรรู้เกี่ยวกับ Postgres

  • เอกสารของ Postgres มีจำนวนมากมหาศาล: เอกสารทางการของ Postgres ยอดเยี่ยมมาก แต่มีปริมาณมากจนวิศวกรมือใหม่อ่านตั้งแต่ต้นจนจบได้ยาก

การทำข้อมูลให้เป็นมาตรฐาน

  • การทำข้อมูลให้เป็นมาตรฐาน: เป็นกระบวนการลบข้อมูลซ้ำซ้อนออกจากสคีมาฐานข้อมูล ตัวอย่างเช่น ในตาราง documents ไม่ควรมีคอลัมน์ user_email แต่ควรเชื่อมกับตาราง users ผ่าน foreign key
  • ความจำเป็นของการลดรูปแบบมาตรฐาน: บางครั้งอาจจำเป็นต้องลดรูปแบบมาตรฐานเพื่อให้อ่านข้อมูลบางอย่างได้เร็วขึ้น แต่ข้อมูลที่ลดรูปแบบมาตรฐานแล้วต้องแลกมากับความเสี่ยงของข้อมูลไม่สอดคล้องกันหรือความซับซ้อนในการเขียนที่เพิ่มขึ้น

ทำตามคำแนะนำของผู้สร้าง Postgres

  • "สิ่งที่ไม่ควรทำ" ใน Postgres Wiki: ใน Postgres Wiki อย่างเป็นทางการมีรายการ "สิ่งที่ไม่ควรทำ" อยู่ ต่อให้ยังไม่เข้าใจทั้งหมดก็ช่วยหลีกเลี่ยงความผิดพลาดได้
  • คำแนะนำ: ใช้ชนิด text สำหรับเก็บข้อความทั้งหมด ใช้ชนิด timestampz/time with time zone สำหรับเก็บ timestamp ทั้งหมด และตั้งชื่อตารางเป็น snake_case

ความแปลกเฉพาะทั่วไปของ SQL

  • SQL ไม่แยกตัวพิมพ์เล็กพิมพ์ใหญ่: คีย์เวิร์ด SQL ไม่แยกตัวพิมพ์เล็กพิมพ์ใหญ่ และไม่ได้เป็นเรื่องเฉพาะของ Postgres เท่านั้น
  • ความพิเศษของ NULL: NULL ใน SQL หมายถึง "ไม่ทราบ" และเมื่อใช้ร่วมกับโอเปอเรเตอร์ส่วนใหญ่ ผลลัพธ์จะกลายเป็น NULL สามารถใช้โอเปอเรเตอร์อย่าง IS NULL, IS NOT NULL เพื่อเปรียบเทียบ NULL ได้

ทำให้ psql ใช้งานได้มีประโยชน์มากขึ้น

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

ผลของการเพิ่มดัชนี

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

การใช้งาน JSONB

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

เคล็ดลับที่มีประโยชน์อื่น ๆ

  • ปัญหาของทรานแซกชันที่ยาวนาน: หากทรานแซกชันกินเวลานานเกินไป อาจขัดขวางไม่ให้ไคลเอนต์อื่นเข้าถึงฐานข้อมูลได้
  • ความสามารถอันทรงพลังของ Postgres: Postgres มอบจุดแข็งแบบฐานข้อมูลเชิงเอกสาร และสามารถจัดเก็บกับคิวรีข้อมูลได้อย่างมีประสิทธิภาพผ่าน JSONB

2 ความคิดเห็น

 
bbulbum 2024-11-19

สิ่งที่ไม่ควรทำ สักวันหนึ่งคงต้องหาเวลาอ่านดูสักครั้ง

 
GN⁺ 2024-11-13
ความคิดเห็นบน Hacker News
  • Postgres แยกแยะตัวพิมพ์เล็ก-ใหญ่ แต่การเขียนคีย์เวิร์ดใน query เป็นตัวพิมพ์ใหญ่มีไว้เพื่อให้อ่านง่ายขึ้น ไม่ได้เป็นข้อบังคับ แต่การจัดรูปแบบ query ให้ดูง่ายเวลา debug นั้นมีประโยชน์

    • คล้ายกับการจัดระเบียบโค้ดในภาษาอื่น ๆ เช่น การย่อหน้าให้สม่ำเสมอ ช่วยลดเวลาในการทำความเข้าใจและทำให้โฟกัสกับส่วนสำคัญได้
    • อยากหลีกเลี่ยงการใช้ตัวพิมพ์ใหญ่ใน identifier แบบ actuallyUsingCaseInIdentifiers
  • เพิ่งเจอรายการในวิกิ "Don't Do This" เป็นครั้งแรก และมันมีประโยชน์มาก

  • หลายเรื่องไม่ได้จำกัดอยู่แค่ Postgres (เช่น ความพิลึกของ null, ลำดับคอลัมน์ของดัชนี)

    • ตัวอย่างเช่น วิธีที่ null โต้ตอบกับดัชนีและข้อกำหนด unique ใน MySQL ก็ไม่ได้เป็นเรื่องที่เข้าใจได้ตรงไปตรงมา
    • ถ้ามีตารางผู้ใช้ที่มีคอลัมน์อีเมลซึ่งไม่อนุญาตให้เป็น null และคอลัมน์ชื่อผู้ใช้ซึ่งอนุญาตให้เป็น null แล้วมีข้อกำหนด unique แบบ (email, username) ก็จะสามารถแทรกอีเมลเดิมซ้ำหลายครั้งได้ถ้า username เป็น null
  • คำแนะนำให้ทำ normalization กับข้อมูลควรรับอย่างระมัดระวัง

    • ผู้เขียนพูดถึง normalization 10 แบบที่แตกต่างกัน แต่คนส่วนใหญ่ไม่จำเป็นต้องใช้ถึง 7 แบบในนั้น
  • อยากให้นักพัฒนาใส่ใจกับ normalization มากขึ้น และเลิกยัดทุกอย่างลงในคอลัมน์ JSON(b)

  • คำว่า "journey" ให้ความรู้สึกน่ารำคาญในบล็อก เพราะถูกใช้มากเกินไป

  • ส่วนโค้ดบนมือถือใช้งานลำบากมาก จนแทบจะเลื่อนดูไม่ได้

  • ในสเปก JSON คำว่า 'null' เป็นค่าคงที่ และต่างจาก SQL NULL

  • การเพิ่มดัชนีอาจไม่ให้ผลอะไรเลยก็ได้

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