Datenbank-Modell für Counter mit zeitlichem Verlauf

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Datenbank-Modell für Counter mit zeitlichem Verlauf

    Hallo,

    für eine Webseite benötigte ich ein neues Datenbank-Modell.
    Auf der Seite kann man sich registrieren und es wird ein Service angeboten.

    Zurzeit werden die Aufrufe der Widgets, die die Mitglieder auf ihrer Seite einbinden können
    mit einem einfachen Counter bei jedem Aufruf hochgezählt,
    sprich in der Tabelle "members" gibt es eine Spalte "counter" der immer um 1 hochgezählt wird.

    Nun möchte ich diesen Counter den Mitglieder auch zugänglich machen.
    Er soll allerdings auch einen zeitlichen Verlauf aufzeigen.
    So etwas in der Art:
    ipcounter.de/stats/dailychart/1

    Zur Zeit habe ca. 400 aktive Service-Nutzer.
    Alte, nicht mehr aktive Nutzer werden nach einer Weile gelöscht.
    Die jeweiligen Widgets werden pro Tag von einigen wenigen bis hin zu mehreren zehntausenden Besuchern aufgerufen.
    Insgesamt sind es pro Tag zur Zeit etwa 200k Aufrufe.

    Nun brauche ich ein Datenbank-Modell,
    dass performant sein sollte, den Server schonen bzw. keinen/kaum Overhead erzeugen soll.
    Es sollen die Aufrufe pro Widget pro Tag in einer MySQL-Datenbank gespeichert werden.
    Optional würde ich gerne noch den verwendeten Browser mitloggen.
    Wie soll ich das Datenbank-Modell am besten gestalten? Soll ich auf InnoDB oder MyISAM setzen?
    (Mit JOINs etc. kann ich umgehen, dass sollte kein Problem sein.)


    Über fachkundige und erfahrene Meinungen würde ich mich sehr freuen!
  • Hi,
    ich würde dir empfehlen einen OLAP Cube zu machen: [wikipedia]http://de.wikipedia.org/wiki/OLAP-W%C3%BCrfel[/wikipedia]

    Spalten: day(DATE),hour(TINYINT),userid(INT),impression(INT)
    Falls du Tagesstatistiken haben willst, dann lässt du hour + userid auf NULL.
    Falls du User Gesamtstatistiken willst, dann lässt du day + hour auf NULL
    uvm

    Für was willst du den Browser nutzen? Einfach die letzten 5 Browser des Benutzers anzeigen?
    Mit 2 Writes pro Sekunde sollte MySQL problemlos klar kommen, ansonsten nutzen wir bei plista für unser Live Statistik System eube Redis Datenbank: redis.io/
    Dort kannst du mit Hashs und hincrby arbeiten.
  • Hallo Torben,

    Torben Brodt schrieb:

    Spalten: day(DATE),hour(TINYINT),userid(INT),impression(INT)
    Falls du Tagesstatistiken haben willst, dann lässt du hour + userid auf NULL.
    Falls du User Gesamtstatistiken willst, dann lässt du day + hour auf NULL
    Danke für diese hilfreiche Idee.
    Ich denke ich setzte es nun folgendermaßen um:
    Eine Tabelle (mit Jahr und Monat im Namen) wird jeden Monat erzeugt,
    die fast genau diese Spalten (day, userID und impressions) enthält.
    Pro User (zur Zeit ca. 400) und pro Tag (1-28..31 -
    Gesamt also ca. 12,4k Einträge pro Tabelle) wird nun die jeweilige userID eingefügt
    und bei den anderen Spalten der Integer 0.
    Bei einer Impression wird der jeweilige Impressions-Integer hochgezählt.
    Ist das eine gute und empfehlenswerte Vorgehensweise?

    Redis würde ich eigentlich sogar gerne einsetzen,
    aber noch ein zusätzlicher Service der Ressourcen verbraucht
    kann ich mir zur Zeit nicht leisten, da der verbrauchte Arbeitsspeicher
    seit geraumer Zeit dauernd am Maximum streift.
    Zudem fehlt mir die Persistenz der Daten bei Redis
    falls der Server mal neu gestartet werden müsste.

    *PUSH*