Benutzerwertung in DBMS / Performance

Hallo,

ich muss für ein größeres Webprojekt (rails) eine Likes/Dislikes Funktion bereitstellen. Es gibt Dokumente und User, User dürfen jedes Dokument höchstens einmal positiv oder negativ bewerten.

Haut das hin wenn ich nun eine Table dafür erstelle mir jeweils einem Foreign Key für User und Dokument sowie ein bool für likes oder dislikes?

Ich hab bedenken, dass das einfach riesig wird und ich ja für jedes Dokument Aggregatfunktionen drüberlaufen lassen muss. Oder ist das unbegründet und mit entsprechendem Index performancetechnisch kein Problem?

Wird sich voraussichtlich um einige tausend User handeln (also insgesamt, nicht auf einmal ;) ), die dementsprechend rumklicken.

lg
 
sagen wir es mal so ... wenn du einen kleinen schritt von der normalisierung weg machst, ist dein performance problem keines mehr ...


aktuell hast du 2 entitäten, einmal user und einmal bewertbare dinge ...

wenn du nun eine relation dazwischen legst, die die bewertung beinhaltet, ist das problem rein formal gelößt ... nur möchtest du an der stelle den flaschenhals vermeiden, die relation jedesmal prüfen zu müssen um alle bewertungen für eine der beiden seiten zu suchen ... bei den meisten systemen, und da schätze ich mal gehört deines auch dazu, werden hier 2 indices reichen, die alle bewertungen einmal nach user, und einmal nach bewertbarem ding sortieren ... bislang noch keine verletzung der normalform, da ein index zwar redundanz bringt, diese aber nicht bis ins modell reicht ...

sollte das aus performance gründen nicht hin hauen, weil du befürchtest, dass ein bestimmtes aggregat, beispielsweise die summen aller positiven und negativen bewertungen für ein bewertbares ding, sehr häufig abgerufen wird, kann man dies beispielsweise als redundante daten ins modell nehmen ... eine tabelle die die summe(n) + die jeweilige id beinhaltet, aus dem jeweils ohne großen aufwand die daten geholt werden können ... das bricht mit dem normalisierungs ansatz.
lohnt sich allerdings, wenn du deutlich mehr abrufe als bewertungen hast ...

den normalisierten teil speicherst du allerdings trotzdem ... über die indices kannst du sehr schnell feststellen, ob jemand schon bewertet hat ... und es ist möglich in regelmäßigen abständen zu verifizieren, ob die aggregierten werte noch stimmen, und diese ggf zu korrigieren...
 
sagen wir es mal so ... wenn du einen kleinen schritt von der normalisierung weg machst, ist dein performance problem keines mehr ...
Ah, vielen Dank für deine Ausführungen!

Ja, am Schritt weg machen hats gehappert - das ich da einfach noch eine neue Table anlege um dem Summen ausrechnen zu entgehen, da bin ich ned draufgekommen ;)

Danke nochmal..
 
Zurück
Oben