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

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Max antal niveauer i trådet forum?!?
Fra : Henrik Overballe


Dato : 18-10-02 14:36

Er ved at lave et trådet forum, hvor jeg gerne vil stoppe muligheden for at
skrive svar når hovedemnet indeholder x antal niveauer (ikke antal svar).

Min DB er bygget op efter at hver svar har et id og et parent-id (altså id
nummeret for niveauet før det pågældende svar).

Er der mon nogen som har prøvet noget lignende før?

mvh.
Henrik



 
 
Jakob Møbjerg Nielse~ (18-10-2002)
Kommentar
Fra : Jakob Møbjerg Nielse~


Dato : 18-10-02 15:21

Henrik Overballe wrote:
> Min DB er bygget op efter at hver svar har et id og et parent-id
> (altså id nummeret for niveauet før det pågældende svar).

Dum ide. Rekursive kald til en DB er noget skidt. I det forum jeg har
lavet er id et tekstfelt:

Indlæg1: id = 00000
Indlæg2: id = 00001
Indlæg3: id = 00002

Svar på indlæg2: id = 0000100000

Et sorteret og trådet liste med indlæg, kan altså hives ud med et enkelt
SQL-kald, ex:

00000
00001
000010000
0000100000000
000010001
00002
000020001

osv.

Her er det også nemt at beregne antallet af niveauer:

niveau = id mod 5

Metoden har dog sine begrænsninger (her taget på mit valg af at bruge 5
tegn pr. indlæg):

1. Tråden kan maksimum være 255/5=51 niveauer dyb.
2. Der kan maksimum være 10000 svar pr. indlæg.
3. Det er lidt mere besværligt at indsætte indlæg i DB'en.

ad 2: Det kan godt modificeres, så der fx både bruges både tal og
bogstaver til id'et, og måske at bruge lidt flere tegn til rødderne, og
lidt færre til svar. Det gad jeg dog ikke at gøre, da der over de sidste
2 år kun er lavet omkring 150 tråde i forummet.

> Er der mon nogen som har prøvet noget lignende før?

Du kan jo lave et baglæns trace i DB'en (igen flere SQL-kald), eller
også kan du have en kolonne hvor niveauet er angivet.

--
Jakob Møbjerg Nielsen | "Five exclamation marks, the
jakob@dataloger.dk | sure sign of an insane mind."
http://www.jakobnielsen.dk/ | -- Terry Pratchett, Reaper Man
Jeg søger et fuldtidsjob som programmør. Tag et kig på hjemmesiden.



Henrik Overballe (21-10-2002)
Kommentar
Fra : Henrik Overballe


Dato : 21-10-02 12:21

> Du kan jo lave et baglæns trace i DB'en (igen flere SQL-kald), eller
> også kan du have en kolonne hvor niveauet er angivet.

Jeg har forsøgt at trace baglæns, men det bevirker at for hver niveau jeg
har, så skal jeg lave et SQL-kald...hvilket jo ikke just gør det særligt
dynamisk og kræver jo også mange SQL-kald, hvis jeg ønsker mange niveauer.

Jeg vil dog gerne bibeholde den nuværende struktur (med id og parent-id).
Det lyder meget kompliceret at lave id'et i et tekstfelt - men am I wrong?

mvh.
Henrik Overballe





Jakob Møbjerg Nielse~ (21-10-2002)
Kommentar
Fra : Jakob Møbjerg Nielse~


Dato : 21-10-02 15:39

Henrik Overballe wrote:
> Jeg har forsøgt at trace baglæns, men det bevirker at for hver niveau
> jeg har, så skal jeg lave et SQL-kald...hvilket jo ikke just gør det
> særligt dynamisk og kræver jo også mange SQL-kald, hvis jeg ønsker
> mange niveauer.

Der kræves jo også mange SQL-kald, når du skal bygge tråden.

> Jeg vil dog gerne bibeholde den nuværende struktur (med id og parent-
> id). Det lyder meget kompliceret at lave id'et i et tekstfelt - men
> am I wrong?

Det er faktisk ikke så svært. Det sværeste er nok måden at generere
id'et på. Samtidig skal man være opmærksom på, at når der laves et nyt
indlæg, skal det nuværende højeste id hentes ud af databasen (hvis der
bruges Access). Fra du gør det, og indtil det nye id er genereret og sat
ind i DB'en, må der ikke kunne indsættes andre id'er.

Ex: Der er to brugere der laver en ny tråd på samme tid. Dem kalder vi
process1 og process2. Følgende scenarie vil give fejl:

Programforløb:
Process1:
1. Hent højeste id.
2. Beregn nyt id.
Process2:
1. Hent højeste id.
2. Beregn nyt id.
3. Indsæt nyt id.
Process1:
3. Indsæt nyt id.

Det der skal sørges for er at step 1 i process2 først må udføres efter
step 3 i process1. Der skal altså laves en kø. På MSSQL, PostgreSQL,
Oracle eller andre DB'er der understøtter stored procedures kan man lave
det sådan at der kun skal et enkelt SQL-kald til at indsætte et nyt
indlæg, men på en Access DB bliver man nødt til at klare det på klienten
(webserveren er klienten, og DB-serveren er serveren).

Hvis der ikke er enormt mange brugere til forummet, og det ikke skal
være dybt professionelt, kan man vælge at acceptere at Access bare vil
give en fejl i ovenstående scenarie (id kolonnen skal selvfølgelig være
unik). Det er dog ikke pænt at gøre det på den måde.

--
Jakob Møbjerg Nielsen | "Five exclamation marks, the
jakob@dataloger.dk | sure sign of an insane mind."
http://www.jakobnielsen.dk/ | -- Terry Pratchett, Reaper Man
Jeg søger et fuldtidsjob som programmør. Tag et kig på hjemmesiden.



Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408938
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste