Avatar billede nih Novice
18. april 2009 - 08:18 Der er 6 kommentarer og
1 løsning

ER-diagram medlemsdatabse med historik

Hej

Jeg søger erfaringer med opbygning af databaser med historik.

Helt konkret har jeg en database med flg. 3 tabeller og testdata:

personer (persID, persNavn, osv....)
1 Hans
2 Peter
3 Jens

medlemsStatus_List (medlStatusId, medlStatusNavn)
1 Udvalgsmedlem
2 Aktiv medlem
3 Bestyrelses medlem
4 Formand
5 Kasserer

medlemsStatus (persId, medlStatusId, dato, ja_nej, bem)
nøglefelter er: persId, medlStatusId og dato
1  2  '2008-01-01' - ja - "indmeldt via mail"
1  2  '2008-06-01' - nej - "utilfreds med træner"
1  3  '2008-06'-01 - ja - "valgt på mødet d. 20/5"

Jeg har brugt denne opbygning i lang tid, og den virker efter hensigten :) jeg har ihvertfald de oplysninger i databasen, som jeg ønsker. Efterhånden som tabellerne er vokset bliver mine forespørgsler dog noget tunge.
f.eks. er der oprettet 2 view's for at udtrække aktive medlemmer.

Spørgsmålet går derfor på, om der er nogle der har andre, mere effektive opbygninger med samme problemstiling.
evt. link

Niels
Avatar billede arne_v Ekspert
19. april 2009 - 01:57 #1
Umiddelbart virker strukturen ganske fornuftigt.

Performance problemerne skal sandsynligvis løses ved hjælp af index.

Du skal have index på alle felter som du joiner på.
Avatar billede nih Novice
19. april 2009 - 08:17 #2
Hej Arne

Det kan være det er mine view's der måske ikke er lavet 'rigtigt'

Jeg har f.eks. disse 2:
vwMedlMaxDato finder den nyeste dato for ændring i medlemsStatus.
vwMedlAktuelMedlStatus finder derefter hvad ændringen har været (meldt ind eller ud samt evt bemærkninger) for alle medlemmer.

vwMedlMaxDato:
SELECT persId, medlStatusId, MAX(dato) as maxDato
FROM medlemsStatus

vwMedlAktuelMedlStatus:
SELECT medlemsStatus.*
FROM vwMedlMaxDato INNER JOIN medlemsStatus ON
(vwMedlMaxDato.maxDato = medlemsStatus.Dato) AND
(vwMedlMaxDato.medlStatusId = medlemsStatus.medlStatusId) AND
(vwMedlMaxDato.persId = medlemsStatus.persId);

vwMedlAktuelMedlStatus bruger jeg overalt i min app og det er den jeg har på fornemmelsen ikke er lavet optimal.

mvh Niels
Avatar billede nih Novice
19. april 2009 - 08:19 #3
og jeg har selvfølgelig indeks på alle nøglefelter
Avatar billede arne_v Ekspert
20. april 2009 - 01:25 #4
Med de rette index burde selv nestede view være hurtige selv med mange tusinde rækker.

Har du studeret execution plan?
Avatar billede nih Novice
29. april 2009 - 16:27 #5
hej Arne tak for din interesse - vil du lægge et svar
Avatar billede arne_v Ekspert
29. april 2009 - 16:46 #6
ok
Avatar billede nih Novice
29. april 2009 - 16:52 #7
Til info er jeg begyndt at gå koden igennem istedet for, og har fundet en del uregelmæssigheder og unødvendige kald til databasen.
Det har hjulpet en del på performance

Niels
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester