2009-03-12 22 views
8

Şu ana kadar gayet iyi çalışan tek bir dosyanın birden çok sürümünü depolamamı sağlayan basit bir revizyon sistemi üzerinde çalışıyorum.MySQL kullanarak basit bir revizyon sistemi oluşturmanın en iyi yolu nedir?

file_id  file_revision  file_parent  file_name 
-------------------------------------------------------- 
1   1     0    foo.jpg 
2   2     1    foorevised.jpg     
3   3     1    anotherrevision.jpg 

: (kısa olması için kaldırılmıştır eskimiş sütun), aşağıdaki gibi

Tablo yapısı

  • file_id birincil anahtar, otomatik artışlarla
  • file_revision depolar ilk
  • file_parent olduğunda, 1 için varsayılan düzeltme numarası ilk kez revizyonun üst düzey ebeveyni, ilk olarak 0. Dosya adı olmak üzere
  • file_name.

sorun:

  • Tercihen ben tüm dosyaları almak istediğiniz tek bir sorgu kullanarak ...
  • Ama her dosyanın sadece en son revizyonu ...
  • .. Sadece bir revizyon saklandığında (orijinal), bu alınmalıdır.

Herhangi bir işaretçi büyük beğeni topluyor. Şimdiden teşekkürler.

+0

Neden bunun aşağıya düştüğünü anlamıyorum, bence bu yasal bir soru, cevabı görmeyi merak ediyorum. –

cevap

3

Geri alma uğruna en etkili yolu, dosyanın en son sürümünü almak istediğinizde select * from table where file_id=1 and is_latest=true, önceden doldurmanız gereken is_latest gibi bir sütun eklemektir. Açıkçası bu, bu tablonun güncellenmesini sağlayacaktır. Ancak karmaşık.

Bunu yapmanın başka bir yolu, dosyaların en son sürümlerini tek bir tabloda ve geçmiş sürümlerini başka bir tabloda depolamak olabilir. En son sürüm olan tüm dosyalarını seçmek isterseniz, select * from table where is_latest=true, is_latest dizine eklenmiş olsa bile büyük olasılıkla tam bir tablo taraması yapabilir. En son satırlar tek bir tablodaysa, veritabanı hepsini sırayla IO'da okuyabilir ve gerek 1) gerekse sadece ihtiyaç duyduğu kayıtları bulmak için tablodan çok şey yapar veya 2) tüm tabloyu taramak için büyük Eski kayıtlar için yol boyunca veri miktarları.

Mevcut tablo tasarımını değiştirmek istemediğinizi farz edelim, ne yapmak istediğinizi en fazla grupsal olarak seçmek denir, bkz. this article mysql içinde yapmanın birkaç farklı yolu.

+0

Bunun çok eski bir cevap olduğunu anlıyorum, ancak mutlaka bir zaman damgası kontrolü daha basit, daha kolay ve daha verimli olacaktır. Is_latest bayrağını kaldırmak için son revizyonu güncellemenize gerek yoktur ve seçerken sadece 1 ve zaman damgasıyla sıralamayı seçersiniz. – Sk446

1
file_id  file_revised  file_name    Time_Stamp 
----------------------------------------------------------------- 
1   1     foo.jpg     insert_time 
2   1     foorevised.jpg   insert_time     
3   1     anotherrevision.jpg  insert_time 

Sonra bu gibi sorgularda varyasyonları yapacağını:

SEÇ * NEREDE file_revision

Veya sorgunun bu tür varyasyon herhangi herhangi bir sayı, yani TARAFINDAN time_stamp GRUBU TARAFINDAN file_revision = 1 SİPARİŞ limit 1 veya Order en yüksek olarak file_id olarak da olacaktır.

İlgili konular