หมายเหตุของฉันเกี่ยวกับการออกแบบสคีมา Postgres ของ GitLab (2022)
(shekhargulati.com)หมายเหตุของฉันเกี่ยวกับการออกแบบสคีมา Postgres ของ GitLab (2022)
- การศึกษาโครงสร้างสคีมา Postgres ของ GitLab เพื่อเปรียบเทียบกับสคีมาที่ฉันกำลังออกแบบ และเรียนรู้แนวปฏิบัติที่ดีจากการออกแบบสคีมาของ GitLab
- GitLab เป็นแพลตฟอร์ม DevOps แบบโอเพ่นซอร์ส ซึ่งเป็นทางเลือกของ GitHub และสามารถโฮสต์แบบ self-hosted ได้
การใช้ประเภทคีย์หลักที่เหมาะสม
- เมื่อฐานข้อมูลยังมีขนาดเล็กอาจไม่เห็นผลชัดเจน แต่เมื่อมีการเติบโต คีย์หลักย่อมมีผลต่อพื้นที่จัดเก็บ ความเร็วในการเขียน และความเร็วในการอ่าน
- ในบรรดาตารางทั้ง 573 ตาราง GitLab ใช้ประเภทคีย์หลัก
bigserial380 ตาราง และใช้serial4อีก 170 ตาราง ที่เหลือ 23 ตารางใช้คีย์หลักเชิงประกอบ
การใช้ ID ภายในและภายนอก
- การไม่เปิดเผยคีย์หลักไปยังโลกภายนอกถือเป็นแนวปฏิบัติที่ดี
- GitLab ใช้ทั้ง
idภายในและiidภายนอกในตารางอย่างเช่นissues,ci_pipelines,deployments,epics
การใช้ชนิดข้อมูล text พร้อมข้อจำกัดความยาว
- สคีมา GitLab ใช้ทั้ง
character varying(n)และtextแต่ใช้textมากกว่า - ชนิดข้อมูล
textไม่มีข้อจำกัดความยาวในตัวเอง และใช้CHECKเพื่อกำหนดข้อจำกัดความยาว
กฎการตั้งชื่อ
- ทุกตารางใช้รูปพหูพจน์ และใช้คำนำหน้าชื่อโมดูลเพื่อจัดการ namespace
- ชื่อตารางและชื่อคอลัมน์ยึดตามรูปแบบ snake_case
การใช้โซนเวลาสำหรับ timestamp
- GitLab ใช้ทั้ง
timestamp with timezoneและtimestamp without timezone - งานระบบใช้
timestamp without timezoneและงานที่ผู้ใช้ดำเนินการใช้timestamp with timezone
ข้อจำกัดคีย์ต่างประเทศ
- GitLab ใช้ข้อจำกัดคีย์ต่างประเทศในตารางส่วนใหญ่ แต่มีบางตารางที่ไม่ใช้ เช่น
audit_events,abuse_reports,web_hooks_logs,spam_logs
การแบ่งพาร์ติชันของตารางขนาดใหญ่
- GitLab แบ่งพาร์ติชันตารางที่อาจมีขนาดเติบโตขึ้นเพื่อเพิ่มประสิทธิภาพการ query
รองรับการค้นหาแบบ LIKE ด้วย Trigrams และ gin_trgm_ops
- GitLab ใช้ดัชนี GIN (Generalized Inverted Index) เพื่อให้การค้นหามีประสิทธิภาพมากขึ้น
การใช้ jsonb
- สคีมา GitLab ใช้ชนิดข้อมูล
jsonbในตารางหลายตาราง
เคล็ดลับเพิ่มเติม
- ในตารางที่สามารถแก้ไขได้ จะใช้ฟิลด์สำหรับตรวจสอบการอัปเดต เช่น
updated_atแต่ในตาราง log ที่ไม่สามารถแก้ไขได้จะไม่ใช้ - Enums ถูกเก็บในรูปแบบ
smallintแทนcharacter varyingเพื่อประหยัดพื้นที่
GN⁺ ความเห็น:
- การออกแบบสคีมา Postgres ของ GitLab ช่วยให้มีมุมมองเชิงลึกด้านการออกแบบฐานข้อมูล โดยเฉพาะบทเรียนสำคัญสำหรับการปรับแต่งสคีมาเพื่อรองรับระบบขนาดใหญ่
- เนื่องจาก GitLab เป็นโอเพ่นซอร์ส การตัดสินใจออกแบบสคีมาเหล่านี้จึงเป็นตัวอย่างที่นักพัฒนาคนอื่นๆ สามารถนำไปประยุกต์ใช้ในโปรเจกต์ของตัวเองได้
- สิ่งที่ควรเรียนรู้จากสคีมา GitLab คือ ต้องพิจารณาปัจจัยสำคัญที่มีผลต่อประสิทธิภาพและการดูแลรักษาฐานข้อมูลอย่างรอบคอบ ไม่ว่าจะเป็นการเลือกชนิดข้อมูล กลยุทธ์การทำ indexing การแบ่งพาร์ติชัน และการใช้งานข้อจำกัดคีย์ต่างประเทศ
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News