Forum: PC-Programmierung [MySQL] Struktur für Statistik


von Troll (Gast)


Lesenswert?

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?

von ... (Gast)


Lesenswert?

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?

von Troll (Gast)


Lesenswert?

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.

von ... (Gast)


Lesenswert?

Ne, Du brauchst nur 3.
tag|browser|count
Und dann "UPDATE browser_table SET count = count + 1 WHERE browser='...' 
AND tag = ..."

von ... (Gast)


Lesenswert?

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

von Troll (Gast)


Lesenswert?

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?

von ... (Gast)


Lesenswert?

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;

von Vlad T. (vlad_tepesch)


Lesenswert?

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

von ... (Gast)


Lesenswert?

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.

von Vlad T. (vlad_tepesch)


Lesenswert?

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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Vlad Tepesch schrieb:
> der titel des Threads lautet mysql

Trotzdem unterstützt MySQL nur mit InoDB FKs nicht mit MyISAM als 
Speicher-Engine!

von Vlad T. (vlad_tepesch)


Lesenswert?

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* 

von D. I. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.