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.
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
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
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