Leif Neland wrote:
> Et lidt teoretisk spørgsmål...
>
> En en-til-mange-til-mange relation:
> En kunde har mange ordrer, og hver ordre har mange ordrelinier.
>
> Forudsætning: Der bruges ikke stored procedures i databasen;
> "mekanikken" ligger i applikationen, f.ex. en webside i php eller asp.
>
> Når man skal vise ordren, laver man så tre request til databasen:
> (Pseudokode)
>
> $kundedata=sqlresult("select * from ordrer where id=?",$ordreid)
> $kundeid = $kundedata["kundeid"]
>
> $ordredata=sqlresultat("select * from kunder where id=?,$kundeid)
> udskriv_ordrehoved($kundedata,$ordredata)
> $ordrelinier=sqlresultat(
> "select * from ordrelinier where ordreid=?",$ordreid)
> foreach($ordrelinier as $ordrelinie) {
> udskriv($ordrelinie)
> }
>
> Eller lader man databasen trække det hele på en gang?
> $ordrelinier=sqlresultat("select * from kunder,ordrer,ordrelinier
> where ordrer.id=?
> and ordrer.kundeid=kunder.id
> and ordrer.id=ordrelinier.ordreid",$ordrelinie)
>
> udskriv_ordrehoved($ordrelinier[0])
> foreach($ordrelinier as $ordrelinie) {
> udskriv($ordrelinie)
> }
>
> Den ene måde laver flere forespøtgsler til database, den anden kun 1,
> men til gengæld indeholder hver ordrelinie også kundeoplysningerne.
>
> Det kommer nok an på, hvor effektiv databasen er i forhold til
> programmeringssproget, og hvor langt (og "bredt") mellem database og
> applikation, så det er nok ligegyldigt i de fleste situationer.
>
> Men hvad lærer ungdommen nu om stunder?
Jeg aner ikke hvad ungdommen lærer.
Generelt er mange alt for hysteriske med at minimere antal
SQL kald. Det er ikke hurtigt at lave SQL kald inden i
en løkke, men i tilfælde som dette om det er 1,2 eller 3
kald er kun et af mange forhold som påvirker performance.
Færre kald vil normalt mindske wall time betydelige, men
det er mere usikkert om belastningen af database serveren
vil blive mindre eller større, fordi færre kald betyder
mere kompleks SQL.
Nogen konstruerer nogle rædsler af SQL sætninger for
at spare et enkelt kald.
I det konkrete tilfælde tror jeg dog at jeg ville gå
efter et enkelt kald. Det er en helt basal join, som jeg
vil forvente at databasen vil kunne udføre meget effektivt.
Men hvis du vil vide det med sikkerhed bliver du nødt til
at teste med din database og dine data.
Arne