1 puan yazan GN⁺ 2024-02-18 | 1 yorum | WhatsApp'ta paylaş

GitLab Postgres Şema Tasarımı Üzerine Notlarım

  • GitLab'in Postgres şemasını inceleyerek, kendi tasarladığınız şemayla karşılaştırmak ve GitLab'in şema tanımından iyi uygulama örnekleri öğrenmek istedim.
  • GitLab, açık kaynaklı bir DevOps platformudur ve GitHub'a bir alternatiftir; kendi başına barındırma imkanı sunar.

Doğru Birincil Anahtar Türü Kullanmak

  • Veritabanı küçükken fark edilmese de, büyüyünce birincil anahtarlar depolama alanını, yazma hızını ve okuma hızını etkiler.
  • GitLab, 573 tablodan 380'inde bigserial birincil anahtar türünü, 170'ında serial4 türünü, kalan 23'ünde ise bileşik birincil anahtarları kullanır.

İç ve Dış Kimliklerin Kullanımı

  • Birincil anahtarları dış dünyaya açmamak iyi bir uygulamadır.
  • GitLab, issues, ci_pipelines, deployments ve epics gibi tablolarda hem dahili kimlik (id) hem de harici kimlik (iid) kullanır.

text Veri Tipi ve CHECK Kısıtlama Kullanımı

  • GitLab şeması hem character varying(n) hem de text türlerini kullanır, ancak text türünü daha sık kullanır.
  • text türünün bir uzunluk kısıtlaması yoktur; uzunluk kısıtlaması CHECK kullanılarak tanımlanır.

Adlandırma Kuralları

  • Tüm tablolar çoğul adlandırılır ve ad alanı sağlamak için modül önekleri kullanılır.
  • Tablo ve sütun adları snake_case kurallarını takip eder.

Zaman Damgalarında Saat Diliminin Kullanımı

  • GitLab hem timestamp with timezone hem de timestamp without timezone türlerini kullanır.
  • Sistem işlemleri için timestamp without timezone, kullanıcı işlemleri için timestamp with timezone kullanılır.

Yabancı Anahtar Kısıtları

  • GitLab, çoğu tabloda yabancı anahtar kısıtları kullanır; ancak audit_events, abuse_reports, web_hooks_logs, spam_logs gibi bazı tablolarda kullanılmaz.

Büyük Tablolar için Bölümleme

  • GitLab, sorgu performansını artırmak için boyutu büyüyebilecek tabloları bölümlemeye tabi tutar.

Trigramlar ve LIKE Aramayı Desteklemek için gin_trgm_ops Kullanımı

  • GitLab, verimli arama yapmak için GIN (Generalized Inverted Index) dizinini kullanır.

jsonb Kullanımı

  • GitLab şeması, birçok tabloda jsonb veri türünü kullanır.

Diğer İpuçları

  • Değiştirilebilir tablolarda updated_at gibi denetim alanları kullanılır; değiştirilemeyen günlük tablolarında ise kullanılmaz.
  • Enumlar, alan tüketimini azaltmak için character varying yerine smallint olarak depolanır.

GN⁺'in Yorumu:

  • GitLab'in şema tasarımı, veritabanı tasarımı hakkında önemli içgörüler sunar ve özellikle büyük ölçekli sistemler için şema optimizasyonu konusunda kritik dersler içerir.
  • GitLab'in açık kaynak olması, bu şema tasarım kararlarının diğer geliştiricilere kendi projelerinde uygulayabilecekleri pratik örnekler sunmasını sağlar.
  • GitLab şemasından öğrenilebilecek en önemli nokta, veri türü seçimi, dizinleme stratejisi, bölümleme ve yabancı anahtar kısıtlarının kullanımı gibi veritabanı performansı ile bakımını doğrudan etkileyen unsurların dikkatlice değerlendirilmesi gerektiğidir.

