SORU
17 AĞUSTOS 2010, Salı


MongoDB/NoSQL: Belge Tarih Değişikliği Tutmak

Veritabanı uygulamalarında oldukça yaygın bir gereksinim, bir veritabanındaki bir veya daha fazla belirli varlıklar için değişiklikleri izlemek için. Bu satır sürüm, günlük bir tablo ya da tarihi bir tablo (diğer adları da vardır eminim) denilen duydum. Bir numara yollarını yaklaşım içinde bir İLİŞKİSEL--sen-ebilmek yazmak tüm değişiklikleri tüm kaynak tabloları tek bir tablo (daha bir günlük) ya da ayrı bir tarihi tablo için her kaynak tablo. Ayrıca veritabanı tetikleyiciler ile uygulama kodu ya da günlüğü yönetmek için seçeneğiniz vardır.

Aynı sorun için bir çözüm NoSQL belge veritabanı (özel) MongoDB gibi görünür, ve düzgün bir şekilde çözülmesi ne kadar zor olacağını düşünmeye çalışıyorum. Belgeler için sürüm numaralarını oluşturmak ve onları asla üzerine kadar basit olabilir mi? "Gerçek" yerine, "" belgeler? oturum için ayrı bir koleksiyon oluşturma Nasıl bu sorgulama ve performansı etkiler mi?

Yani, orada ortak bir çözüm eğer her neyse, bu NoSQL veritabanları ile ortak bir senaryo mu?

CEVAP
18 AĞUSTOS 2010, ÇARŞAMBA


Güzel soru, bunu ben de istiyordum.

Her değişim yeni bir sürümünü oluşturun

Ruby için Mongoid sürücüsü Versioning module rastladım. Kendim kullanmadım, ama what I could find bir sürüm her belge numarasını ekler. Eski sürümleri belgenin kendisi gömülür. Büyük dezavantajı butüm belge her değişikliği yineleniyoryinelenen içerik çok büyük belgeleri ile uğraşırken saklanmasını neden olur., Bu yaklaşım, küçük boyutlu belgeler ve/ile ilgilenirken olsa iyi olur veya belgeleri çok sık güncelleme yok.

Yeni bir versiyonu sadece deposunu değiştirir

Başka bir yaklaşım olurduyeni bir sürümü, sadece değişen alanları saklayın. 'Tarihi belge herhangi bir sürümünü yeniden oluşturmak için. dümdüz sonra Bu model ve mağaza güncellemeleri değişiklikleri ve uygulama güncel belgeyi yeniden bir şekilde siler izlemeniz gerekiyor gibi oldukça karmaşık olsa da. Bu yapılandırılmış belgeler yerine düz SQL tabloları ile uğraşıyoruz gibi bu yanıltıcı olabilir.

Belge içinde saklamak değiştirir

Her alan da ayrı bir geçmişi var. Belirli bir sürümü için yeniden yapılandırma belgeleri böylesi çok daha kolay. Uygulamanız değerini değiştirdiğinizde açıkça değişiklikleri izlemek, ama sadece bu özelliği yeni bir sürüm oluşturmak zorunda değilsiniz. Bir belge böyle bir şey görmedi

{
  _id: "4c6b9456f61f000000007ba6"
  title: [
    { version: 1, value: "Hello world" },
    { version: 6, value: "Foo" }
  ],
  body: [
    { version: 1, value: "Is this thing on?" },
    { version: 2, value: "What should I write?" },
    { version: 6, value: "This is the new body" }
  ],
  tags: [
    { version: 1, value: [ "test", "trivial" ] },
    { version: 6, value: [ "foo", "test" ] }
  ],
  comments: [
    {
      author: "joe", // Unversioned field
      body: [
        { version: 3, value: "Something cool" }
      ]
    },
    {
      author: "xxx",
      body: [
        { version: 4, value: "Spam" },
        { version: 5, deleted: true }
      ]
    },
    {
      author: "jim",
      body: [
        { version: 7, value: "Not bad" },
        { version: 8, value: "Not bad at all" }
      ]
    }
  ]
}

Versiyonu silinmiş olarak belgenin bir parçası işaretleme yine de biraz garip. Silinen kısımlar için state alan tanıtabilirsin/başvurunuzu geri:

{
  author: "xxx",
  body: [
    { version: 4, value: "Spam" }
  ],
  state: [
    { version: 4, deleted: false },
    { version: 5, deleted: true }
  ]
}

Bu yaklaşımların her biri ayrı bir koleksiyon bir koleksiyon ve geçmiş verileri güncel ve basık bir sürümünü saklayabilirsiniz. Bu sadece bir belgenin son sürümünü ilgileniyorsanız sorgu kat artırmak gerekir. Ama en son sürümü ve tarihsel veri gerektiğinde, iki sorgu, bir yerine yapmak gerekir. Tek bir koleksiyon kullanarak seçimi vs iki ayrı koleksiyon bağlıdıruygulamanız tarihi Sürüm gerekiyor.

Bu cevap çoğu sadece düşüncelerimi beyin dökümü, aslında bunları henüz denemedim. Geriye baktığımda, ilk seçeneği yinelenen veri yükü uygulamanız için çok önemli değilse, muhtemelen en kolay ve en iyi çözümdür. İkinci seçenek oldukça karmaşıktır ve muhtemelen uğraşmaya değmez. Üçüncü seçenek temelde iki seçenek bir optimizasyon ve uygulamak için daha kolay olmalı, ama muhtemelen çok seçeneği Bir ile gidemez sürece uygulama uğraşmaya değmez.

İleri bu geri bildirim, sorun başkalarının çözüm :)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • IGN

    IGN

    19 EYLÜL 2006
  • Phymec

    Phymec

    18 Temmuz 2009
  • PlugResearch

    PlugResearch

    22 Mart 2006