Toon posts:

[mysql] Forum structuur

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ga zelf een forum bouwen ivm een website waar ik mee bezig ben... Om dit te doen heb ik verschillende mogelijkheden qua structuur, ik zou willen weten welke jullie de beste/gemakkelijkste/leukste manier is voor de database.
Alleen ernstige reacties plz...

Ik heb even snel enkele mogelijkheden geschetst, dit zijn geen concrete plannen hoor :) :


#1
tabel: topics
met topic-id, topic-titel, post id
Deze tabel geeft dus het id van een post uit 'reacties' die een openingspost is. Hij bevat dus verwijzingen naar openingsposten uit de andere tabel

tabel: reacties
met id, inhoud, topic,...
met alle berichten, dus ook de openingsposten van topics...
#2
tabel: topics
met topic-id, topic-titel, inhoud
In deze tabel zitten alle openingsposten

tabel: reacties
met id, inhoud, topic,...
In deze tabel zitten alle reacties
#3
tabel: posts
id, onderwerp, inhoud, topic
Hier zitten alle posts in, bij openingsposten is 'topic' 1 en bij reacties is 'topic' 0
#4
Is er een andere goeie?

Acties:
  • 0 Henk 'm!

  • disjfa
  • Registratie: April 2001
  • Laatst online: 03-07 14:47

disjfa

be

Waarom wil je nog meer mogenlijkheden weten. En waarom zou je al deze mogenlijkheden willen weten.

Wat is in jouw ogen de structuur die je van plan bent te gebruiken, en waarom die andere niet?

disjfa - disj·fa (meneer)
disjfa.nl


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat is het probleem, ik heb geen idee welke structuur de beste is omdat ik nog nooit een forum heb gemaakt, daarom vraag ik jullie ervaringen. Welke mogelijkheid vinden jullie de beste en waarom?

Acties:
  • 0 Henk 'm!

  • Tiemez
  • Registratie: December 2003
  • Laatst online: 24-10-2022
Verwijderd schreef op donderdag 16 april 2009 @ 16:11:
Dat is het probleem, ik heb geen idee welke structuur de beste is omdat ik nog nooit een forum heb gemaakt, daarom vraag ik jullie ervaringen. Welke mogelijkheid vinden jullie de beste en waarom?
je moet gewoon uitschrijven wat een topic of een posts is. En dan pas nadenken over de database.

Een openingspost is overigens niets meer dan een gewone reactie, het is alleen toevallig de eerste. :P

[ Voor 4% gewijzigd door Tiemez op 16-04-2009 16:13 ]


Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Alleen ernstige reacties plz...
:? Ik zal ernstig proberen te antwoorden...

Anyhoe: heb je al gekeken naar grote fora en hoe zij dat oplossen (myreact is gratis ;))?

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • Arnout
  • Registratie: December 2000
  • Laatst online: 21-09 15:29
Verwijderd schreef op donderdag 16 april 2009 @ 16:11:
Dat is het probleem, ik heb geen idee welke structuur de beste is omdat ik nog nooit een forum heb gemaakt, daarom vraag ik jullie ervaringen. Welke mogelijkheid vinden jullie de beste en waarom?
Er bestaat geen "beste" oplossing of structuur voor jouw situatie. Het beste is om zelf een ontwerp te maken, en als dat niet voldoet, verder te verbeteren. Zo kom je tot de "beste" oplossing.

Of je kijkt naar bijv een phpBB, maar be aware, dat kan wel eens ingewikkeld lijken.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Database ontwerp hoort in SEA dus

PRG->SEA

Overigens ben ik het met Tiemez eens dat een Startpost geen bijzondere post is, en dus zou ik dat ook niet apart opnemen.

Als je de start-post van een topic wil hebben pak je gewoon de reactie met de vroegste post-date.

Zelf zou ik dus voor je eerste oplossing gaan, alleen dan het start-post gedeelte achterwege laten.

