Eski veri almak için daha iyi bir yolu var mı?

8 Cevap php

Eğer böyle bir veritabanı var ki:

books
-----
id
name

Ve veritabanındaki kitapların toplam sayısını, mümkün olan en kolay sql almak istedim:

"select count(id) from books"

Ama şimdi kitaplar last month toplam sayısını almak istiyorum ...

Edit: but some of the books have been deleted from the table since last month

Eh tabii ki zaten geçmiş bir ay thats için toplam edemem - the "books" table is always current ve kayıtların bazıları zaten silindi

Benim yaklaşım ayın sonunda bir cron işi (veya zamanlanmış görev) çalıştırın ve report_data denilen başka bir tabloda, toplam saklamak için, ama bu aksak görünüyor. Daha iyi bir fikrin?

8 Cevap

Ekle default column bu değer GETDATE(), "EklenenTarih" diyoruz etti. Sonra orada o tarih dönemde vardı ya da sadece belirli bir tarihte (tüm yol tarihin içine) önce vardı kaç kitap bulmak için bir tarih belirleyebilirsiniz kaç kitap bulmak için herhangi iki tarih arasındaki sorgulayabilirsiniz.

Başına yorum: silemezsiniz gerekir, yapmanız gerekir soft delete.

Ben yumuşak bir mantıksal / silme silme yapmak, JP katılıyorum. Sorgu başına bir ekstra VE deyimi için bu çok daha kolay her şeyi yapar. Ayrıca, veri kaybetmezsiniz.

Aşırı boyutu, bir sorun olursa Verilen, sonra evet, potansiyel kaldırarak / fiziksel hareketli satır başlamak gerekir.

Benim yaklaşım ayın sonunda bir cron işi (veya zamanlanmış görev) çalıştırın ve report_data denilen başka bir tabloda, toplam saklamak için, ama bu aksak görünüyor.

Ben tarihsel verileri toplamak ve depolamak için bu yöntemi kullandık. Çünkü bir yumuşak silme çözüm daha basit oldu:

  • "Report_data" masa raporlar / grafikler oluşturmak çok kolay
  • Bir kitap silmek gereken bir şey için özel yumuşak silme kodu uygulamak zorunda değilsiniz
  • Sen eklemek zorunda "ve aktif = 1" kitapları tablodan seçer her sorgunun sonuna kadar yok

Tarihsel raporlama yapmak için kod kitapları kullanan her şeyden izole olduğundan, bu aslında daha az aksak çözüm oldu.

Eğer önceki ayın verilerini ihtiyaç varsa o zaman eski verileri sildiniz olmamalıdır. Bunun yerine bir "mantıksal silme." Olabilir

Ben masaya bir durum alan ve bazı tarihleri ​​eklersiniz.

books
_____
id
bookname
date_added
date_deleted
status (active/deleted)

Oradan sorgulamak mümkün olacaktır:

SELECT count(id) FROM books WHERE date_added <= '06/30/2009' AND status = 'active'

NOT: Bu şema iyi olmak benim değil, ama fikir olsun ... ;)

Tablo şemasını değişen çok fazla çalışması ise ben değişiklikleri izlemek istiyorum tetikler eklersiniz. Bu yaklaşım ile eklenen tarih gibi şeyler silinir, tarih vb her türlü izleyebilirsiniz

Sorun ve şema ve kodu değişen isteksizlik baktığımızda, ben her ayın sonunda kitap sayma ve başka bir tabloda ay sayısını saklamak senin fikrin ile gitmek size öneririm. Bunu yapmak için bir SP çağırmak için veritabanı zamanlayıcı kullanabilirsiniz.

Sadece geçmişi veritabanları veya veri ambarı yolda bir bebek adımı attık.

Bir veri ambarı genellikle şeyler sonra veri yerine güncel verileri supercede güncel verilerine eklenecektir böyle bir formatta olan yol hakkında verileri saklar. Veri ambarı hakkında bilgi edinmek için bir çok şey var. Eğer ciddi bir şekilde bu yolda gidiyoruz, ben Ralph Kimball veya Bill Inmon bir kitap önermek. Ben Kimball tercih ederim.

İşte web siteleri bulunuyor: http://www.ralphkimball.com/

http://www.inmoncif.com/home/

Öte yandan, bu topraklarına ilk adım atılması planlanan tek adım, ise, önerilen çözüm yeterince iyi.

Ne istediğinizi yapmak için tek yolu kitaplar masa "DATE_ADDED" için bir sütun eklemek için. Sonra bir sorgu gibi çalıştırabilir

select count(id) from books where date_added <= '06/30/2009';