2010-11-27 15 views
1

Ich arbeite gerade an einer kleinen App, bei der Benutzer Punkte sammeln, indem sie Aufgaben erledigen. Was ich gerne hätte, wäre ein Ratschlag, wie ich meine Datenbanktabellen am besten gestalten könnte. In gewisser Hinsicht ist das System ähnlich wie SO, Benutzer Aufgaben (auf SO Ihre Antwort Fragen) und dann ihren Punkt ein Kontostand wird aktualisiert.Die beste Methode zum Speichern von Benutzerpunkten in der Datenbank

Ich habe derzeit eine Tabelle Benutzer, die die üblichen Benutzerinformationen speichert, aber nicht wissen, wie man es weiterbringt.

Bin ich am besten, um eine Punkte-Tabelle zu haben (Benutzer hat viele Punkte) und fügen Sie dann user_id und Punkte Betrag hinzu; Wenn Sie dann Benutzerpunkte abfragen, ziehen Sie alle Punkte mit einer gegebenen user_id heraus und summieren sie?

Gibt es eine effizientere Möglichkeit, dies zu tun?

Danke,

Jack

Antwort

1

Die Extra-Punkte-Tabelle ist ein fairer Ansatz, da sie die Gründe für die verdienten Punkte verfolgen kann. Abhängig von der Anzahl der Benutzer, Punkttransaktionen und dem verwendeten Server würde ich erwägen, ein paar häufig benötigte Aggregate zu halten: Meistens haben die Benutzer insgesamt Punkte.

Um neue Punktdatensätze in die Punktentabelle einzufügen, können Sie eine gespeicherte Prozedur verwenden, die nicht nur die Punkte in der Punktentabelle aufzeichnet, sondern auch das Punkteaggregat für jeden Benutzer erhöht. Dieses Aggregat könnte in einer separaten Spalte in der Benutzertabelle enthalten sein (wie von Oded vorgeschlagen).

Wenn Ihr Entwurf Fortschritte macht, könnten neue nützliche Aggregate erscheinen, die vorberechnet werden könnten.

Aber um die Sache einfach zu halten: Verwenden Sie diese Aggregate nur, wenn dies absolut notwendig ist, da zum Beispiel die Berechnung der Gesamtpunkte eines Benutzers zu lange dauert. Für ein kleines System sollte dies eigentlich kein Problem sein, um diese Summen im laufenden Betrieb zu berechnen.

1

Wenn points hat keine Bedeutung, ohne einen Benutzer und eine Eins-zu-Eins-Beziehung mit ihm, würde ich das Feld direkt auf dem user Tisch.

Wenn aufnehmen Sie verschiedene Arten von Punkten pro Benutzer, würde ich jedoch erstellen points_type Lookup und eine points die user und points_type ids verkeilte Tabelle.

+0

Danke für die Antwort- Ich beabsichtige, einen neuen Eintrag jedes Mal zu verwenden, wenn ein Benutzer Punkte in der Punktentabelle erhält. Daher wäre es eine Eins-zu-Viele-Beziehung. Ich denke, es wäre klug, eine Kombination dieser beiden Ansätze zu haben, wobei ein Aggregat in der Benutzertabelle gespeichert wird. – Jack

3

Wenn Sie nur mit der Gesamtpunktzahl befasst sind, fügen Sie das Feld, wie von Oded vorgeschlagen, direkt in die Tabelle User ein. Wenn Sie jedoch wissen möchten, wie diese Punkte erworben wurden, können Sie möglicherweise eine Tabelle für Punkttransaktionen erstellen. Diese Transaktionstabelle kann dann einen Fremdschlüssel für das user_id Feld der Tabelle und verschiedene Felder wie Action, Points, Date haben.

Bin ich am besten einen Punktetabelle haben (Benutzer hat viele Punkte)

Warum sollte ein Nutzer viele Punkte haben? Wie in, Punkte mit verschiedenen Kategorien verbunden? Wie Oded auch schon gesagt hat, hängt dies von der Bedeutung dieser Punkte ab und welche Art von Information man über sie wissen will (auch in Bezug auf die Nutzer, die sie erworben oder beeinflusst haben, dh eine Antwort abstimmen reduziert den Posten von Benutzerpunkten).

Verwandte Themen