[ Voor 16% gewijzigd door Woy op 16-04-2009 17:02 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • dcm360
  • Registratie: December 2006
  • Niet online

dcm360

Moderator Discord

HD7767 powered

Alle drie de suggesties hebben wel hun voors en tegens, maar toch maar even een korte uitleg welke ik gekozen heb voor mijn forum en de achterliggende gedachte.
Ik begin met #3, degene die ik niet zou kiezen. Het eerste dat me opvalt is dat je de eerste post van een topic los gaat markeren, terwijl dat niet nodig is omdat mij de eerste post geplaats in een onderwerp wel geschikt lijkt als topicstart. Het tweede, en meteen ook de reden om deze niet te kiezen, is de situatie dat je twee topics met dezelfde titel krijgt. Volgens mij werkt dat niet met deze opzet.

#1 en #2 lijken heel erg veel op elkaar. Degene die ik zelf gebruik is #1. De reden daarvoor is simpel: de code waarop ik mijn forum gebouwd heb deed dit al... De achterliggende gedachte is denk ik dat er eigenlijk geen verschil is tussen een eerste post in een topic en de daaropvolgende: de topicstart heeft precies dezelfde eigenschappen als een reactie daarop. De situatie waarbij #2 handiger zou kunnen zijn is alleen wanneer je specifiek eigenschappen van de startpost gebruikt en die van de andere posts in het topic niet. Hoewel je die situatie ook met #1 netjes in 1 query naar de database kan sturen...

Wat er altijd wordt gezegd in boeken over de combinatie PHP/MySQL (en ik hoop ook wel over databases in het algemeen) is dat als je data telkens herhaald op gaat slaan je die data dan beter in een losse tabel kan opslaan met een verwijzing ernaar (ook een reden waardoor #3 niet aanbevolen is).

Als je #2 gaat toepassen dan gebruik je twee tabellen om de inhoud van berichten in op te slaan, waardoor je in de situatie als je eigenschappen aan berichten wil toevoegen je die informatie ook als kolom erbij krijgt in je tabel met threads.

Zoals je ziet kan ik #1 dus voor mezelf het beste verdedigen. Ik zie trouwens net dat phpBB deze opzet ook gebruikt (zie hier)

Acties:
  • 0 Henk 'm!

Verwijderd

Ik zou zelf voor #4 gaan. En mijn #4 zal dan ongeveer zoiets worden:

topic
id (pk)
naam

posts
id (pk)
topic_id (fk)
inhoud

"openingspost" is gewoon een post, de eerste om precies te zijn.

Acties:
  • 0 Henk 'm!

  • thegve
  • Registratie: Februari 2004
  • Laatst online: 17-09 08:23
Als het om een 'forum' gaat denk ik al snel aan categorie'en trouwens. Anders kun je het beter een blog noemen.
Verder ben ik het wel eens met GuidoH.

Risico puntje daarbij is wel de volgorde van de posts. Met deze opzet vertrouw je op het (Serial/Autoincrement) ID van de posts om de volgorde te bepalen. Ik kan niet direct een reden bedenken waarom dit fout zou kunnen gaan, maar het is wellicht nog iets om even over na te denken.

Acties:
  • 0 Henk 'm!

Verwijderd

thegve schreef op donderdag 16 april 2009 @ 20:17:
Als het om een 'forum' gaat denk ik al snel aan categorie'en trouwens. Anders kun je het beter een blog noemen.
Verder ben ik het wel eens met GuidoH.

Risico puntje daarbij is wel de volgorde van de posts. Met deze opzet vertrouw je op het (Serial/Autoincrement) ID van de posts om de volgorde te bepalen. Ik kan niet direct een reden bedenken waarom dit fout zou kunnen gaan, maar het is wellicht nog iets om even over na te denken.
Het "risico" dat je noemt is in principe geen risico.. Lijkt me nogal onmogelijk om een nieuwe post te doen naar een topic dat in dezelfde request aangemaakt wordt, die dan voor de topicstart geplaatst wordt, of bedoel je dat niet? Anders zouden transactions het volgens mij nog "verder" uit kunnen sluiten (voor zover het al niet uitgesloten is). dit laatste weet ik niet zeker, heb ik namelijk nog nooit gebruikt.. ;)

Verder zijn die categorieën simpel erbij te doen, aangezien dit in de topicstart niet stond, heb ik ze er niet bij gezet. Met categorieën zou het zoiets gaan worden lijkt me:

categorie
id (pk)
naam

topic
id (pk)
categorie_id (fk)
naam

posts
id (pk)
topic_id (fk)
inhoud

Weet niet of het de "beste" oplossing is, maar dit zal iig de manier zijn waarop ik het zou doen. :)

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

De meeste boards hebben een forum tussen de categorie en de topic zitten. Devschuur is dus de categorie, Programming het forum, en dit is de topic. Ik gebruik zelf trouwens ook jouw #4. Ik heb in feite nog wel een timestamp met een index daarop, maar ik heb al lang geleden besloten dat dat eigenlijk onzinnig was alleen heb ik het nooit aangepast. Gewoon sorteren op id (waar je toch al een index op hebt omdat het de PK is) is net zo handig, en efficienter.
Verwijderd schreef op donderdag 16 april 2009 @ 20:58:
[...]

Het "risico" dat je noemt is in principe geen risico.. Lijkt me nogal onmogelijk om een nieuwe post te doen naar een topic dat in dezelfde request aangemaakt wordt, die dan voor de topicstart geplaatst wordt
Als je geen transactions gebruikt, en je maakt eerst de topic aan en daarna de post, dan zou het dus wel eventueel kunnen. Mijn forum heeft daar op zich ook "last" van, en wellicht React ook. Als je een nieuw topic id verzint dat niet ver in de toekomst ligt, en keihard de servers gaat spammen om een post te doen naar dat topic, dan zou het kunnen voorkomen dat je request precies wordt afgehandeld tussen het aanmaken van de nieuwe topic en de bijbehorende openingspost.

