ben ik bezig met een forum maken, maar ik kom niet uit het volgende:

ik wil als er een nieuw bericht geplaatst wordt, en het lid heeft het nog niet gelezen, dat er dan ee sterretje komt. als het lid het bericht daan leest gaat het sterretje weer weg.

ik heb geen idee hoe ik dit moet doen. ik heb al meerdere manieren geprobeerd, maar het lukt niet. kan iemand mij helpen?
Ik zeg ook niet dat het de beste oplossing is, maar het kan wel. Maar goed, koppel tabel is natuurlijk het beste.

Niels Kieviet op 16/12/2010 12:38:31

Ik zeg ook niet dat het de beste oplossing is, maar het kan wel. Maar goed, koppel tabel is natuurlijk het beste.




Nee. Dat kan niet.
Omdat het dus een m:n relatie is. Een many-to-many relatie. Als jij in de berichten tabel een extra kolom toevoegt, met waarde ja / nee heb je geen eens een relatie meer.
Je hebt meerdere gebruikers en meerdere berichten. Elke gebruiker kan meerdere berichten hebben gelezen (of niet). En elk bericht kan door meerdere gebruikers zijn gelezen (of niet).
Als jij het met een extra kolom wilt doen, dan komt er zomaar soms eens een waarde dat dat bericht gelezen is. Dat is fout.
De enige oplossing voor een m:n probleem is een koppeltabel.
Heb je gelijk in, had niet over de mogelijkheid nagedacht met meerdere gebruikers.

/me bad :)
In verband met de performance raad ik aan om de koppeltabel te vullen met berichten die nieuw zijn en voor die user te deleten zodra die user het gelezen heeft. Dit heeft als voordeel dat de tabel niet enorm groeit omdat je delete. Een koppeltabel met ALLE berichten voor ALLE users en dan een marker wanneer iemand het gelezen heeft is in mijn visie dus de omgekeerde wereld en vreet records/diskruimte/performance. De tabel kan beter 5 records bevatten met id's van berichten die ik nog niet gelezen heb dan 1550 id's die ik wel gelezen heb. In beide gevallen moet je dus voor alle users een record toevoegen die "nog niet gelezen" weergeeft. Ik vraag mij af wat dat aan performance kost. Ik zie deze functionaliteit in veel fora waaronder phpBB maar ik heb me nog nooit verdiept in de oplossing....
Ja, het lijkt me wel dat je een punt hebt.

Nu, in hoeverre is het echt een probleem dat er heel veel records aanwezig zijn?
Zeker mocht je een goede index kiezen.

Ik weet er het fijne niet van.
Tabel berichten:
- userid
- username
- datum
- posterid
- postername
- gelezen

het gaat om de laatste en als je hem gaat lezen moet PHP hem op true zetten
John, een uitstekende benadering! Een bericht wordt 1x gepost, en veelvoudig gelezen.

Heb je 400 gebruikers en 200 nieuwe berichten, dan staan er natuurlijk wel 80.000 entries in de koppeltabel. Maar, dat is niet zoveel hoor, in termen van performance, gegeven goede indexen.

Om het aantal te drukken zou je in het gebruikersprofiel een schakeloptie kunnen opnemen: Markeer nieuwe berichten (default False). Dan moet iedereen de functie al inschakelen, wil het tot grote aantallen leiden.
Verder zou je ook een strategie voor opschonen kunnen toepassen: alle nieuwe berichten ouder dan 6 weken (admin, instelbaar) worden automatisch gemarkeerd als gelezen (en dus gedelete in de koppeltabel). Dat beschermt je tegen oneindig vullen van de koppeltabel.
@gnotrgnotr kwadraat: fout, jij hebt het niet begrepen. In jouw geval groeit de koppeltabel explosief en oneindig.
Gnotrgnotr gnotrgnotr op 20/12/2010 19:17:28

Tabel berichten:
- userid
- username
- datum
- posterid
- postername
- gelezen

Waarom half engels half nederlands?
Gnotrgnotr gnotrgnotr op 20/12/2010 19:17:28

het gaat om de laatste en als je hem gaat lezen moet PHP hem op true zetten

Dit moet je dus voor elke aparte bezoeker doen. Hoe wil je dat op deze manier doen?

Reageren