[MySQL] Struktur für Statistik

Gast #2136349
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?
Gast
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?
Gast
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.
Gast
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?
Gast
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
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* 

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.