Hallo, ich bin gerade dabei für meine HP eine Statistik zu schreiben. Gespeichert werden soll (vorerst): Browser, Betriebssystem, Auflösung Das Problem dabei ist, wie ich die Tabelle(n) für die Daten erstellen soll. Die Daten werden Tageweise gespeichert und derzeit jeweils nur Ziffern hochgezählt. Bsp: Spalten | Daten Tag | 7.4.2011 Firefox | 1476 Opera | 563 Windows | 5321 Linux | 1234 ... Das ganze ist aber ziemlich unflexibel, z.B. wenn man einen Browser hinzufügen möchte. Allerdings lässt sich das leicht hochzählen: UPDATE tabelle SET $browser = $browser+1; Eine andere Möglichkeit wäre jeweils zum Tag alle Angaben zu speichern. Bsp: Spalten | Daten Tag | 7.4.2011 Browser | Firefox:1476; Opera: 563; ... Betriebssystem | Windows: 5321; Linux: 1234; ... Das erhöht aber die Menge an gespeicherten Daten ziemlich, da ja täglich alle besuchten Browser, Betriebssysteme, usw. gespeichert werden müssen. Außerdem müsste ich bei jedem Besucher alle Daten des Tages abfragen, zerlegen, den betreffenden Wert erhöhen, wieder zusammenbauen und aktualisieren. An jeweils extra Tabellen dachte ich auch schon, finde ich aber zu groß. Was wäre die beste Lösung, oder gibt es noch etwas sinnvolleres?
Naja, das Deine zweite Variante ziemlich daneben ist hast Du ja schon selbst erkannt. Was ist Dir denn an 3 Tabellen mit je 3 Spalten zu groß? Wieviele Jahre willst Du die Daten denn speichern?
Ich weiß noch nicht wie lange. Es werden ja nicht nur 3 Spalten pro Tabelle benötigt, sondern wären dann auch gleich mal 20 oder mehr. Siehe z.B: http://de.wikipedia.org/wiki/Liste_von_Webbrowsern Firefox, Opera, IE, Chrome, Konqueror, i* (Apple), Safari,... Bisher nur ganz grob und schon 7 Spalten für Betriebssysteme wirds nicht besser. Das Problem mit extra Tabellen auch, wenn ich die Statistik vielleicht mal erweitern will.
Ne, Du brauchst nur 3. tag|browser|count Und dann "UPDATE browser_table SET count = count + 1 WHERE browser='...' AND tag = ..."
... achso, Du mußt natürlich aufpassen, ob der Browser an dem Tag überhaupt schon mal vorkam. Btw. was verwendest Du für eine DB?
MyISAM Bisher wird einfach beim ersten Besucher am Tag ein neuer Datensatz mit lauter 0 angelegt, also das hochzählen ist kein Problem. Ich versteh das mit den 3 jetzt nicht ganz. Tag | Browser | Zähler 7.4. | Firefox | 142 Aber wie muss ich das dann für andere Browser und Tage erweitern? Tag und Browser gleichzeitig geht ja nicht, oder denk ich da gerade falsch?
Troll schrieb: > MyISAM Also MySQL? Troll schrieb: > Aber wie muss ich das dann für andere Browser und Tage erweitern? Tag > und Browser gleichzeitig geht ja nicht, oder denk ich da gerade falsch? Scheinbar, warum sollte Tag und Browser nicht gleichzeitig gehen? Tag | Browser | Zähler ----------------------- 7.4. | Firefox | 142 7.4. | IE8 | 123 7.4. | IE9 | 1 7.4. | OPERA | 321 6.4. | Firefox | 5 6.4. | IE8 | 7 6.4. | IE9 | 2 6.4. | OPERA | 4 usw. SQL sähe etwa so aus (aus dem Kopf und ungetestet)
1 | CREATE TABLE browser_stats ( |
2 | tag date not null, |
3 | browser varchar(255) not null, |
4 | counter bigint unsigned not null, |
5 | PRIMARY KEY (tag, browser) |
6 | ); |
7 | |
8 | INSERT INTO browser_stats SET tag=now(),browser='Firefox',counter=1 |
9 | ON DUPLICATE KEY UPDATE counter=counter+1; |
10 | |
11 | INSERT INTO browser_stats SET tag=now(),browser='IE8',counter=1 |
12 | ON DUPLICATE KEY UPDATE counter=counter+1; |
13 | |
14 | INSERT INTO browser_stats SET tag=now(),browser='IE9',counter=1 |
15 | ON DUPLICATE KEY UPDATE counter=counter+1; |
Normalisierung! eine Tabelle für Browser eine für Betriebsysteme und eine für die Zähler CREATE TABLE browser( id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHER NOT NULL ); CREATE TABLE OS( id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHER NOT NULL ); CREATE TABLE stats( id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, tag DATE NOT NULL, browser_pk INTEGER REFERENCES browser(name) NOT NULL, os_pk INTEGER REFERENCES browser(name) NOT NULL, counter bigint NOT NULL, ) edit: für mysql müssen glaub ich die Schlüsseldefinitionen umformuliert werden
Vlad Tepesch schrieb: > Normalisierung! Prinzipiell hast Du ja Recht, nur lohnt der Aufwand hier nicht wirklich. Außerdem: Troll schrieb: > MyISAM Also vergiss das mit Deinen foreign keys gleich wieder, die gibts da nicht.
... schrieb: > Außerdem: > Troll schrieb: >> MyISAM > > Also vergiss das mit Deinen foreign keys gleich wieder, die gibts da > nicht. der titel des Threads lautet mysql
Vlad Tepesch schrieb: > der titel des Threads lautet mysql Trotzdem unterstützt MySQL nur mit InoDB FKs nicht mit MyISAM als Speicher-Engine!
Läubi .. schrieb: > Vlad Tepesch schrieb: >> der titel des Threads lautet mysql > > Trotzdem unterstützt MySQL nur mit InoDB FKs nicht mit MyISAM als > Speicher-Engine! mit den verschiedenen DB-Engines da kenn ich mich nicht so gut aus. sollte auch kein trotz sein unabhängnig davon, werden die doch hoffentlich geparst. Da kann man wenigstens die Datendefinition vernünftig aufschreiben und sei es nur wegen dem dokumentativen Charakter, oder falls man doch mal auf eine vernünftige DB umzieht *g*
Läubi .. schrieb: > Vlad Tepesch schrieb: >> der titel des Threads lautet mysql > > Trotzdem unterstützt MySQL nur mit InoDB FKs nicht mit MyISAM als > Speicher-Engine! Nicht nur das, mit MyISAM kann man auch Transaktionen knicken, aber das scheint hier ja nicht von nöten. Ich greife dann normal auch zu InnoDB
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.