Bu bir denetim izi oluşturmak için iyi bir yaklaşım mı?

6 Cevap php

Ben belirli bir kullanıcı bir biçimde veri o sayfanın dibinde tarihli denetim ile, zamanla nasıl değiştiği bir denetim izi tutan bazı işlevler oluşturmak için çalışıyorum. Örneğin:

"Chris" için "Tom" olarak değiştirildi 02/04/09 21:49 adı.

Ben depolanan verilerde herhangi bir fark olup olmadığını kontrol kaydedin daha sonra oturumda mevcut biçimidir ve veri depolama ile yapıyorum. Varsa, bunu tarih denilen bir tabloda son düzenlemeden önce nasıl veri depolama ve geçerli kullanıcı tabloda yeni değerleri saklamak ediyorum.

Bu alan için iyi bir yaklaşım mı?

6 Cevap

Bir öneri; Bu veritabanı tetikleyici yapmak nispeten kolay olurdu. Bu durumda, güncelleştirmeyi çalışan kod bir geçmiş kaydı eklemek için hatırlar konusunda endişelenmenize gerek asla.

Ben bir "en iyi yaklaşım" olduğundan emin değilim, ne kadar sen kalkınma yolda dahil olmak üzere dikkate almak için pek çok değişken vardır.

Bazı yorumlar hem kod tabanlı ve db-tetik denetim çözümleri aracılığıyla edilerek; Ben (gelişme açısından) şimdi nerede bu sorunları etkileyen görebilirsiniz umut:

  • (Eğer normalde) verileri değiştiğinde Kullanıcıyı gerekiyorsa o db tetikleyiciler bir şekilde bu bilgiyi almak gerekir. Imkansız, ama daha değil çalışma ve bu yaklaşım için çeşitli yollar (her tabloda db kullanıcı yürütme sorgu, ortak kullanıcı sütun, vb)
  • Eğer db tetikler kullanmak ve sorgulardan dönen sayılır etkilenen satırların güveniyor, o zaman denetim, bu kapalı olması gerekir tetikler, ya da mevcut kod mantığı onları beklemek değiştirilmiş.
  • IMHO db tetikleyiciler daha fazla güvenlik sunuyor, ancak uygun erişimi olan herkes, tetikleyiciler devre dışı verileri değiştirmek ve tekrar etkinleştirebilirsiniz gibi onlar, kusursuz değildir. Diğer bir deyişle, db güvenlik erişim hakları sıkı olduğundan emin olun.
  • Bu denetim izi yeniden söz konusu olduğunda tarih boyunca tek bir tablo olması, birden çok tablo için geçmişi denetleyen eğer (mağaza ve veri) daha yapacak işlerimiz var rağmen, gitmek için kötü bir yol değildir. Siz aynı zamanda bir denetim tabloya yazmaya çalışırken birçok tablo varsa kilitleme sorunları göz önünde bulundurmanız gerekir.
  • Her tablo için bir denetim geçmişi tablo olan diğer bir seçenektir. Sadece null, yanı sıra eyleme (ekleme / güncelleme / silme) ve eylem ile ilişkili kullanıcı tarih ve saati depolamak olmak denetim tablodaki her sütun gerekir.
  • Eğer tek tablo seçeneği ile giderseniz bu harcamak çok zaman yoksa çoğu uygulamalar bunu çünkü ekler (kaçınmak için cazip olsa da, sadece güncellemeler veya siler üzerinde denetim çalışırken çok süslü alamadım daha sık güncelleştirmeleri veya silmeleri daha), denetim geçmişi yeniden çalışma adil biraz sürer.
  • Bu denetim tablolar büyük olsun, bu yüzden performansı etkileyen başlar eğer bir strateji olabilir. Seçenekleri bir sorun olduğunda temelde değil de şimdi bu konuda düşünmek vb farklı diskler, arşivleme, üzerine tablo bölümleme dahil :)

Ben her zaman bir tablo kullanılarak yerine "aktif" bir masa ve bir "tarih" bunu tabloya kesiliyor bir hayranı oldum. Oluşturulan, silinmiş, start, end: ben 4 bu tablolar üzerinde sütunları, tüm damgalarını koydu. "Yaratılmış" ve oldukça kendini açıklayıcı "silindi". "Start" ve kayıt aslında "aktif" rekor iken "end" damgaları içindir. Şu anda aktif kayıt öncesinde now() için bir "başlangıç" zaman ve NULL "end" zaman olurdu. Dışarı ayırarak "yaratılmış" ve süreleri "start", gelecekte gerçekleşecek değişiklikleri zamanlayabilirsiniz.

Bu tasarım, iki tablo tasarımı aksine, kolayca otomatik olarak doğru veri üzerinde çalışacağı sorguları yazmak için izin verir. Tablo zamanla vergi oranını saklamak varsayalım ... sizin için, eski faturaları işlerken bir geçmişi tabloda şeyler aramak için karar ekstra karmaşıklık var onların hesaplamalarda vergi oranları kullandığınız tüm sorguları olmasını istemiyorum örnek ... sadece olursa olsun cari vergi oranı ya da değil olsun, fatura tek sorguda oluşturulan anda yürürlükte olan vergi oranı bakabilirsiniz.

Bu fikir (Ben önceden bu konuda okuma benim kendi fikir yeniden icat rağmen) aslında benim değil ... bu bunun ayrıntılı bir tartışma bulabilirsiniz online book.

Oturum katılımı beni biraz ihtiyatlı (siz? Iki kullanıcı aynı anda aynı veriler üzerinde çalışırken düzgün idare ediyorsun emin), ama genel olarak, evet, bir geçmiş tablo tutmak doğru bir şey.

Ben de kayıt değişikliği ayrıntılar ekleme veya güncelleştirme üzerinde bir veritabanı tetikleyicisi düşünmek istiyorum (kim, ne zaman, ne değer önce, değer sonra) ayrı bir denetim tabloya. Eğer verileri doğrudan veritabanı kullanarak app outide değişse bile, yine de aldı olacağını biliyorum bu şekilde.

Ayrıca veriler, veri okurken kontrol sonra, kaydın bir karma veya hesaplamak crc ve arazide bir yere saklamak gibi app arasında outide değişmiş olup olmadığını tespit için bir şeyler yapmak isteyebilirsiniz.

Ben teklifi bir iş düzey denetim olsun nesneler / kayıtları karşılaştırma yapabilmek için kod / meta bir sürü yazı içerecektir düşünüyorum.

Alternatif olarak, bir veritabanı tetik size ne bir yeterince yüksek düzey görünüm vermeyebilir. Bunu seyrek iş anlamını yeniden yaratma çabası Tamam olduğunu denetimi kullanıyorsanız bu kabul edilebilir.

Eğer meta gerektirmeden çok anlamlı bir şey dökümü nesne modeli üzerinde yansıma kullanabilirsiniz Bu aynı zamanda, AOP için iyi bir uygulama (Yönleri) gibi görünüyor.