สิ่งที่ควรรู้เกี่ยวกับ 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 ความคิดเห็น
สิ่งที่ไม่ควรทำ สักวันหนึ่งคงต้องหาเวลาอ่านดูสักครั้ง
ความคิดเห็นบน Hacker News
Postgres แยกแยะตัวพิมพ์เล็ก-ใหญ่ แต่การเขียนคีย์เวิร์ดใน query เป็นตัวพิมพ์ใหญ่มีไว้เพื่อให้อ่านง่ายขึ้น ไม่ได้เป็นข้อบังคับ แต่การจัดรูปแบบ query ให้ดูง่ายเวลา debug นั้นมีประโยชน์
actuallyUsingCaseInIdentifiersเพิ่งเจอรายการในวิกิ "Don't Do This" เป็นครั้งแรก และมันมีประโยชน์มาก
หลายเรื่องไม่ได้จำกัดอยู่แค่ Postgres (เช่น ความพิลึกของ null, ลำดับคอลัมน์ของดัชนี)
(email, username)ก็จะสามารถแทรกอีเมลเดิมซ้ำหลายครั้งได้ถ้า username เป็น nullคำแนะนำให้ทำ normalization กับข้อมูลควรรับอย่างระมัดระวัง
อยากให้นักพัฒนาใส่ใจกับ normalization มากขึ้น และเลิกยัดทุกอย่างลงในคอลัมน์ JSON(b)
คำว่า "journey" ให้ความรู้สึกน่ารำคาญในบล็อก เพราะถูกใช้มากเกินไป
ส่วนโค้ดบนมือถือใช้งานลำบากมาก จนแทบจะเลื่อนดูไม่ได้
ในสเปก JSON คำว่า 'null' เป็นค่าคงที่ และต่างจาก SQL NULL
การเพิ่มดัชนีอาจไม่ให้ผลอะไรเลยก็ได้
การได้อ่านบทความแบบนี้และเข้าใจได้ 90% ทำให้รู้สึกภูมิใจกับงานที่ตัวเองเคยรับผิดชอบ