MySQL kayıt güncellemeleri geçmişini tutmak nasıl?

6 Cevap php

Ben bu yüzden tarihe göre eski bir revizyon bulabilirsiniz beni MySQL veritabanı kayıt güncellemeleri geçmişini tutmak sağlayacak PHP bir kod oluşturmak zorunda.

Here is the example of what I actualy want to achive: http://en.wikipedia.org/w/index.php?title=Tunisia&action=history

Veriler çoğunlukla biz raporlar üretmek için şirket hakkında kayıt ve endeksleri ayıklamak Numaraları.

Onun 'için basitlik için CodeIgniter'ı kullanmayı planlıyorsanız ve ben bir çerçeve ya da veritabanında değişiklikler geçmişini tutmak için aynı Approche kullanmak bir opensource proje hakkında fikir arıyorum.

6 Cevap

(Özel ihtiyaçlarına bağlı olarak) en kolay çözüm muhtemelen masanıza bir güncelleme / talimatında / silmek tetikleyici eklemek olacaktır, bu yüzden veriler silinir / / güncellendi takıldığında ekstra günlüğünü gerçekleştirebilirsiniz. Bu şekilde db bile manuel müdahaleler ele alınacaktır ...

http://dev.mysql.com/doc/refman/5.1/en/triggers.html daha fazla bilgi için kontrol edin.

Versiyon geçmişini tutmak için basit bir yolu temelde (_version eki ile örn.) özdeş bir tablo oluşturmak. Tablolar hem de ana tablo için yapmanız her güncelleme için artırmak sürüm alanını olurdu. Sürüm tablo (id, version) bir bileşik birincil anahtar olurdu.

Eğer gerçek tablo üzerinde bir güncelleme yaptığınızda, aynı zamanda yinelenen veri ile sürüm tablosunda yeni bir satır INSERT. Eğer sürüm geçmişi bulmak istediğinizde, yapmanız gereken tüm bu SELECT * FROM content_version WHERE id = CONTENT_ID ORDER BY version gibi bir şeydir.

Eğer Doktrin ORM gibi bir şey kullanırsanız, olay dinleyicilerine aracılığıyla otomatik olarak sizin için yapar bir davranış vardır. Bunu buradan kontrol edebilirsiniz: http://www.doctrine-project.org/documentation/manual/1_2/en/behaviors#core-behaviors:versionable

CRM ve veritabanı odaklı web uygulamaları ERP tür oluşturmak için bir açık kaynak (MIT lisansı) çerçeve yoktur. http://sourceforge.net/projects/epesi/: Sen EPESI http://epe.si/ de mevcuttur SourceFroge üzerinde indirebilirsiniz

EPESI's CRUD motor - Record Browser - çok verimli bir rekor tarihinin yanı sıra (bir saha seviyesine kadar) gelişmiş izin sistemi gibi ve daha başka özelliklere sahiptir.

Tek bir kayıt depolar 10 gibi tablolar veri ve agnostik veritabanı (PHPAdoDB kullanır). recordset_edit_history ve recordset_edit_history_data: değişikliklerin recordset_data mağazalar "ham" Veri ve tarih denilen bir tablo 2 ek tablolarda saklanır.

Record edit_history, aşağıdaki yapıya sahiptir:

  • ID (Bu tablo için birincil anahtar, indeks)
  • (: 2008-05-14 15:18:15 timestamp) düzenlenemez
  • Tarafından düzenlenmiştir: (kullanıcı kimliği)

Record edit_history_data, aşağıdaki yapıya sahiptir:

  • düzenleme tarihinin edit_id = ID
  • Alan = değiştirildi alanın adı
  • değişti alanın önceki_değeri = değer.

Bu çok hızlı ve verimli bir motor ve kayıt üzerinde ancak tek bir alan seviyesinde değişiklik değil saklar.

Eğer uygulama ve db arasında ekstra katman kullanmak zorunda. (Yerine direkt arama mysql_query bunu sarar ve güncellemeleri parça sizin tarafınızdan yapılan bir işlevini çağırdığınızda) kendi üzerinde çok basit yapmak, ya da varolan bazı ORM kullanabilirsiniz. Yalancı-kodda

my_mysql_query($query){
    if($query is an update){
        //Log stuff before query
    }
    $r = mysql_query($query);

    if ($r && $query is an update){
        //Log stuff after query
    }
    return $r;
}

And then in your application you call my_mysql_query instead of mysql_query. You can check if the table is the one you want to track and you can copy the row in a copy of the original table.

Eğer kullanırsanız Doctrine ORM, kullanabilirsiniz onun Event Listeners istediğini elde etmek.

Eğer doğru anlamak, belirli bir tabloda sadece bir "dizi" tasarruf ediyoruz, ve bu sayının revizyon geçmişini istiyorsun?

Ben söyleyebilirim: o sayının bir tarihini içeren böylece datamodel yazın. Yani bu sayının son değeri kaydetmek aynı zamanda herhangi bir önceki değerleri tutmak değil.

Bunu yapmanın basit bir yolu aşağıdaki alanları bir tablo olması gereğkimlikir:

  • kimlik
  • şirket kimliği
  • numara
  • damgası

Eğer mevcut numarasını bilmek istiyorsanız, sadece do

SELECT * FROM table WHERE şirket kimliği = X ORDER BY damgası DESC LIMIT 1

Eğer görmek istiyorsan, tüm revizyonlar sadece bunu:

SELECT * FROM table WHERE şirket kimliği = X

Bu gerçek SQL güncelleştirmeleri oturum değildir. Bu veri güncellemeleri oturum açıyor. Bu etki sayfanın her revizyon depolama ve sadece varsayılan olarak son bir sağlayacaktır. Bunun için kullanılan SQL kodu, kayıtlı değildi.

Böylece benzer bir yaklaşım almak zorunda olacak. Her zaman veri değişiklikleri, veri nasıl değiştiğini çalışmak ve bu 'yama' veri depolamak gerekir. Muhtemelen en iyi bu almak için tüm yamalar ile çalışmak zorunda ziyade, son sürümünü saklamak olacak. Bu gibi bir şey görmek mümkün olacak demektir

! created file
* added data to cell D4 'product descript' D5 'set of pens' E5 '£5.99'
* added data to cell D6 'toaster' E5 '£10'
& changed data in cell D4 'Product Description'

Bu değişikliklerin her zaman damgası veya ne zaman biter nerede ile saklanır gerekir. Ayrıca veri değişiklikleri depolamak için kendi scheeme çalışmak gerekir.

Başka basit bir çözüm, bir web sayfasında çalışmaya istekli iseniz, istediğiniz tüm işlevselliği sağlayan bir wiki motoru kullanmak olacaktır. Bunu insanlar çiğ wiki ziyade, daha tamamlanmış bir görünüm onu ​​düzenlemek icar, ihtiyaçlarınız için daha iyi çalışmasını sağlamak için biraz zaman harcamanız gerekebilir.