Datensätze nach Monaten ausgeben?

filament

Erfahrenes Mitglied
Hallo liebe Community,

ich habe vor einen kostenlosen Webservice zu programmieren, bei dem ein registrierter Benutzer Datensätze selbst eingeben kann. Aufgrund des Themas das ich vor Veröffentlichung nicht nennen möchte, kann es sein, dass ein User am Tag durchaus mal bis zu 20 / 30 Einträge produziert. Auf ein Jahr gerechnet kann es also pro User schon mal einige Tausend Datensätze geben. Kann das aus Performancesicht Schwierigkeiten ergeben?

Die Datenbank besteht aus 2 Tabellen:

users (id, name, passwort, email, premium)
datensatz (id, userid, ausgabe, zeit)

Über die UserID stehen die Tabellen in Zusammenhang. Größtenteils bestehen die Daten aus reinen Zahlen, es soll jedoch auch für Premium User ein Bemerkungen Feld hinzu kommenn.

Nun die Frage wie frage ich die Datensätze zeitlich in monaten Zusammengefasst ab? Dazu muss die SUM Funktion zum Summieren der Daten genutzt werden, da die Spalten addiert ausgegeben werden bis dato?

Sollte ich die Abfragen vielleicht auf ein Jahr beschränken und ältere Daten einfach via Cronjob löschen? Oder ist das kein Unterschied (Von der Performance) ob ich nun 1 Jahr abfrage oder gar 5 Jahre? (Zur Erinnnerung: Es gibt eine Datenbankabfrage, die wirklich ALLE Daten des Users summieren soll!)

Kann ich irgendwie den Code verbessern um die Leistung steigern zu können?

Zur Eingabe der Datensätze hätte ich auch noch eine Frage. Die User sollen das Datum mit angeben können. Ist es hier sinnvoller ein Textfeld anzugeben oder Drop-Downs mit Vorgaben? Wenn Textfeld, wie gehe ich sicher, dass dort auch wirklich nur Zeitformate eingegeben werden und wie wandel ich diese so um, dass ich ein timestamp herausbekomme, den ich ja integer in "zeit" erfasse. (Mktime als Funktion ist mir bekannt und auch die Umwandlung dieser wieder mit date("d.m.Y") etc..)

Danke euch schon mal im Voraus.

P.S: Wurden hier Userdaten älterer User gelöscht? Ich hatte mal einen Account vor Jahren, der aber irgendwie verschwunden ist :(
 
Also, die Tabellenstruktur sieht soweit in Ordnung aus, hier kann man ja auch nicht so viel falsch machen ;)

Ein User, lassen wir es mal 10.000 Einträge pro Jahr sein, macht auf 5 Jahre 50.000. Das ist für ein Query zu schaffen, wichtig ist natürlich dass der Server hier mitspielt. Ein Webhosting könnte bei Operationen in diesem Bereich, je nach Qualität, in die Knie gehen. Indexe richtig setzen.

Ein Code kann meistens verbessert werden, aber wir sehen ihn nicht, also kann man hier auch nichts sagen.

Da du hoffentlich mit PHP 5.3 arbeitest, oder wenigstens PHP 5+, könntest du auch mit [phpf]strtotime[/phpf] arbeiten.
Drop Downs vereinfachen das Eingeben des Datums, verlangsamen aber den Prozess für erfahrenere Benutzer, ich würde das von der Klientel abhängig machen. Musst natürlich grundsätzlich die Daten verifizieren, ob sie ein "echtes" Datum darstellen... Ob die Werte realistisch sind, kannst nur du entscheiden.

Und nein, eigentlich werden hier extrem selten Accounts gelöscht... Höchstens wenn mal beantragt wird, dass ein Name geändert wird und der alte Besitzer ist bereits X Jahre inaktiv gewesen...
 
Also, die Datensätze sind nicht das Problem, können auch mehrere Millionen sein, ich glaube eine Tabelle darf bei MySQL nicht größer als 4GB werden. Eine Abfrage nach Monaten oder Jahren ist irrelevant, es ist prinzipiell das Gleiche. Um die Performance zu steigern empfehle ich Indizes zu setzen.

