• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Tabelle erstellen, die nur eine Zeile beinhalten darf

CGollhardt

Mitglied
Guten Tag,

gibt es eine Möglichkeit, dass eine Tabelle nur eine Zeile speichern darf? Bitte nicht google, mir fallen keine Begriffe dafür ein:evil:

Warum?

Ich möchte gerne eine Tabelle Statistiken anlegen, in der zb. Hits, Pageviews etc. gespeichert werden.

Ich weiß ich kann einmal einen Datensatz inserten, und dann immer nur mit Update in der Gesamten Tabelle arbeiten (wird das so gemacht?), aber auch wenn es niemals vorkommen würde, möchte ich die Tabelle vor einen zweiten Insert schützen.

Ich weiß nicht warum, vielleicht schlafe ich dann besser:razz:

Als Beispiel nehme ich jetzt mal folgende Tabelle:
Code:
CREATE TABLE `stats` (
   `hits` BIGINT,
   `visitors` INTEGER
)

Über Lösungsansätze würde ich mich freuen.
 
Wenn du die Visitors zusammenzählst (COUNT()) hast du dann nicht die "hits"?
Genau darum geht es mir. Ich könnte folgende Tabelle verwenden:

vistors
Code:
ipadresse|hits

:arrow:Alle Zeilen entsprechen dann den Besuchern
:arrow:Alle Hits zusammen entsprechen dann den gesammten Hits (Clicks)

Wenn ich mir aber vorstelle dass zb. 100 Besuchern am tag kommen, habe ich nach einem Jahr 36.500 Einträge, nach 10 Jahren wären dies schon 365.000. Wie gesagt bei nur gerade mal 100 Besuchern täglich.

Darum habe ich mir gedacht folgende Tabelle zu verwenden:
ipsperre
Code:
ipadresse|time
Und alle Einträge älter als 24 Stunden (IPv4 wird in der Regel nach dieser Zeit eh erneuert) dann zu löschen.

Zusätzlich gibts es dazu noch folgende Tabelle:
stats
Code:
views|hits
Sollte die Besucher IP noch nicht in ipsperre stehen, so wird views um eins hochgezählt. Hits wird bei jedem Aufruf um eins Hochgezählt.

Gibt es da ne bessere Speichersparende Möglichkeit? Wenn nicht, ist es möglich, dass nur ein Insert erlaubt wird (Also vom Tabellentyp irgendwie)
 
Verstehe dein Problem nicht.
Wenn du nur eine Zeile willst, dann mache einfach nur beim Start des Projekts ein INSERT und danach einfach nicht mehr.
Außerdem sind 365000 Einträge nichts ^^
Allein mein Browsergame hat bei der Installation in einer Tabelle 130000 Zeilen und bei der anderen 40401 und es kommt perfekt damit zurecht. Obwohl ich left joins und full joins benutze um die zu verlinken ^^
 
Schreib das ganze in einen Textdatei, geht um den Faktor 20- 50 schneller als eine einzelne Zeile in einer Datenbank
 
Schreib das ganze in einen Textdatei, geht um den Faktor 20- 50 schneller als eine einzelne Zeile in einer Datenbank
Geht das wirklich schneller? Wenn ja, würde ich es natürlich lieber so machen.

Ich dachte jedoch immer, dass Datenbankzugriffe wesentlich schneller erfolgen, als Zugriffe im Dateisystem.

Liegt es dann in diesem Fall daran, dass ich nur eine Zeile im Textfile habe, und nichts indexiert bzw. herausgesucht werden muss?

Würde ich dann einfach den Wert ins Dokument schreiben und dann mit read() auslesen? Wäre es auch noch schneller, wenn ich eine stats.xml anlege und dort zb. 4 werte speichere?

Hierbei geht es mir eigentlich nur um die Theorie, da die Unterschiede so klein ausfallen dürfte, dass ich es mit PHP nicht messen kann (da alleine das Script zwischen 0,019 und 0,05 Sekunden schwankt.
 
Auch ein Datenbank Zugriff ist ein Zugriff auf das Dateisystem. Merkbar wird ein Unterschied, wenn du ein paar 1000 oder mehr Daten lesen musst, dann werden Datenbanken um ein Vielfaches schneller sein. Das Öffnen, Lesen/Schreiben, Schliessen einer Datei geht meist schneller als eine Datenbankverbindung aufzubauen.

Läuft dein DB-Dienst aktiv im Hintergrund, merkst du bei kleinen Datenmengen keinen Unterschied zwischen DB oder File, schläft der Dienst und muss er erst "aufgeweckt" werden, ist alleine das connecten langsamer als der Lesezugriff auf die Datei. Auch die Übergabe des SQL-Statemants von PHP an den DB-Dienst dauert

Übrigens ist das für viele Anwender ein überraschendes Ergebnis. Kleine Dateien werden von PHP viel performanter behandelt als kleine DB-Abfragen. Falsch ist die Interpretation der Zeit für die DB-Abfrage im Vergleich zum Lesezugriff, da bei der DB-Abfrage meist nur die Zeit der DB-Arbeit selbst interpretiert wird. Das Connect selber dauert aber meist länger als die eigentliche DB-Auswertung.

Ich habe hier ein reines Filebased Forum mit gut 1.000.000 Posts, das genauso schnell wie ein SQL-Board oder manchmal sogar schneller ist als so manche Datenbankversion. Gillt aber nur solange, wie ich keine Suche starte oder aufräumen muss, dann wird es im Filebased-Board heftig, wo eine Datenbank nur lächelt. Gut indizierte Files können tolle Leistungen vollbringen, wo Datenbanken erst ab einer grossen Menge Ihre Vorteile ausspielen können.

Wer es mal ausprobiert, wird feststellen, dass man mit einem simplen file-Befehl einige tausend Zeilen in der selben Zeit lesen kann wie eine Datenbank mit einigen tausend Zeilen abfragen.
 
Wieder was dazugelernt. Danke für deine ausführliche Erklärung.

Die Datenbank wird bei meiner aktuellen "Anwendung" bei jedem Seitenaufruf bereits connect. Wenn die Verbindung im Script bereits besteht, wie sieht es da in der Geschwindigkeit aus? Würdest du es trotzdem über Textfiles machen?

Vielen dank
 
Bei kleinen Datenmengen sehe ich kaum Unterschiede, da wird es mehr eine Glaubensfrage als eine technische.
Ich persönlich mag Files, weil man damit auch arbeiten kann, wenn die DB mal hängt. Userrechte und Logins lege ich (natürlich je nach Anforderung) z.B. gerne auch in Files, damit man Admintätigkeiten eventuell auch ohne Datenbank erledigen kann.
 
Ich glaube du hast mich überzeugt^^

Ist ja auch irgendwie sinnlos, wenn man eine Datenbanktabelle für eine einzige Zeile verwendet. Werde es jetzt mit nem Textfile lösen.

Danke
 
Zurück
Oben