2009-07-16 13 views
1

Sagen Sie eine Datenbank wie diese haben:Gibt es eine bessere Möglichkeit, alte Daten zu erhalten?

books 
----- 
id 
name 

Und Sie wollten die Gesamtzahl der Bücher in der Datenbank bekommen, am einfachsten möglich sql:

"select count(id) from books" 

Aber jetzt wollen Sie bekommen die Gesamtzahl der Bücher letzten Monat ...

Edit: aber einige der Bücher wurden vom ta gelöscht ble seit dem letzten Monat

Nun offensichtlich Sie insgesamt für einen Monat, das ist schon vorbei kippe - die „Bücher“ Tabelle immer aktuell ist und einige der Aufzeichnungen bereits

Mein Ansatz gelöscht wurden war zu laufen Ein Cron-Job (oder geplante Aufgabe) am Ende des Monats und speichern Sie die Summe in einer anderen Tabelle namens report_data, aber das scheint klobig. Irgendwelche besseren Ideen?

+1

Sie können das Tabellenschema nicht so ändern, dass es eine Datumsspalte enthält. –

+0

Was meinst du mit der Gesamtzahl der Bücher im letzten Monat? Letzten Monat hinzugefügt? –

Antwort

3

betreiben ein default column hinzufügen, die den Wert hat GETDATE(), nennen es „DateAdded“. Dann können Sie zwischen zwei beliebigen Daten abfragen, um herauszufinden, wie viele Bücher es in diesem Zeitraum gab, oder Sie können einfach ein Datum angeben, um herauszufinden, wie viele Bücher vor einem bestimmten Datum vorhanden waren (bis in die Geschichte).

Pro Kommentar: Sie sollten nicht löschen, sollten Sie soft delete.

+0

sollte nicht löschen, sagst du? Wir nähern uns hier. Btw, ich lösche normalerweise, wenn es so einfach ist wie dieses – dittonamed

+3

Aber es ist nicht einfach jetzt b/c Sie versuchen, über den historischen Zustand Ihrer Datenbank zu berichten. :) Also, Ihre Anforderungen machen es so schwer löschen ist nicht die richtige Antwort. –

+0

wahr wahr. Ich habe das nie gemacht wegen der extra sql (wo is_deleted <> 1). Irgendwelche MySQL Abkürzungen oder Tricks draußen für die Behandlung dieses? – dittonamed

0

Die einzige Möglichkeit zu tun, was Sie wollen, ist eine Spalte in die Bücher Tabelle "date_added" hinzuzufügen. Dann könnten Sie eine Abfrage wie

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

Ich hätte erwähnen sollen, dass die Bücher aus der Tabelle gelöscht werden können. Es tut mir leid, einige von euch die falsche Spur zu senden – dittonamed

1

Ich stimme mit JP überein, mache ein weiches Löschen/logisches Löschen. Für die eine zusätzliche UND-Anweisung pro Abfrage macht es alles viel einfacher. Außerdem verlieren Sie nie Daten.

Zugegeben, wenn extreme Größe ein Problem wird, dann müssen Sie möglicherweise physisch bewegen/Zeilen entfernen.

1

Mein Ansatz war es, einen Cron-Job (oder geplante Aufgabe) am Ende des Monats und speichern Sie die Summe in einer anderen Tabelle namens report_data, aber das scheint klobig.

Ich habe diese Methode verwendet, um historische Daten zu sammeln und zu speichern. Es war einfacher als eine Soft-Lösch-Lösung, weil:

  • Die „report_data“ Tisch ist sehr einfach Berichte/Diagramme zu erzeugen, aus
  • Sie müssen keine speziellen implementieren Code für etwas weich löschen, muss löschen müssen, um ein Buch
  • Sie nicht hinzufügen „und aktiv = 1“ an das Ende jeder Abfrage, die die historische Berichterstattung zu tun ist, isoliert von allem

Da der Code aus der Tabelle auswählt Bücher sonst, die Bücher verwendet, war dies die weniger klobige Lösung.

+0

Ein negatives hier ist, dass Sie diese Daten nie wieder sehen können, wenn Sie sehen mussten, wie die Nummer generiert wurde – dittonamed

1

Wenn Sie Daten aus dem vorherigen Monat benötigten, sollten Sie die alten Daten nicht gelöscht haben. Stattdessen können Sie ein "logisches Löschen" haben.

Ich würde der Tabelle ein Statusfeld und einige Daten hinzufügen.

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

Von dort würden Sie abfragen können:

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

HINWEIS: Es ist nicht das beste Schema sein meine, aber Sie bekommen die Idee ...;)

1

Wenn der Wechsel Schema der Tabellen ist zu viel Arbeit Ich würde Auslöser hinzufügen, die die Änderungen verfolgen würden. Mit diesem Ansatz können Sie alle Arten von Dingen wie Datum hinzugefügt, Datum gelöscht usw. verfolgen

1

Mit Blick auf Ihr Problem und die Abneigung, das Schema und den Code zu ändern, würde ich vorschlagen, Sie mit Ihrer Idee des Zählens der Bücher gehen am Ende jedes Monats und Speichern der Zählung für den Monat in einer anderen Tabelle. Sie können den Datenbank-Scheduler verwenden, um einen SP dazu aufzurufen.

1

Sie haben gerade ein Baby den Weg der Geschichtsdatenbanken oder Data Warehousing genommen.

Ein Data Warehouse speichert normalerweise Daten darüber, wie die Dinge in einem Format waren, in dem spätere Daten den aktuellen Daten hinzugefügt werden, anstatt die aktuellen Daten zu ersetzen. Es gibt eine Menge über Data Warehousing zu lernen. Wenn Sie ernsthaft auf dieser Straße unterwegs sind, schlage ich ein Buch von Ralph Kimball oder Bill Inmon vor. Ich bevorzuge Kimball.

Hier ist die Webseiten: http://www.ralphkimball.com/

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

Wenn auf der anderen Seite, der erste Schritt in diesem Gebiet ist der einzige Schritt, den Sie nehmen möchten, Ihre vorgeschlagene Lösung gut genug ist.

Verwandte Themen