Die Eingabe vom User kannst du bei einem Textfeld mit regulären Ausdrücken überprüfen, das erspart oft unzählige "IF-Anweisungen". Aber mit Drag&Drop kannst du sicher sein, das der User keine SQL-Injection versucht.
 
Danke für deine Antwort :)

Zum Code kann ich noch nicht viel sagen. Ich wollte mich mal vorab informieren, bevor ich groß plane. Zumal ich gerade erst das nötigste programmiere. (Layout, Userregistration, Passwort vergessen Funktion, Login, Navigationsstruktur und paar SEO Eigenschaften)

Zum Formular hab ich mir schon Gedanken gemacht. Ich werde das via regulärem Ausdruck und preg_match überprüfen, sodass die Eingaben vom User vor Speicherung überprüft werden.

Zur Verbesserung der Datenbankabfragen, hab ich heute gelesen, dass man die Übertragung von MySQL via delay verzögern kann. Ist sowas zum empfehlen? Wenn ja in welchen Situationen? Was muss ich dabei beachten? Gibts da Tutorials in Deutsch zu?

Zu den Monaten selbst: Deine Antwort sagt mir leider nicht das was ich wissen wollte.

Ist es denn möglich zu errechnen welcher Zeitpunkt der letzte war in dem ich SELECT ORDER by date ASC LIMIT 0,1 mache und von dort aus zu time() die Monate berechne, um dann alle Monate auflisten zu können. (Damit der User jeden Monat explizit aufgeschlüsselt angezeigt bekommt)? Wenn ja wie realisier ichs am besten?

Mit freundlichen Grüßen
Ronny
 
Also, die Datensätze sind nicht das Problem, können auch mehrere Millionen sein, ich glaube eine Tabelle darf bei MySQL nicht größer als 4GB werden. Eine Abfrage nach Monaten oder Jahren ist irrelevant, es ist prinzipiell das Gleiche. Um die Performance zu steigern empfehle ich Indizes zu setzen.
Indizes? Wie wäre es denn in meinem Fall? Welche Indizes machen Sinn? Was genau ist Indizes und wie verwende ich es? 4 GB? Wieviele Datensätze kann ich denn etwa mit 4 GB in meinem einfachen Schema speichern? Wenn die 4 GB voll sind, kann ich meine Datenbank dann einfach um eine weitere Datenbank erweitern? Wenn ja wie integriere ich diese bzw. erweitere meine Page um die weitere Datenbank****? (Bedstimmte alte Werte sollen ja generell gelöscht werden, ich denke 2 Jahre Daten sollten reichen; Vielleicht kann ich User den Servern zuweisen bei der Registrierung oder so?)
 
Indizes:
Um zu überprüfen, welche Spalte sich als Index anbietet empfehlt es sich vor der Abfrage EXPLAIN zu schreiben und das Ergebnis zu betrachten. Erklärt wird alles in der Referenz von MySQL: hier

Datenbankgröße:
MySQL Version 3.22 hatte eine Begrenzung auf 4 Gbyte bei der Tabellengröße. Mit der Speicher-Engine MyISAM in MySQL Version 3.23 wurde die maximale Tabellengröße auf 65.536 Terabyte (2567 – 1 Byte) erhöht. Das bedeutet, dass die maximale effektive Tabellengröße von MySQL-Datenbanken normalerweise durch Beschränkungen des Betriebssystems hinsichtlich Dateigrößen festgelegt ist, nicht durch MySQL-interne Grenzen
Also keine Angst, war ein Irrtum von mir :-)

SQL-Abfragen:
Die Abfragen nach Monaten ist kein Problem, solange du die Zeitangaben als Date,timestamp oder Ähnliches speicherst und nicht als String im deutschen Format (hat man alles schon erlebt :eek:)

Sage uns, was du genau abfragen möchtest, dann unterstützen wir dich gern bei der Abfrage, wenn es dir im Moment noch nicht klar ist.
 
Zurück