Der Martin: Rangpunkte in DB eintragen oder bei Ausgabe berechnen?

Beitrag lesen

Hi,

Hallo,

ich habe eine Datenbank mit etwa 100 Zeilen (Benutzer) und etwa 50 Spalten (Werte/Punkte).

id  | benutzer | punkteA | punkteB | punkteC | ...
----+----------+---------+---------+---------+-----
1   | Hans     |     100 |     123 |       0 |
2   | Klaus    |      10 |      10 |     100 |
3   | Ute      |      15 |      20 |      50 |
...

Nun würde ich gerne für jeden Wert eine bestimmte Punktzahl (Rangpunkte) vergeben. Der "klassenbeste" einer Spalte soll 1.000 Punkte erhalten. und die weiteren Kandidaten dann jeweils einen relativen Wert ihrer Punktzahl zu der Gesamtpunktzahl.

Die Formel würde so aussehen:

Benutzerwert / Maximalwert * 1000

also ganz einfach ausgedrückt: Du willst alle Werte einer Spalte auf den Maximalwert der Spalte normieren.

Soll ich bereits beim Eintragen der Werte in die Datenbank die Rangpunkte berechnen oder lieber bei der Ausgabe die Rangpunkte live ermitteln?

Ich würde Rohwerte speichern, so wie du es bisher tust, und die Normierung bei der Abfrage machen. Den Maximalwert der Spalte findet die DB allein recht schnell.

Falls es die Tabelle wirklich mal so umfangreich wird, dass die Maxumum-Suche beim Auslesen ein Performance-Engpass wird, könntest du einen Pseudo-User hinzufügen, der beim Eintragen die Max-Punktzahlen jeder Spalte bekommt. Das wäre ein zusätzliches UPDATE-Statement. Dann muss die Suche nach dem Max-Wert nur noch beim Eintragen erfolgen, nicht mehr beim Abfragen, aber du bleibst trotzdem flexibel und kannst das Maximum nach Belieben auf 1.0, auf 100% oder auch auf 1000 abbilden.

So long,
 Martin

--
Der Professor sitzt beim Essen in der Mensa. Ein Student setzt sich ihm unaufgefordert gegenüber.
Professor: Seit wann essen denn Schwein und Adler an demselben Tisch?
Student:   Na gut, dann flieg' ich eben zum nächsten Tisch.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(