[php][mysql]Reactiesysteem met puntenwaardering

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Roa
  • Registratie: December 2002
  • Laatst online: 03-07-2024
Het is weer zover, ik zit eventjes vast. Ik zie ook zelf door de bomen het bos eventjes niet, ik heb het idee dat ik iets gigantisch over het hoofd zie.

Ik ben bezig met een soort reactiesysteem en nu leek het mij wel leuk als gebruikers elkaar kunnen beoordelen, in feite zoals ook met de reacties op Tweakers gebeurd. Het lukt me alleen niet hier een fatsoenlijk database-model bij te bedenken, vooral omdat ik het idee heb dat ik teveel vraag van m'n server als er veel gebruik van gemaakt wordt.

Daarom hoop ik ook dat Crisp (die volgens mij de hoofdscripter is van GoT en misschien ook wel van Tweakers?) wat uit de doeken zou kunnen doen over hoe het hier op de FP gedaan is, daar wordt er immers door 100den mensen per dag gebruik van gemaakt en dat zou me een goede indicatie moeten geven van wat ik kan verwachten.

Het idee zoals ik dat heb:

Tabellen:
reacties --> spreekt voor zich
users --> spreekt voor zich
reacties_punten:
  • user_id --> van de persoon die een waardering geeft
  • reactie_id
  • punten
user_punten:
  • user_id
  • punten
Overigens denk ik dat ik bij voorbaat de tabel 'user_punten' al schrap en een extra veld maak in de tabel 'users'.

Als er een waardering gegeven wordt, moet dus het punten aantal van de user waaraan de waardering gegeven wordt aangepast worden. Verder wordt het dus opgeslagen in 'reacties_punten', zodat er door iedereen maar 1 keer een waardering aan 1 reactie gegeven kan worden. De gemiddelde waardering voor een reactie is dan te bereken met een query die bij een 'reactie_id' alle 'punten' bij elkaar optelt en dat totaal deelt door het totaal aantal personen dat een waardering gegeven heeft.
Dit hoop ik met 1 query te kunnen doen, iets alla:

PHP:
1
SELECT SUM(punten) AS totaal COUNT(punten) AS aantal FROM reacties_punten WHERE reactie_id = $reactie_id;


Mjah, daar ben ik nog niet helemaal uit :P Moet ik me weer even inlezen in mysql queries.

Maar goed, wat wil ik nu eigenlijk: feedback. Waar ga ik met m'n redenatie de fout in? Is dit de efficiëntste manier? En hopenlijk kan iemand wat inzicht verschaffen in hoe het op Tweakers gedaan is en hoe dit zich houdt onder de grote aantallen gebezoekers die er dagelijks gebruik van maken.

Kleine toevoeging nog.

Het is dus de bedoeling dat een gebruiker start met een X aantal punten, door de waarderingen krijgt hij/zij meer of minder punten en op die basis zou er een soort sociale-controle moeten zijn tussen de gebruikers. Als iemand geen punten meer heeft kan hij ook niets meer posten.

[ Voor 9% gewijzigd door Roa op 03-06-2005 11:26 ]

Research is what I'm doing when I don't know what I'm doing.


Acties:
  • 0 Henk 'm!

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 17:49

ripexx

bibs

Nou dit systeem is absoluut niet bijzonder. Er zijn zat CMS'en waar dit soort reactie systemen in zitten. Verder is crisp een van de developers van T.Net. Het forum wordt ontwikkeld door React. crisp doet de templates etc. ;)

Verder zie ik niet het nu van de tabel user_punten?

Uitgaande van je tabellen kan je op de volgende manier vrij simpel brekeken wat iemand heeft gedaan.

de onderstaande code leverd dus het aantal uitgevoerde moderaties op reacties.
SQL:
1
2
3
4
SELECT sum(punten) as Totaal, 
    count(punten) as Aantalmoderaties
FROM reacties_punten
WHERE uid = 'someid';

Dit had je dus al zelf uitgevonden ;)

Als je bijvoorbeelde de totale score van de reactie poster wil weten kan je zo iets doen:
SQL:
1
2
3
4
5
SELECT user.nick, SUM(reactie_punten.punten), count(reacties.reactie_id)
FROM user, reactie_punten, reacties
WHERE user.userid = reacties.posterid
    AND reacties.reactieid = reactie_punten.reactieid
GROUP BY user.nick;

In het geval van preformance kan je er voor kiezen om bepaalde velden dubbel uit te voeren. Zodat je bijvoorbeeld een join minder hoeft te maken. Dus door aan de tabel reactie_punten ook de kolom posterid toe te voegen.Want dan kan je de tabel reacties er uit laten. Dit zal je dan in je code moeten afvangen.

De kunst is om eerst via normaliseren de juiste tabellen op te zetten en daarna eventueel wat aan de preformance gaan doen. Verder is de preformance vooral afhankelijk van de database instellingen en je query kennis. Het kiezen van een ander aanpak kan zeker in MySQL heeft veel preformance winst opleveren. De

Dit kan namelijk aanzienlijk veel uitmaken bij grotere recordset die ontstaan na een JOIN. Denk maar een aan t.net waar er duizenden berichten/reacties zijn en wellicht miljoenen moderaties. Als je dan een redelijk fanatieke poster/moderator hebt loopt de zaak ook vast. Dat is bijvoorbeeld ook het probleem als men de forum post staat hier op GoT opvraagt van gebruikers met een groot aantalposts ;)

Verder zou je bijvoorbeeld met een scheduled job/cron dit soort statistieken kunnen bereken waardoor je controle hebt over de load.

buit is binnen sukkel


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Om het snel te houden moet je inderdaad aggregeren. Wij gebruiken ook een losse tabel voor de reactie-scores, maar aggregeren die na een beoordeling naar een veld in de reactie-tabel.
De user-scores (karma) worden niet realtime herberekend maar periodiek dmv een cronjob en geaggregeerd naar een veld in de user-tabel.

Intentionally left blank