2010-12-11 15 views
6

Oldukça yaygın bir tasarım sorunum var: Google App Engine'deki kayıtlar için geçmiş kaydı (denetim izi) uygulamam gerekiyor. Tarih günlüğünün yapılandırılması gerekir, yani tüm değişiklikleri bazı serbest biçimli metinlere katılamam ve dize alanında saklayamam.Google App Engine'deki tasarım değişikliklerinin verimli bir şekilde izlenmesi - tasarım kalıpları

Tarih modeli için aşağıdaki seçenekleri göz önünde bulundum ve # 1 numaralı seçenekteki performans sorunlarını fark ettikten sonra 3. seçenek için uygulamayı seçtim. Ama bu çözüm verimli ve ölçeklenebilir ise bazı şüpheleri var. Örneğin: # 3 numaralı seçenekte performansın dinamik özelliklerin sayısının artmasıyla önemli ölçüde düşme riski var mı?

Her seçenek için artıları/eksileri hakkında daha derin bir bilginiz var mı, yoksa Google App Engine DB özellikleri için geçerli olan diğer denetim izi tasarımı kalıpları önerebilir misiniz?

  1. kullanın klasik SQL "master-detay" ilişkisi
    • Artıları SQL arka
    • temiz veritabanı geliştiriciler için anlamak için basit
      • : Doğrudan geçmişi kayıt için tanım ve özellikleri
      • arama performans: tarih boyunca kolay arama (indeksleri kullanabilirsiniz)
      • sorun giderme: yönetim araçları (_ah/yönetici)tarafından kolay erişim
    • Eksileri
        sıklıkla GAE'nin DB bu şekilde uygulanması tavsiye edilmez bire çok ilişki
      • okuma performansı: kaydın fazla sayıda örneğin uzun denetim izini göstermek için okuma işlemleri büyük bir kayıt listesinin ayrıntıları bölmesinde. BLOB alanında
  2. Mağaza geçmişi (salamura piton yapılar)
    • Artıları
      • uygulama basit ve esnek
      • okuma performansı: çok verimli
    • Eksileri
        .210 sorgu performansı:
      • giderme endekslerini kullanarak arama yapamazsınız: yönetici db görüntüleyici (_ah/yönetici) verileri kontrol edemez
      • kirli:/anlama
    • (bu çirkin düşünün) SQL geliştiriciler için kabul etmek o kadar kolay
  3. Tarihi Expando'nun dinamik özelliklerinde depolayın. Örneğin. Her alan için fieldNamehistory_fieldName_n alanları (n = < 0 oluşturmak ..
    • basit: Basit uygulamak ve
    • giderme anlamak: Bir okuma işlemi için: yönetici arayüzü
    • okuma performansı sayesinde tüm geçmiş özelliklerini okuyabilir N> tarih kaydının bir sayı)
      • Artıları olduğunu
        • arama performansı: basitçe (tarih kayıtları üzerinden arama yapamazsınız onlar hav rekoru
      • Eksileri olsun e farklı isim) çok
      • değil temiz: özellikleri sayısı ana kayıtlarında liste alanların bazıları setteki ilk bakışta
  4. Mağaza geçmişini kafa karıştırıcı olabilir. Örneğin.
  5. okuma performansı SQL geliştiriciler için anlaşılması kolay:
    • temiz: tarih özelliklerinin doğrudan tanım
    • basit her fieldName için fieldName_history liste alanını
      • Artıları oluşturmak rekoru almak için bir okuma işlemi
    • Dezavantajları:
      • arama performansı: indisleri kullanılarak arama yapabilir o nly değeri olan ve belirli bir zamanda değerlerin birleşimi olan kayıtları arayaamayan kayıtlar için nly;
      • giderme: teftiş listeleri

cevap

3

Ben seçeneği okur 1. için gider seçmek zorunda kalacak olursa için (en fazla ise) olarak ölçülebilir olan yönetici db izleyicide zordur diğer seçenekler. Ve diğer tüm seçenekler yalnızca belirli koşullar altında (küçük veya çok büyük değişiklikler kümesi) hız avantajlarına sahiptir. Ayrıca, x gününden sonra tasfiye geçmişi veya farklı model türleri arasında sorgulama geçmişi gibi çok fazla esneklik (daha kolay) elde edeceksiniz. Tutarlılığı garanti altına almak için, aynı işlemdeki değiştirilmiş varlığın alt öğesi olarak geçmiş varlıkları oluşturduğunuzdan emin olun. Bunlardan biri ile son bulabilirsin: