Toon posts:

[MySQL] Hoog aantal queries, slechte db layout?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi allemaal :)

Ik heb mijn dbase op de volgende manier genormaliseerd:
persoon
p_id
p_naam
p_achternaam
p_mail

[u]activiteit[/u]
a_id
a_naam
a_datum

[b]beschikbaarheid[/b]
a_id
p_id
enum b_status: 'JA','NEE','MISSCHIEN'
Ik ben bezig met een simpele activiteiten-kalender. Per activiteit (a_id) kan een persoon (p_id) aanduiden of hij kan komen/niet kan komen/nog niet zeker is. De tabel 'beschikbaarheid' is dus de koppeltabel.

Bij het neerhalen van mijn activiteiten + beschikbaarheid, stuit ik op een hoog aantal queries. (ik heb het script nog niet gemaakt, maar het is een voorspelling)

Hypothetisch is het volgens mij zo:
code:
1
2
3
4
5
6
7
8
9
10
$query = "SELECT * from activiteit";
while ($row = mysql_fetch_array(..))
{
  $query2 = "SELECT status,p_name FROM beschikbaarheid, persoon WHERE a_id = $row['a_id'] AND beschikbaarheid.p_id = persoon.p_id";
  while ($row2 = ...)
  {
    .. doe wat met die status / naam .. (bijv string van maken)
  }
  .. die wat met de informatie van de activ. + de beschikbaarheid ..
}

Dit betekent dat ik bijvoorbeeld voor 12 activiteiten, met een personenlijst van x (maakt niet uit) personen: 1 (de activ.) + 12 (beschikbaarheid) = 13 queries nodig heb.

Mijn vraag: is mijn dbase niet goed genormaliseerd, of moet ik het anders aanpakken?

Dit is nog maar de basis van de hele opzet, dus als ik hier al veel queries voor nodig heb... gaat het nooit goed komen, denk ik :o

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

SELECT P.p_naam, P.p_achternaam, A.a_naam, A.a_datum, B.b_status
FROM persoon AS P, activiteit AS A, beschikbaarheid AS B
WHERE
P.p_id = B.p_id AND
A.a_id = B.a_id

zoiets. Voordeel is dat het 1 query is, nadeel is dat je veel "dubbele" data krijgt terug gestuurd, namelijk bij elke persoon die iets te maken heeft met een activiteit, krijg je weer de activiteit naam enz.
Je kan orderen bij activiteit ID, en er dan doorheen loopen in php.

[ontwerp is goed trouwens, standaard n:m relatie met attribuut(ja/nee/misschien)]

Verwijderd

Topicstarter
Op zaterdag 27 juli 2002 17:34 schreef Zoijar het volgende:
SELECT P.p_naam, P.p_achternaam, A.a_naam, A.a_datum, B.b_status
FROM persoon AS P, activiteit AS A, beschikbaarheid AS B
WHERE
P.p_id = B.p_id AND
A.a_id = B.a_id

zoiets. Voordeel is dat het 1 query is, nadeel is dat je veel "dubbele" data krijgt terug gestuurd, namelijk bij elke persoon die iets te maken heeft met een activiteit, krijg je weer de activiteit naam enz.
Je kan orderen bij activiteit ID, en er dan doorheen loopen in php.

[ontwerp is goed trouwens, standaard n:m relatie met attribuut(ja/nee/misschien)]
Ja correct ja, ... zo had ik het eerst ook, maar natuurlijk heb je dan die dubbele informatie. Dit is best 'klote' (:o) als er op termijn in die activiteiten tabel ook textfielden gaan opgenomen worden. Bij een drukke site is dit denk ik niet aan te raden + het staat niet echt 'professioneel'?

Er zijn geen andere oplossingen?

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Je zou dat kunnen voorkomen door alleen ativiteit_id te selecteren in de voorgaande manier. En 1 andere query waar je alle activiteiten waar je in geinteresserd bent ophaalt. Dan kan je daarna tussen die arrays mappen. Je hebt dan dus 2 queries, en alleen ids dubbel. Of het sneller is betwijfel ik.

Verwijderd

Topicstarter
Na ff denken kan het misschien ook zo:

· query die alle activiteiten neerhaalt, die nog niet voorbij zijn (datum > nu)
code:
1
SELECT * FROM activiteit WHERE a_id > NOW()

· query die de hele avail. tabel leeghaalt, van activiteiten die nog moeten komen
code:
1
2
SELECT status,p_name FROM beschikbaarheid AS B, persoon AS P,activiteit AS A
WHERE B.a_id = A.a_id AND A.a_datum > NOW() AND B.p_id = P.p_id

· wat array manipulaties.

Is het op die manier ook te doen, of is dat een te grote omweg?