Hjælp til DB struktur af comment/replies tabel

Tags:    mysql sql php laravel

Hej allesammen

Jeg er i gang med at lære Laravel 4 og kende, og i den anledning prøver jeg at lave en lille blog. I et blog system er som bekendt ofte mulighed for at skrive kommentarerer til diverse indlæg, men der er også ofte mulighed for at lave et svar (reply) til en kommentar eller et svar (reply) til et andet svar (reply).

Jeg har prøvet at finde lidt viden om hvordan andre gør dette på internettet, da jeg selv havde tænkt at dele strukturen op, så kommentarer har en tabel for sig selv, og replies har en for sig selv. Men efterfølgende har jeg tænkt at den struktur ikke er så smart alligevel, dels pga. at et svar i princippet også er en kommentar, men man skal jo også kunne lave et reply ovenpå et andet reply.

Så mit spørgsmål er altså hvordan kan jeg lave en løsning, til at gemme kommentarer i databasen, og også diverse svar (replies). Hvordan er den bedste struktur for dette? Desuden hvordan sikrer jeg mig at dybden på antallet af replies ikke bliver alt for stor?

Håber at spørgsmålet er forstået, og der er nogle, som sidder med lidt viden indenfor dette.

På forhånd tak!



5 svar postet i denne tråd vises herunder
3 indlæg har modtaget i alt 22 karma
Sorter efter stemmer Sorter efter dato
Hvis du laver nedenstående struktur i din kommentartabel:

| ID | Post | ReplyTo | de andre felter som comment, user, date osv.

- ID er selvsagt primærnøgle
- Post er fremmenøgle til dit indlægs id
- ReplyTo er fremmdnøgle til ID

Så kan du hive alle indlæg ud ved at søge på Post, og dem hvor der ikke står noget i ReplyTo er rod-elementer. Så for hver rodelement hiver du dem ud af resultatet så er ReplyTo det ID. For hver af dem hiver du så dem ud der er ReplyTo deres ID.

Mht. til at holde styr på dybden, så kan du bare have en tæller der stiger hver gang du stiger et niveau, og når du når grænsen, så lad være med lave linket/knappen.

Sådan ville jeg nok lave det. Har ingen styr på Laravel, så om der er noget der i som gør at man ikke kan, det ved jeg ikke, men det er en da en meget simpel struktur, med en meget simpel rekursiv metode.





Indlæg senest redigeret d. 27.06.2014 15:06 af Bruger #16372
Jeg plejer at lave det så hvis det er et main topic så har den en group ID på 0 ellers har den en group ID der er lig med id eks.

ID | GID | text
1 | 0 | main indlæg
2 | 1 | Svar til 1
3 | 1 | Svar til 1

det gør det ret nemt at ha i samme tabel :)



Indlæg senest redigeret d. 28.06.2014 12:08 af Bruger #879
Drupal har implementeret en udmærket løsning, som man sagtens kan samle inspiration fra. (OBS, jeg har aldrig rørt drupal før, så ret mig endelig)

https://github.com/drupal/drupal/blob/7.x/modules/comment/comment.module :822 (comments til funktionen starter på :758)
tilhørende schema kan ses her: https://www.drupal.org/files/er_db_schema_drupal_7.png

Egentlig er det nævneværdige her, blot at der skal tilknyttes et parent_id, som refererer til thread_id. Foruden dette, laves der en kolonne der indeholder dybden (Drupal benytter blot VARCHAR(255) til dette, hvilket også burde være rigeligt til formålet. Vi starter altid på 1 her, for at holde en struktur.

Et træ kunne derved se således ud

p_id: 1
---------
1
1.1
1.1.1
1.2
2
2.1
2.1.1
2.2
2.3
2.3.1

Umiddelbart kan jeg ikke selv komme på nogen bedre løsning, såfremt du skal holde styr på dybden, også (ressource-besparende). Jeg håber at denne arkitektur sætter gryderne lidt i kog, og at der derved muligvis er nogen der kommer op med bedre løsninger. I alt fald, held og lykke. :)



ok, jeg tror jeg forstår hvad du mener, men prøver det lige af en gang :)



Hej Jesper

Umiddelbart tror jeg at det var den samme løsning, som Nicky nævnte.

Jeg har gjort det at jeg har inkluderet en ekstra kolonne, i min 'comments' tabel, og hvis den ikke er 'null', skal kommentaren vises som et svar til en anden kommentar.

Jeg har dog stadig ikke lige fået løst det med dybden, men jeg har heller ikke siddet med den del så meget endnu.



t