/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Forum og datamodellen
Fra : Peter S


Dato : 13-08-04 11:38

Hej jeg har brug for at lave et forum.

Til mit script har jeg PHP og mySql til rådighed. Jeg er bare løbet ind i
overhovedet at få hold på datamodel og hvordan jeg skal selecte data. F.eks.
hvilke tabeller skal jeg bruge.

Bare sådan i store træk. :)

Hvad med:
1)
********************
Emner
ID
created
Title

2)
********************
Indlaeg
ID
Emne_ID
created
Tekst

Men hvad så med nu? hvordan holder jeg styr på sammenhængen mellem
indlæggene?

HJÆLP og tak hvis...

Peter S



 
 
Jens Gyldenkærne Cla~ (13-08-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 13-08-04 11:56

Peter S skrev:

> Men hvad så med nu? hvordan holder jeg styr på sammenhængen
> mellem indlæggene?

En simpel mulighed er at lade et indlæg have et parentID der
henviser til det indlæg der svares på (det er så null for indlæg
der starter en tråd).

Det giver mulighed for ubegrænsede tråddybder, men er til gengæld
også tungt at anvende, fordi man får rekursive kald til databasen.

Hvis man ikke har behov for trådning, kan man nøjes med at arbejde
med to niveauer - tråde og indlæg - og så blot sortere efter
datoen. Det er væsentligt lettere at sætte op, men giver ikke de
samme muligheder ved brug.

En tredje teknik er at bruge et felt til at vise placeringen i en
tråd (altså hvor mange niveauer man ligger under hovedindlægget).
Her må man sætte en maksdybde for trådningen - men det behøver ikke
at være et problem i praksis.

Hvis du er i tvivl om hvad forskellen mellem trådning og ikke-
trådning er, kan jeg prøve at vise det med et eksempel:

Her er først et trådet eksempel:

A
- B (svar på A)
- C (svar på B)
- D (svar på A)
- E (svar på A)
- F (svar på E)
- G (svar på E)
- H (svar på G)

Man kan grafisk se hvilke indlæg der er gået forud for ethvert
svarindlæg i tråden herover. Det er også værd at bemærke at
trådningen virker, selvom indlæggene herover ikke kommer i
alfabetisk rækkefølge - indlæg C kan fx sagtens være skrevet senere
end indlæg G.

Uden trådning kan den samme tråd fx se ud som følger:

A
- B (svar på A)
- D (svar på A)
- E (svar på A)
- F (svar på E)
- G (svar på E)
- C (svar på B)
- H (svar på G)


Man kan se at alle svarindlæg refererer til startindlægget A, men
man kan ikke se om et indlæg refererer til et andet svarindlæg.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Peter S (13-08-2004)
Kommentar
Fra : Peter S


Dato : 13-08-04 12:12

Ok...

Så jeg kun to spørgsmål

> Det giver mulighed for ubegrænsede tråddybder, men er til gengæld
> også tungt at anvende, fordi man får rekursive kald til databasen.

Betyder det bare krøllet kodning eller lange svartider. Det sidste forkommer
mig ret uheldigt

Mit andet spørgsmål er: kommer jeg til at slås med afgrænsning af indlæggene
når mit forum bliver 'gammel'. Dvs.: Bliver det endnu mere 'krøllet' når jeg
giver mig til at udlade gamle indlæg. Det kan godt være jeg spørger lidt
tåget, men jeg vil jo gerne undgå at bevæge mig ind ad et galt spor.



Peter S



Jens Gyldenkærne Cla~ (13-08-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 13-08-04 12:28

Peter S skrev:

>> Det giver mulighed for ubegrænsede tråddybder, men er til
>> gengæld også tungt at anvende, fordi man får rekursive kald
>> til databasen.

> Betyder det bare krøllet kodning eller lange svartider.

Det sidste (og muligvis også det første). Jeg har ikke selv
erfaringer med at anvende det, så jeg skal ikke afvise at det kan
køre fornuftigt. Men det er væsentligt mere krævende for databasen
at lave mange rekursive kald, så jeg vil ikke anbefale metoden uden
forbehold.

> Mit andet spørgsmål er: kommer jeg til at slås med afgrænsning
> af indlæggene når mit forum bliver 'gammel'. Dvs.: Bliver det
> endnu mere 'krøllet' når jeg giver mig til at udlade gamle
> indlæg.

Tja - godt spørgsmål. En mulighed er at benytte et arkiv, så den/de
primære tabeller kun indeholder aktuelle indlæg.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Tonni Aagesen (13-08-2004)
Kommentar
Fra : Tonni Aagesen


Dato : 13-08-04 12:20

Peter S wrote:

[cut]

> Men hvad så med nu? hvordan holder jeg styr på sammenhængen mellem
> indlæggene?

En simpel og effektiv måde kunne være:

id = unik fortløbende tal
pid = det id som der er svaret på
tid = unik id for tråden

id pid tid title
----------------------------
1 0 0 "foo"
2 1 1 "re: foo (1)"
3 1 1 "re: foo (2)"
4 2 1 "re: foo (1-1)"
5 0 2 "bar"
6 2 1 "re: foo (1-2)"
7 5 2 "re: bar"


Find alle hovedtråde:
SELECT forum.* FROM forum WHERE pid=0;

Find hovedtråd og svar på denne:
SELECT forum.* FROM forum WHERE id=$var OR tid=$var;

Lad PHP lave det rekursive arbejde og sæt indexes på id, pid og tid
kolonnerne.

Håber det gav lidt inspiration...

--
Mvh
Tonni Aagesen
www.cazoo.dk

Tonni Aagesen (13-08-2004)
Kommentar
Fra : Tonni Aagesen


Dato : 13-08-04 12:51

Tonni Aagesen wrote:

> id pid tid title
> ----------------------------
> 1 0 0 "foo"

[cut]

Skal selvfølgelig være :

id pid tid title
----------------------------
1 0 1 "foo"
.... etc ...



--
Mvh
Tonni Aagesen
www.cazoo.dk

Peter S (13-08-2004)
Kommentar
Fra : Peter S


Dato : 13-08-04 13:06

> En simpel og effektiv måde kunne være:

Kanont!
Både du og Jens har bragt mig videre

Nu slås jeg bare med redusere mine SELECT jeg kan finde ud af at stille et
SELECT for hvert niveau, men det må da kunne reduseres til noget smart.

Jeg laver en løkke for hver hovedtråd ligesom:

> SELECT forum.* FROM forum WHERE pid=0;

dernæst kommer aller svarene, men svarene på første svar skal jo ind før
svar 2! og nu nærmer jeg mig jo noget php, men alligevel !

Jeg flytter lige spørgsmålet over. Men tak så langt :)


mvh
Peter S



Jens Gyldenkærne Cla~ (13-08-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 13-08-04 13:08

Peter S skrev:

> dernæst kommer aller svarene, men svarene på første svar skal
> jo ind før svar 2! og nu nærmer jeg mig jo noget php, men
> alligevel !

Det er netop her problemet med rekursive kald kommer ind.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Peter Lykkegaard (13-08-2004)
Kommentar
Fra : Peter Lykkegaard


Dato : 13-08-04 14:28

"Jens Gyldenkærne Clausen" wrote

> Det er netop her problemet med rekursive kald kommer ind.

Man behøves ikke at lave flere kald til databasen for at lave trådning
Lidt pseudo kode med udgangspunkt i dit eksempel med id/parentid

Hent alle rækker fra tabellen
Dubler rækker

Filtrer første dublet på ikke udfyldt parentid
For hver række i filtreret første dublet
Skriv række
Behandl underrækker

Behandl underrækker:
Filtrer første dublet på parentid = id fra overliggende række
For hver række i filtreret anden dublet
Skriv række
Behandl underrækker

- Peter



Jens Gyldenkærne Cla~ (13-08-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 13-08-04 14:38

Peter Lykkegaard skrev:

> Man behøves ikke at lave flere kald til databasen for at lave
> trådning Lidt pseudo kode med udgangspunkt i dit eksempel med
> id/parentid

Det er rigtigt - men så flytter problemet vel bare til
præsentationslaget?


> Filtrer første dublet på ikke udfyldt parentid

Det springende punkt er, så vidt jeg kan se, hvor hurtigt sådan en
filtrering kan foretages. I et større forum skal filtreringsrutinen
køre mange gange - og eftersom den ikke køres i databasen, kan man
ikke få gavn af indeks mm.

Som nævnt tidligere, så har jeg ikke praktisk erfaring med forums
der benytter parentID-metoden. Men jeg har set den frarådet flere
gange.

Nogle af de alternative metoder der findes, gør det muligt at
trække alle indlæg ud i korrekt rækkefølge på én gang - det må alt
andet lige være noget hurtigere.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Peter Lykkegaard (13-08-2004)
Kommentar
Fra : Peter Lykkegaard


Dato : 13-08-04 15:09

"Jens Gyldenkærne Clausen" wrote

> Det er rigtigt - men så flytter problemet vel bare til
> præsentationslaget?

Problemet er imho ikke så stort
Se nedenfor...

> Det springende punkt er, så vidt jeg kan se, hvor hurtigt sådan en
> filtrering kan foretages. I et større forum skal filtreringsrutinen
> køre mange gange - og eftersom den ikke køres i databasen, kan man
> ikke få gavn af indeks mm.

Både ADODB og ADO.NET ordner den lille detalje forbavsende hurtigt i forhold
til at hente data fra backenden
ADO.NET har en en Select metode
Hvis man arbejder dataview så kan man har angive indexes etc

Det skal dog tilføjes at jeg primært arbejder med færre antal brugere [1]
der så til gengæld har brug for high performance
Og hentning af data fra et ERP system kan være dræbende for netop dette

Mange tusinde samtidige brugere sætter jo sine begrænsninger på hvad man kan
tillade sig

[1] Fra 50 op til 200 samtidige brugere, sjældent flere

- Peter



Peter Lykkegaard (13-08-2004)
Kommentar
Fra : Peter Lykkegaard


Dato : 13-08-04 18:00

"Peter S" wrote

> Til mit script har jeg PHP og mySql til rådighed. Jeg er bare løbet
ind i
> overhovedet at få hold på datamodel og hvordan jeg skal selecte data.
F.eks.
> hvilke tabeller skal jeg bruge.
>
Jeg faldt over den her
Måske det kan bruges som inspiration?
http://www.eggheadcafe.com/articles/20030320.asp

Det er et .NET kildekode til et trådet forum
NB: Inkl SQL scripts

- Peter



Søg
Reklame
Statistik
Spørgsmål : 177514
Tips : 31968
Nyheder : 719565
Indlæg : 6408618
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste