Ne CodeIgniter'ı kullanarak bir veritabanı içinde Değişiklikleri oturum için uygun bir yol olacaktır

5 Cevap php

Benim küçük CodeIgniter uygulama için basit bir denetim sistemi oluşturmak istiyorum. Giriş düzenlendi önce bir tablo girişinin bir anlık alacağını böyle. Düşünebildiğim tek yönlü haber tablodaki tüm sütunları çoğaltmak olacak bir news_audit tablo oluşturmak olacaktır. Ayrıca eklenen tarih eklenen sütunu ile her değişiklik için yeni bir rekor yaratacak. Görüşleriniz, ve bir PHP web uygulaması içine böyle bir işlevselliğe bina görüşleri nelerdir?

5 Cevap

Kullanmak için hangi çözüm karar vermeden önce dikkate almanız gereken birkaç şey vardır:

Tablo büyük (ya da büyük hale gelebilir) ise sizin denetim izi açıkladığınız veya performans yaşayacaktır olarak ayrı tabloda olması gerekiyor.

Bir (potansiyel olarak) sadece uygulama için INSERT izinleri olması gerekir yenisini eklemek dışında değiştirilemez denetim (ve demir adanmış bir günlük sunucusunda olması gerekiyor döküm olması ...) gerekirse

Ben (bu tarih olmadan eskilerini süzmek için hiçbir farkına gerekebilir) başka bir geliştirici için kafa karıştırıcı olabilir gibi aynı tabloda denetim kayıtlarını oluşturma önleyeceğini ve önbellek db zorlar, hangi denetim satır ile tablo karmakarışık olacak o (== performans maliyet) için gereken daha fazla disk blokları. Db dizin Nulls yapmazsa da dizin bu düzgün bir sorun olabilir. Hepsini damga zaman isterseniz en son sürümü için sorgulama bir alt sorgu içerecektir.

Bu çözmek için temiz yolu, veritabanı bunu destekliyorsa, bu sadece INSERT izinleri ihtiyacı ayrı bir denetim tabloya kopyalar eski değerleri) haber tabloya bir UPDATE TRIGGER oluşturmaktır. Bu şekilde mantık veritabanına içine yerleştirilmiş ve böylece uygulamalar onunla ilgili olması gerekmez, sadece bilgilerinizi güncelleyin ve db değişiklik günlüğünü tutmak ilgilenir. Tetik beden sadece bir INSERT deyim olacak, bu yüzden önce bir yazılı değil varsa bunu yapmak için uzun sürmemelidir.

Ben db olduğunu biliyordum eğer ben bir örnek göndermek mümkün olabilir kullanıyor ...

Yapmamız (ve boyut ve kullanımına bağlı olarak önceden arşivleme kurmak isterim), ama biz kullanıcı bilgilerini, zaman ve tablo adı ile XML sonra değişiklikleri saklayan bir denetim tablo oluşturdu.

Eğer SQL2005 vardır + gerekirse daha sonra kolayca değişiklikler için XML arayabilirsiniz eğer.

Biz o (..., siler, güncellemeler ekler) biz denetlemek istediğini yakalamak için masamıza tetikler eklendi

Sonra basit serileştirme ile biz değişiklikleri geri ve çoğaltmak mümkün.

Ne ölçekli Burada bakıyoruz? Ortalama olarak, girdileri sık ya da seyrek düzenlenmiş olacak?

Eğer ortalama öğe için beklemek ne kadar birçok düzenlemeler bağlı olarak, verilerin tam bir kopyası karşı büyük veri bloklarının diff'in depolamak için daha mantıklı olabilir.

Sevdiğim bir yolu tablonun kendisi içine koymaktır. Sen sadece bir 'valid_until' sütununu eklemek istiyorum. Eğer "edit" bir satır, sadece bir kopyasını yapmak ve eski satırda 'valid_until' alanını damga zaman. Geçerli satırlar 'valid_until' set vermeden olanlardır. Kısacası, bunun üzerine kopyalama-yazma yapmak. Birincil anahtarları özgün birincil anahtar ve valid_until alan bir kombinasyon yapmak unutmayın. Ayrıca her kimlik için sette valid_until bulunuyor bulunmamış, sadece bir satır olabilir emin olmak için kısıtlamaları veya tetikler kurmak.

Bu üstünlükleri ve olumsuz yanları vardır. Baş az masaları. Dezavantajı Tablolarınızdaki çok fazla satır olduğunu. Sık sık eski verilere erişmek için gerekiyorsa ben bu yapıyı tavsiye ederim. Sadece sorguları basit bir WHERE ekleyerek bir önceki tarih / zaman bir tablonun durumunu sorgulayabilirsiniz.

Sadece zaman zaman sizin eski verilere erişmek için gerekiyorsa o zaman ben bu olsa tavsiye etmem.

Bir Temportal database kurarak tüm yol aşırı Bu alabilir.

Küçük orta ölçekli proje için ben kurallar kümesi şu kullanın:

  1. Tüm kod Revizyon Kontrol Sistemi (yani Subversion) altında saklanır
  2. Kaynak koduna SQL yamalar için bir dizin var (yani patches/)
  3. Bu dizindeki tüm dosyalar kısa bir açıklama (yani 086_added_login_unique_constraint.sql), ardından seri numarası ile başlayan
  4. DB şema tüm değişiklikler ayrı dosyalar olarak kayıt edilmelidir. Bu sürüm kontrol sistemine kontrol ediyor sonra hiçbir dosya değiştirilebilir. Tüm hata başka bir yama yayımlayarak sabit olmalıdır. Bu kurala yakından sopa önemlidir.
  5. Script Küçük yerel ortamda yürütülen son yama seri numarasını hatırlar ve gerektiğinde sonraki yamaları çalışır.

Bu şekilde size bütün veri dökümü ithal gerek kalmadan kolayca DB şema yeniden olduğunu garanti edemez. Böyle yamalar oluşturma hiçbir beyin olduğunu. Sadece konsol / UI / web Önyüzde komutunu çalıştırın ve eğer başarılı yama içine kopyalayıp yapıştırın. Sonra sadece değişiklikleri repo ve taahhüt ekleyin.

Bu yaklaşım oldukça iyi ölçekler. 1300 + sınıfları ve 200 + tablo / views oluşan PHP / PostgreSQL proje için çalıştı.