1 yorum

 
GN⁺ 2024-02-18
Hacker News yorumları
  • Birincil anahtarları dışarıdan açığa çıkarmamanın genelde iyi bir uygulama olduğu söyleniyor. Özellikle ardışık artan tamsayı veya bigint otomatik artışlı tanımlayıcılar kullanılırken bu durum önemlidir; çünkü tahmin edilebilirler.

    • Birincil anahtarları dışarıdan ifşa etmemenin iyi bir uygulama olduğu belirtiliyor. Özellikle sıralı artan tamsayı kimlikleri tahmin edilebilir olduğu için bu daha da önemlidir.
  • Örneğin, GitHub'in 2020'de 128 milyon açık deposu vardı. Bir depoda ortalama 20 issue varsayarsak serial aralığını aşar. Ayrıca tablo tipini değiştirmek pahalı bir işlemdir.

    • GitHub'in açık depo sayısı ve tahmini issue sayısına dayanarak serial aralığının aşılabileceğini, tablo tipini değiştirme maliyetini vurguluyor.
  • UUID sütununun depolama boyutu hakkındaki argüman ikna edici değil. Bir tabloda 5 başka sütun varsa, 128 bit ile 64 bit arasında büyük bir fark yoktur.

    • UUID sütununun depolama boyutuna ilişkin endişeden ziyade performansın önemli olduğu ileri sürülüyor. UUIDv4 tamamen rastgele olduğu için indeks performansı için ideal olmayabilir; UUIDv7 daha iyi bir seçenek olabilir.
  • Yabancı anahtarların pahalı olduğu iddiası sıkça tekrarlanır ama neredeyse doğrulanmamıştır. Veritabanını doğru kullanmak, yeniden uygulamaya göre daha fazla bilgi ve deneyim gerektirir ve çoğu zaman daha iyi sonuç verir.

    • Yabancı anahtarların maliyetine dair yaygın iddiaya karşı, veritabanını doğru kullanmanın önemini vurguluyor.
  • GitLab ve GitHub arasındaki performans farklarını yazan biri var mıydı?

    • GitLab ile GitHub arasındaki performans farkına ilgi duyduğunu, GitLab'in sayfa yükleme sürelerinin GitHub'e kıyasla belirgin şekilde daha yavaş göründüğünü belirtmeyi anlatıyor.
  • CI değişkenleri CI_PIPELINE_IID ve CI_MERGE_REQUEST_IIDde eklenen I harfinin nedeni neydi diye merak etmiştim. Veritabanı odaklı bir seçim olduğunu düşünüyordum ama bu yazı onu doğruluyor.

    • CI değişkenlerinde gördüğümüz ekstra I karakterinin amacını merak edip bunun veritabanı ile ilgili bir seçim olduğunu anladığını ifade ediyor.
  • Bu yazı çok yararlıydı. Benzer başka bir yazıyı nereden bulabilirim?

    • Yazının faydalı olduğunu söylüyor ve benzer içerikte başka bir yazı arıyor.
  • Şema tasarımı ve geliştirme genel olarak eski moda mı kalıyor, yoksa sadece ben mi böyle hissediyorum?

    • Şema tasarımı ve geliştirme sürecinin geçmişte kaldığını düşündüğünü; özellikle migration yaparken veri kaybı riskinin endişesini, ve veritabanı/ORM'nin dış anahtar ile iç anahtarı otomatik yönetmemesi konusunu sorguluyor.
  • 1 gyeong, 1000000000 jo ile eşittir.

    • 32-bit ve 64-bit tamsayılar arasındaki seçim gerçekliğine dikkat çekiyor ve yaklaşık 1 trilyon kardinaliteyi destekleyen 5 baytlık bir tamsayı türüne ihtiyaç olabileceğini söylüyor.
  • Postgres'in yerel UUID v4 tipini kullandığınızda tablo boyutu %25 büyür ve bigserial'e kıyasla ekleme hızı %25 düşer.

    • UUIDv4 ile bigserial arasındaki performans farkını soruyor, ayrıca UUIDv4'ün neden daha kötü performans gösterdiğini açıklamasını istiyor.