Eventueel zou je de topic gelocked kunnen openen, dan kunnen alleen mensen met rechten om in gesloten topics te posten (meestal alleen moderators) dat exploiten :)

Maar al met al is het niet zo'n issue. Het is net zo erg als mensen die gewoon onzinnige posts maken in topics, en die ban je op een gegeven moment ook gewoon.

[ Voor 107% gewijzigd door .oisyn op 16-04-2009 23:25 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
.oisyn schreef op donderdag 16 april 2009 @ 23:15:
De meeste boards hebben een forum tussen de categorie en de topic zitten. Devschuur is dus de categorie, Programming het forum, en dit is de topic. Ik gebruik zelf trouwens ook jouw #4. Ik heb in feite nog wel een timestamp met een index daarop, maar ik heb al lang geleden besloten dat dat eigenlijk onzinnig was alleen heb ik het nooit aangepast. Gewoon sorteren op id (waar je toch al een index op hebt omdat het de PK is) is net zo handig, en efficienter.


[...]

Als je geen transactions gebruikt, en je maakt eerst de topic aan en daarna de post, dan zou het dus wel eventueel kunnen. Mijn forum heeft daar op zich ook "last" van, en wellicht React ook. Als je een nieuw topic id verzint dat niet ver in de toekomst ligt, en keihard de servers gaat spammen om een post te doen naar dat topic, dan zou het kunnen voorkomen dat je request precies wordt afgehandeld tussen het aanmaken van de nieuwe topic en de bijbehorende openingspost.

Eventueel zou je de topic gelocked kunnen openen, dan kunnen alleen mensen met rechten om in gesloten topics te posten (meestal alleen moderators) dat exploiten :)

Maar al met al is het niet zo'n issue. Het is net zo erg als mensen die gewoon onzinnige posts maken in topics, en die ban je op een gegeven moment ook gewoon.
Dat is ieder geval wel een hele creatieve manier van first posten ;)

Het locken op zich is ook niet de beste oplossing ( buiten een transactie gebruiken ) denk ik. Als je het topic namenlijk gelocked opent, zul je alsnog moeten controleren of degene die post rechten heeft om in een gesloten topic te posten, of dat het de Topic starter is die de eerste post wil maken. Je kunt dan beter gewoon in bouwen dat alleen de Topic Starter de eerste post mag maken. Je zult dan wel bij je Topic op moeten slaan wie de Topic-Starter is, maar om je forum-index te genereren ( en eventueel andere statistieken ) wil je dat misschien toch al.

Maar het is inderdaad nogal een theoretisch probleem, want een user die dat probeert valt inderdaad snel genoeg door de mand, en word gewoon geband. Als zijn posts getrashed zijn heb je alsnog de goede situatie

[ Voor 4% gewijzigd door Woy op 17-04-2009 09:22 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 23:09

crisp

Devver

Pixelated

Het aanmaken van het topic en het aanmaken van het eerste bericht voor dat topic geschiedt in React in een transactie ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Woy schreef op vrijdag 17 april 2009 @ 09:10:
Als je het topic namenlijk gelocked opent, zul je alsnog moeten controleren of degene die post rechten heeft om in een gesloten topic te posten, of dat het de Topic starter is die de eerste post wil maken.
Als je in je domain layer een topic en de bijbehorende startpost aanmaakt hoef je natuurlijk überhaupt niet die rechten te checken aangezien je al bepaald hebt dat de betreffende user de topic mag maken :). Maar goed, 't is natuurlijk maar net hoe je je verantwoordelijkheden verdeelt in de code; is de Post class verantwoordelijk voor het checken voor de rechten, of is dat iets dat je al controleert bij het binnenkomen van het request?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

.oisyn schreef op vrijdag 17 april 2009 @ 10:47:
[...]

Als je in je domain layer een topic en de bijbehorende startpost aanmaakt hoef je natuurlijk überhaupt niet die rechten te checken aangezien je al bepaald hebt dat de betreffende user de topic mag maken :). Maar goed, 't is natuurlijk maar net hoe je je verantwoordelijkheden verdeelt in de code; is de Post class verantwoordelijk voor het checken voor de rechten, of is dat iets dat je al controleert bij het binnenkomen van het request?
Ik persoonlijk zou die verantwoordelijkheid inderdaad neerleggen bij de Post class. Het lijkt me namelijk het betrouwbaarst en het fijnst om de check die over de Post gaat, ook in de Post class te doen. Zo heb je zekerheid dat elke post door die check geweest is, als je die check ergens anders doet, heb je dat niet. :)
Pagina: 1