Kullanıcı tarafından değiştirilebilir eski verileri koruyarak

3 Cevap php

Ben aşağıdaki alanları olan bir users tablo vardır: userid, phone, ve address. Bu kullanıcı veri olduğundan, o istediği zaman kullanıcı bunları değiştirmek izin veriyorum. Sorun ben bu değişiklikleri takip etmek ve çok eski verileri korumak istiyorum değildir. Burada dikkate bazı fikirleri bulunuyor:

  • eski veri, yeni veri ekleme ve bir boru gibi bir ayırıcı kullanılarak. Alanını alınırken, ben bu ayırıcı varlığını denetlemek ve varsa, yeni veri olarak ondan sonra karakter olsun. (Hantal hissediyor ve doğru gelmiyor)

  • Aşağıdaki alanları ile farklı bir changes tablo kurma: userid, fieldname, fieldcontent. Bir kullanıcı verilerini (herhangi bir veri) değiştirirse, ben kullanıcının kullanıcı kimliği altında bu ayrı bir tabloda olayı ve alanın adı / id ve alanın eski içerik log ne zaman /, o zaman ben şimdi onun eski verilerin üzerine yazabilir Yeni ile users in. Ben bu kullanıcı tarafından yapılan tüm değişiklikleri bulmak istiyorsanız, onun adınız tarafından changes masa aramak olacaktır. Bu sorun ile ben bir tabloya (tüm alanların) tüm veri değişiklikleri karıştırma değilim ve bu yüzden de fieldcontent alanı changes değişen alan türlerini barındırmak için metin olmak zorunda olmasıdır. Bu hala ben doğru olanı yapıyorum emin değilim eğer ilk fikir daha iyi görünüyor, ama.

Başka hangi fikirler var veya eski verileri tutmak için en iyi uygulamaları bilinen?

Şimdiden teşekkürler

3 Cevap

Ne olursa olsun ilk birini yapmıyoruz.

Değişiklikler tablo daha iyi bir yaklaşımdır. Aynı zamanda bir denetim veya geçmiş tablo denir. Ancak anahtar-değer çiftleri bir geçmişe yapmazdı. Bunun yerine ilgili masa başına bir geçmişi yok. Siz uygulama kodu veya veritabanı tetikler üzerinden yapabilirsiniz. Temelde bir ekleme, güncelleştirme veya silme, size ne olduğunu ve veri kaydını olur zaman değişti.

Tablo kullanıcı:

  • kimlik
  • kullanıcı adı
  • e-posta adresi
  • telefon
  • adres

Tablo user_history:

  • kimlik
  • change_type (ekleme, güncelleme veya silmek için I, U veya D)
  • user_kimlik (FK user.kimlik)
  • e-posta adresi
  • telefon
  • adres
  • değişim tarih / zaman
  • isteğe bağlı, aynı zamanda rekor değişti kim saklayabilir

Böyle değişiklikleri izlemek için kullanmış çok basit bir yolu şudur:

users_history` 
    userid 
    changenumber smallint not null
    changedate datetime not null
    changeaddr varchar(32) not null
    phone NULL,
    address NULL

    primary key on (userid, linenumber)

Eğer users tabloda bir kayıt ekleme veya güncelleme Her zaman, sadece users_history tablosunda yeni bir kayıt INSERT. changenumber oradan 1 ve artışlarla başlar. changedate ve changeaddr ne zaman ve nerede izlemek için kullanılabilir.

Bir alan değeri değişmedi ise, ilgili users_history tablo alanında NULL koymak için çekinmeyin.

Günün sonunda, app users tabloda hantal geçmiş verileri değiştirmek veya saklamak gerekmez, ancak sizin parmaklarınızın ucunda tüm bu eğer var.

Edit:

Bu eski verileri korumak yapar. Kullanıcı, verilen adres ve telefon ile başladı ve ardından 4 gün sonra adresi güncellenmiş ve 5 gün sonra telefon güncelleştirilmiş aşağıdaki örneğe bakın. You have everything.

Current users record:

100                            |  234-567-8901   |   123 Sesame Street


Sample History Table

100   |  1  | 2009-10-01 12:00 |  123-456-7890   |   555 Johnson Street
100   |  2  | 2009-10-05 13:00 |  NULL           |   123 Sesame Street
100   |  3  | 2009-10-10 15:00 |  234-567-8901   |   NULL

Bu uygulamak için basit yolu, sadece tarih amaç için bir anlık bir başka tablo var olacaktır. Sadece, tüm alanları ayna gerekmez

change_id // row id (just for easy management later on if you need to delete specific row, otherwise its not really necessary)
user_id // Original user id
change_time // time of change
data // serialized data before change.