Ghi chú của tôi về thiết kế schema Postgres của GitLab (2022)
(shekhargulati.com)Ghi chú của tôi về thiết kế schema Postgres của GitLab
- Bằng cách xem xét schema Postgres của GitLab, tôi muốn so sánh với schema mình đang thiết kế và học các thực hành tốt nhất từ định nghĩa schema của GitLab.
- GitLab là nền tảng DevOps mã nguồn mở, là đối thủ thay thế cho GitHub và có thể tự host.
Sử dụng loại khóa chính phù hợp
- Khi cơ sở dữ liệu còn nhỏ thì khó thấy, nhưng khi mở rộng, khóa chính ảnh hưởng đến dung lượng lưu trữ, tốc độ ghi và tốc độ đọc.
- Trong 573 bảng, GitLab dùng kiểu khóa chính
bigserialcho 380 bảng, dùngserial4cho 170 bảng và phần còn lại 23 bảng dùng khóa chính tổng hợp.
Sử dụng ID nội bộ và ID bên ngoài
- Việc không phơi bày khóa chính ra thế giới bên ngoài là một thực hành tốt.
- GitLab sử dụng cả ID nội bộ (
id) và ID bên ngoài (iid) trong các bảng nhưissues,ci_pipelines,deployments,epics.
Sử dụng kiểu dữ liệu text và ràng buộc kiểm tra
- Schema của GitLab dùng cả
character varying(n)vàtext, nhưng sử dụng kiểutextthường xuyên hơn. - Kiểu
textkhông có ràng buộc độ dài, và GitLab định nghĩa ràng buộc độ dài bằng cách sử dụngCHECK.
Quy tắc đặt tên
- Tất cả các bảng đều dùng số nhiều, và tiền tố tên module được dùng để tạo không gian tên.
- Tên bảng và cột tuân theo quy tắc
snake_case.
Sử dụng múi giờ cho timestamp
- GitLab sử dụng cả
timestamp with timezonevàtimestamp without timezone. - Đối với tác vụ hệ thống, GitLab dùng
timestamp without timezone; đối với tác vụ của người dùng thì dùngtimestamp with timezone.
Ràng buộc khóa ngoại
- GitLab sử dụng ràng buộc khóa ngoại cho hầu hết các bảng, nhưng không dùng trong một số bảng như
audit_events,abuse_reports,web_hooks_logs,spam_logs.
Phân vùng các bảng lớn
- GitLab phân vùng các bảng có thể có dung lượng lớn để tăng hiệu năng truy vấn.
Hỗ trợ trường hợp sử dụng tìm kiếm LIKE bằng Trigram và gin_trgm_ops
- GitLab sử dụng chỉ mục GIN (Generalized Inverted Index) để thực hiện tìm kiếm hiệu quả.
Sử dụng jsonb
- Schema của GitLab sử dụng kiểu dữ liệu
jsonbtrong nhiều bảng.
Các mẹo khác
- Sử dụng trường kiểm toán như
updated_attrong các bảng có thể chỉnh sửa, và không sử dụng trong các bảng log không thể chỉnh sửa. - Enums được lưu bằng
smallintthay vìcharacter varying, giúp tiết kiệm dung lượng.
Nhận xét của GN⁺:
- Thiết kế schema của GitLab cung cấp cái nhìn sâu sắc về thiết kế cơ sở dữ liệu, đặc biệt là các bài học quan trọng về tối ưu hóa schema cho hệ thống quy mô lớn.
- Vì GitLab là mã nguồn mở, các quyết định thiết kế schema như vậy mang lại ví dụ thực tế để các nhà phát triển khác áp dụng cho dự án của mình.
- Điều có thể học được từ schema của GitLab là cần cân nhắc kỹ các yếu tố ảnh hưởng lớn đến hiệu năng và bảo trì cơ sở dữ liệu như chọn kiểu dữ liệu, chiến lược lập chỉ mục, phân vùng và việc sử dụng ràng buộc khóa ngoại.
1 bình luận
Ý kiến trên Hacker News
Itrong các biến CI này, và hiểu rằng đây là lựa chọn liên quan tới cơ sở dữ liệu.1조.