2013-07-29 20 views
6

Makaleler gibi verileri bir mysql veritabanına depolamalıyım ve bir makale değiştirildiyse, eski sürümü de geri yüklemeyi mümkün kılmak için kaydetmeliyim. Bu konuyla ilgili bazı benzer sorular ve mesajlar buldum, ancak emin değilim, sorunu çözmek için en iyi çözüm hangisidir. İşte Bir mysql veri sürümlendirme sistemi için en iyi yöntem

daha iyi anlaşılması için temel tablosu "makaleleri" dir:

eşyalar (id, isim, metin) Benim için

, bunun için iki farklı yaklaşım vardır:

Yaklaşım 1

Verileri ve makalenin her bir sürümünü "makaleler" tablosunda saklayın ve "sürüm" ve "durum" sütunlarını ekleyin. Sürümde, makalenin artırılmış sürüm numarasını saklıyorum. Aktif madde "durumu" 1 ve başkalarını alır "durum" 2.

profesyonelin: Yalnızca bir tablo yeni bir sürümü bir ekleme olduğu

  • tabi

    • yeni veri ve eskisinin "statü" -Kolon sadece bir güncelleme

    Con'ın

    • Çok büyük tablolar (belki daha yavaş sorgular ???)

    Yaklaşım alan "versiyonunu" den "makaleler" Add ve masa "içine yalnızca etkin veri depolamak 2

    makaleler". Verilerin eski sürümleri "articles_versioned" tablosuna kaydedildi/taşındı.

    profesyonelin:

    • Sadece gerçek geçerli veridir tablosu "makaleler" tabloları

    Con'ın

    • IPARD ile aynı içinde

    So. İyi bir yaklaşım mı unuttum? İlgili verilerle diğer tablolarda nasıl ilgilenilir (görüntüler, vb.)?

  • +1

    Bu genellikle "veri yakalama" (CDC) olarak adlandırılır. Google bunun için: http://www.google.com/search?aq = f & gcx = w & sourceid = chrome & ie = UTF-8 & q = mysql + change + data + capture & safe = etkin – duffymo

    +0

    Bir önceki durumu güncellemenize gerek yok, sadece bu belirli makale için en yüksek kimliği seçin – Anigel

    +0

    Durumum eğer istersem bir önceki sürüme geri dönmek için – bernhardh

    cevap

    3

    Seçimim, yaklaşım 2'nin bir varyasyonu olabilir. Kalın, birincil anahtardaki alanları gösterir.

    • Bir masanın articles_versioned (id, damgası, isim, metin)
    • Kişisel ikinci tablo articles olduğu her yazı eklemek (id, zaman damgası, [ad, metin]). Zaman damgasının birincil olmadığına dikkat edin; isim ve metin çoğaltılmış olabilir veya
    • articles_versioned sadece takılı satır alır ve articles üzerine çoğaltır uç üzerindeki bir tetikleyici vardır (id ve zaman damgası articles_versioned birincil anahtar olduğundan hızlı olacaktır) articles_versioned ile katılmak bir kullanabilir
    • Bir makalenin belirli bir sürümünü geri yüklemek için articles tablosunu değiştirin. Bu yaklaşımın

    avantajları şunlardır:

    1. Sen ücretsiz olarak tablodaki başka bilgileri (yazının tarih ve saati) olsun yine
    2. gerekebilir Sen gerekmez güncel tarihi almak için veritabanını sorgulamak. Eğer sürümü kullanıyorsanız, yapmanız gerekir.
    3. Kodunuzun makaleyi iki tabloya eklemek zorunda değil. Basitçe articles_versioned'u ekleyip articles'dan okuyun, db, verileri tutarlılık sorunlarından kaçınarak tetikleyici aracılığıyla eklediğinizde geçişi sağlar.

    Con'ın bir ağır eşzamanlı ortamda

    1. , iki sürümü aynı zamanda takılabilir, böylece bunlardan biri başarısız olabilir. Bu, kullanıcı tarafından yazılan makaleleri eklerken bir sorun olmamalıdır (günümüzde zaman damgalarının kesinliği çok düşüktür). Zaman damgasını INSERT ifadenizde belirtmezseniz, ancak bunun yerine tarih saatini geçerli saati varsayılan değer olarak alacak şekilde ayarlarsanız, bu sorunu tamamen ortadan kaldırabilirsiniz.

    Sorunuzun kalanını cevaplamak için. Durumda bir dizin eklediğiniz sürece Yaklaşım 1 daha uzun sorgulara yol açmaz. Bu, her makalenin birçok farklı sürümüne sahip olma eğiliminde olmanız halinde mantıklıdır; ortalama veya daha az makale başına 2 sürümünüz olduğu sürece, indeks sadece sizi yavaşlatır ve yaklaşım 2 zaten daha hızlı bir şekilde daha hızlı olmaz (yine de, bir sürümü geri yüklediğinden, kodu basitçe değiştirdiğinden hala benim yaklaşımımı öneririm iki satır için anahtarlama durumu gerektirmez).

    İlgili kaynaklar, resimler gibi, benzer bir sürümü izlemelidir. Onları dosya sisteminden kurtardığınızı kabul ediyorum; Bunları gerçek adlarıyla kaydetmek yerine, her bir resime bir kimlik vermek için bir tablo (kimlik, image_name) kullanın ve görüntüyü -id-.jpg olarak kaydedin. Image_name alanı, orijinal dosya adının ne olduğunu bilmenizi sağlar (bunu önemsiyorsanız). Bu şekilde, görüntüleri makalelerin sürümüyle aynı şekilde yükleyebilir ve makalelerde sonsuza kadar kullanılabilir olacağını bildiğiniz <img src="-id-.jpg"> gibi bir şey kullanırsınız.

    +0

    Üzgünüm bu cevap biraz geç geliyor, ancak başkalarına yararlı olabilir. – p91paul

    +0

    Bu arkeoloji gonguna mı gidiyorsunuz? – Strawberry

    +1

    Hadi, başka bir şey ararken bu soruya düştüm ve soru tarihini fark etmeden önce cevap vermeye başladım :). Ben hala alakalı olabileceğini düşünüyorum. – p91paul

    İlgili konular