Kayıt meta verilerini depolamak için en iyi uygulama


10

Bireysel kayıtların meta verilerini bir veritabanında depolamak için en iyi uygulama hangisidir?

Veritabanımdaki birçok tablo için oluşturma zamanı ve son güncelleme zamanı gibi ortak meta verileri depolamam gerekiyor. Birkaç farklı çözüm buldum:

  1. Meta verileri doğrudan tablolarda saklayın.

    Artıları:

    • Meta veriler doğrudan kayıtlarla bağlantılıdır
    • Meta verileri almak için birleştirme gerekmez

    Eksileri:

    • Çok sayıda yinelenen sütun gerekli (miras kullanılmadığı sürece)
    • Meta veriler ve işletme verileri ayrılmaz
  2. İle genel bir meta veri tablosu oluşturun ve verileri doğru tablolara ve kayıtlara bağlamak için yumuşak yabancı anahtarlar kullanın.

    Artıları:

    • Sütunların çoğaltılması yok
    • Meta veriler işletme verilerinden ayrılır

    Eksileri:

    • Meta veriler ve veriler arasında doğrudan bağlantı yok (FK'ler kullanılamaz)
    • Birleşimler ek koşul gerektirir
  3. Meta veri gerektiren her tablo için ayrı meta veri tabloları oluşturun.

    Artıları:

    • Meta veriler doğrudan kayıtlarla bağlantılıdır
    • Meta veriler işletme verilerinden ayrılır

    Eksileri:

    • Çok fazla ekstra tablo gereklidir
    • Çok sayıda yinelenen sütun gerekli (miras kullanılmadığı sürece)

Burada bahsettiğimden daha fazla seçenek, artı veya eksileri var mı? Ve bu meta verileri depolamak için en iyi uygulama hangisidir?


Ne tür meta verilerden bahsediyoruz? Belki bir hstoreveya JSONsütun kullanmak sorununuzu çözebilir?
a_horse_with_no_name

@a_horse_with_no_name - Şu anda yalnızca oluşturma zamanı, güncelleme zamanı ve oluşturma kaynağına ihtiyacım var. Depolama alanı gibi anahtar / değer çiftine ihtiyacım yok. Sadece verileri nerede saklamam gerektiği konusunda endişeliyim.
Tiddo

1
Sonra bu üç sütunu temel tabloya eklememek için bir neden göremiyorum.
a_horse_with_no_name

Yanıtlar:


7

Bahsettiğiniz sütunlar 20 bayt kaplar (dolgu olmadan hizalanmışsa):

oluşturma zamanı, güncelleme zamanı ve oluşturma kaynağı

zaman damgası .. 8 bayt
zaman damgası .. 8 bayt
tamsayı .. 4 bayt

Yalnızca ayrı bir tabloda ayrı bir satır için grup başlığı ve öğe tanımlayıcısı 23 + 1 + 4 = 28 bayt artı 20 bayt gerçek veri artı sonunda 4 bayt dolguyu işgal eder. Satır başına 52 bayt yapar . Görmek:

Depolama konusunda kazanacak bir şeyiniz yok. Performansla ilgili olarak, satır başına sadece 16 - 24 bayt daha fazla bir şey kaybetmezsiniz.

Sütunlar doğrudan sıraya aittir, bu nedenle onları bir arada tutmak mantıklıdır. Tüm ilgili tablolara tam olarak bu tür sütunları (son güncelleme için ayrı bir kaynak) eklemeyi alışkanlık haline getiriyorum.

Ayrıca TRIGGER ON INSERT OR UPDATEgüncel tutmak için a yazmak daha kolaydır .

Uzun hikaye kısa: seçenek 1 için güçlü bir oy .

3. seçenek için nereye gideceğim :
Meta veriler sık ​​sık güncelleniyorsa, çekirdek satır değil. Daha sonra UPDATE'leri daha ucuz hale getirmek ve ana masada şişmeyi azaltmak için ayrı bir 1: 1 tablo tutmanız gerekebilir, hatta seçenek 2'yi tercih edebilirsiniz.

Seçenek 2 için nereye gideceğim :
Meta veri sütun kümesi çok tekrarlı ise. Ana tablo (lar) da meta veri kümesine bir FK sütunu ekleyebilirsiniz. Örneğin küçük üç sütun için fazla tasarruf yapmaz.


Bunu tablo devralma ile çözmeye ne dersiniz, meta veri sütunlarını doğrudan tabloda kullanmakla karşılaştırıldığında dikkate değer dezavantajlar var mı? Ancak doğru anlıyorum, postgres 'ın tablo miras SQL standartlarına uygun değil, ben?
devrys

1
@devrys: Kalıtımın Postgres'te bazı sınırlamaları var Daha da önemlisi : Kalıtımın satır başına bazı ek sütunları kaydetmeyi nasıl çözebileceğini göremiyorum . meta veri içermeyen bazı satırlarınız ve diğer satırlarınız varsa bir seçenek olurdu. Ama olur değil bunun için kullanırlar.
Erwin Brandstetter
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.