Avanceret søgning

Tags:    databaser

Hej!

Jeg er ved at lave en avanceret bruger søgning, som jeg gerne vil lave så effektiv som muligt.

For at simplificere det kan vi sige, at man kan søge på:
- køn (0 = hunkøn,1 = hankøn,2 = par)
- alder (0->99)
- bopæl (0 = jylland, 1 = fyn, 2 = sjælland)

Jeg ville altså lave tabellerne således (igen simplificeret):

tableUsers
- idUser
- strUsername

tableGenderToUsers
- idGender
- ridUser

tableAgeToUsers
- idAge
- ridUser

tableAreaToUsers
- idArea
- ridUser

Det er muligt at vælge f.eks. alle aldersgrupper, men kun søge efter folk i odense - hvilket gør det temmeligt ubrugeligt blot at lave en enkelt table med indexes. Derfor har jeg lavet index-tabellerne.

Mit spørgsmål er så - hvordan ville en effektiv SELECT sætning se ud, hvis man f.eks. ville hente:
- Alle brugere fra FYN med en alder mellem 20 og 60
- Alle HUNKØN i JYLLAND

Jeg har leget lidt med ideen om at lave en SQL sætning således:
SELECT tableUsers.* FROM tableUsers WHERE idUser IN(SELECT ridUser FROM tableGenderToUsers WHERE idGender = 2 AND ridUser IN(SELECT ridUser FROM tableAreaToUsers WHERE idArea IN(1,2)))

Men det ser blot ud til at dette databaseopslag er enormt langsomt, og en explain sætning viser da også at det langt fra er effektivt...

There - undskyld den lange stil - og jeg håber der er nogle der kan / vil hjælpe! Tusind tak :)



3 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Hvorfor har du valgt at lave en tabel til alder? Vil det ikke være nemmere og hurtigere at have alderen stående i et integerfelt i tableUsers? Der er så vidt heller ikke noget i vejen for at have de andre ting stående direkte i tableUsers . Det vil sige at du kan smide alle de data ind i en enkelt tabel, det vil gøre søgningen meget hurtigere.

Her er et eksempel på hvordan det kan gøres med de tabeller du har valgt at bruge:
Fold kodeboks ind/udKode 






at skrive par i køn er da lidt af en fejl, medmindre da det er et nyt køn jeg ikke kender til. Rent faktisk er par det eneste jeg ville mene krævet en separat tabel,fordi ikke alle mennesker er et par.

tablePar
idUser
idUser2

ved at lægge det ind i par får du problemet med hvis de pludselig ikke er et par længere hvad køn er de så?



Hej med jer

Løsningen var inner join :) Så jeg takker!

Tabel til alder - disse var blot eksempler... Men ideen med det er, at man f.eks. kan søge på disse felter:

alder
område
køn
ryger
kropsbygning
osv osv osv...

Dermed er det umuligt at lave et effektivt index på en tabel hvis man vælger at opbevare alle disse værdier i den - simpelthen fordi nogen gange vil man vælge at søge på personer fra Århus som ikke er rygere, og altså ikke vælge noget i de andre værdier.. Derfor ville den skulle skanne hele tabellen igennem for hver søgning (og der kunne tænkes at komme rigtig mange søgninger i sekundet)

Nørden: du har selvf. ret - der kommer heller ikke "par" med, det var blot for eksemplets skyld :)



t