Frage

Ich versuche, ein Punktesystem in meinem Programm zu erstellen ähnlichen Überlauf das heißt stapeln, wenn der Benutzer hat einige gute Tat (Aktivität) seine / ihre Punkte erhöht. Ich frage mich, was der beste Weg, um über die Umsetzung dieser in Bezug auf die Db-Schema + Logik zu gehen.

kann ich denke an drei Möglichkeiten:

  1. Fügen Sie ein zusätzliches Feld Punkte in der Benutzer-Tabelle genannt, und jedes Mal wenn ein Benutzer etwas tut, fügen Sie es in diesem Bereich (aber das wird eine Aktivität der Art zu zeigen, nicht in der Lage sein)
  2. Erstellen Sie eine Funktion, die jedes Mal der Benutzer tut gute Tat laufen und berechnet von Grund auf den Wert und aktualisiert die Punkte Feld
  3. Berechnen jedes Mal eine Funktion ohne Punkte Feld.

Was ist der beste Weg, um dies zu realisieren? Vielen Dank für Ihre Zeit.

War es hilfreich?

Lösung

Persönlich würde ich die zweite Option, um dieses Problem zu nähern.

Die erste Option Grenzen Funktionalität, so dass ich zu beseitigen, dass sofort.

Die dritte Option ist in Bezug auf Leistung ineffizient - ist es wahrscheinlich, dass Sie diese Zahl viel wird holen, und wenn Ihr Programm etwas wie Stackoverflow, vielleicht zeigt (Berechnung) die Zahl viele Male pro Seitenaufruf / Aktion.

Für mich ist die zweite Option ist eine anständige Hybrid-Lösung. Normalerweise I Hass in meinem System dupliziert Daten mit (Aktionen und Punkte, anstatt einem oder anderen), aber in diesem Fall ist ein Integer-Feld eine eher kleine Menge an Speicherplatz pro Nutzer, die Sie spart a Los der Zeit unnötig die Werte in neu berechnet wird.

Wir müssen in Zeiten, Handelsdatenspeicherplatz für die Leistung oder umgekehrt, und ich würde sagen, dass # 2 ist ein Kompromiss, der die Anwendung sehr zugute kommt.

Andere Tipps

Das hängt sehr stark von der Anzahl der erwarteten Berechnungen Sie konfrontiert werden. Tatsächlich verwendet SO offenbar eine Methode, die zu Ihrem 1) Ansatz ähnlich ist, aus Performance-Gründen nehme ich an.

Dies verhindert auch Sprünge in den Zahlen, wenn Faktoren (wie gelöschte Elemente ändern, die Punkte vergeben, oder hier auf SO Antworten, die Community Wiki werden, Änderungen in den Punktregeln, externe Aktionen wie ein anderes Konto hier auf SO usw. Beitritt )

Wenn eine recalc Lösung (2) ist, was Sie wollen, können Sie einen „intelligenten“ Caching implementieren, indem den Wert Clearing (Einstellung es die „schmutzige“ würde auf NULL bedeuten) jedes Mal, wenn ein Punkt Modifikation stattfinden kann, und wieder -computing es, wenn es NULL ist, sonst den Cache verwenden. Sie könnten auch (als selbstkorrigierende Maßnahme, wenn nicht explizit Dinge geschehen) klar aus den Werten nach einer Stunde, einem Tag oder was auch immer Sie Tannen denken, so dass ein recalc nach einer gewissen Zeit gezwungen wird, unabhängig von dem „schmutzigen“ Zustand .

ich für 1 gehen würde und 2 (laufen in cron auf jede Minute oder so).

So dass: - Extra-Feld würde als Cache in Höhe von Punkt handeln. -. Die Funktion, die Punkte calc könnte eine einzelne SQL-Abfrage, die die Punkte für alle Benutzer auf einmal neu berechnen würde eine Geschwindigkeit zu gewinnen

Ich denke, dass das Feld jedes Mal neu berechnet, wenn der Punkt empfangen wird, wäre zuviel des Guten sein.

Persönlich würde ich mit der ersten Option gehen, und fügen Sie eine „Aktionen“ -Tabelle den Überblick über Ihre Aktivität Geschichte zu halten.

Wenn ein Benutzer etwas Gutes tut, bekommen sie einen Eintrag in der „Actions“ Tabelle, mit der Aktion und einem gewissen Punkt Wert. Der Punktwert kann aus einer anderen Tabelle kommen, oder eine Konfigurationsdatei. Das gleiche Wert wird zu dem Benutzerdatensatz hinzugefügt.

Zu jedem Zeitpunkt können Sie die Aktionen zusammenzufassen und den Benutzer insgesamt, aber für die Leistung, einfach zu aktualisieren, wenn Sie die Aufzeichnung Aktion hinzufügen wäre einfach genug.

Wie einfach ist Ihr Punktesystem sein werde? Ich rechne damit, eine Art von Logging / Journaling ist gut, so dass Sie Aktivität auf einer täglichen / wöchentlichen / monatlichen Basis für alle Benutzer verfolgen können

Schauen Sie sich http://code.google.com/p/userinfuser/

Die Open Source und ermöglicht Ihnen Punkte und Abzeichen zu Ihrer Anwendung hinzuzufügen. Es hat Java, Python, PHP und Ruby-Bindungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top