Avatar billede tblaster Nybegynder
02. august 2006 - 21:35 Der er 27 kommentarer og
1 løsning

Ændring af database opbygning

Jeg står og skal have lavet en ændring i min databases opbygning. Kort fortalt går det ud på at ændre således at jeg kan tilknytte en kategori og post til en eller flere sprog, samt knytte en post til en eller flere kategorier.

Det nemmeste er nok at få et overblik over min nuværende og planlagte ændringer ved at se følgende billede:
http://www.dyrlund.dk/db.jpg

Mit spørgsmål går ud på om det er den rigtige måde at bygge det op på, eller om jeg skal gøre det på en anden måde. Det skal helst komme til at køre så hurtigt som muligt og være bygget op på den mest optimale måde mht. sql udtræk og opbygning. Databasen består pt. af ca. 700 kategorier og underkategorier og over 40.000 poster.


Til info, så arbejder jeg med ASP op imod MySQL databasen.

Og når jeg har styr på den nye opbygning, så skal der nok komme ekstra spørgsmål her (mod flere point) eller i et nyt spg. Jeg skal nemlig nok have hjælp til at ændre den nuværende datas opbygning til den nye vha. sql statements. Desuden bliver der noget med mine sql udtræk på mine side, men det tager vi når det bliver aktuelt!
Avatar billede arne_v Ekspert
04. august 2006 - 01:31 #1
der ser umiddelbart meget fornuftigt ud

jeg ville måske undlade id i KategoriXSprog men det er en smagssag

du har sikkert allerede fundet ud af at parentid->id ikke er så nemt altid i MySQL
Avatar billede tblaster Nybegynder
04. august 2006 - 02:03 #2
Og hastighedsmæssigt, kommer det så til at blive meget langsommer?
Avatar billede arne_v Ekspert
04. august 2006 - 02:08 #3
lidt p.g.a. de flere joins, men med de rigtige index vil jeg ikke være specielt bekymret
Avatar billede tblaster Nybegynder
04. august 2006 - 02:30 #4
Ok. Det lyder godt. Nu kommer alt det sjove så! Jeg skal have ændret mit nuværende data til den nye struktur. Jeg skal gerne have hjælp til at gøre dette ved hjælp af nogle sql sætninger. Jeg har oprettet de forskellige nye tabeller og skal have hjælp til følgende:

1.
Flytte navn fra tabellen kategorier over i kategoriXsprog. KID'et skal sættes lig ID'et på kategorier og Sprog skal bare sættes lig DK.

2.
Flytte parentid fra tabellen data over i dataXkategori. I tabellen dataXkategori er KID lig det parentid som posten har i data tabellen.
Avatar billede tblaster Nybegynder
04. august 2006 - 21:00 #5
Det var faktisk ikke så svært som jeg havde frygtet. Fik det løst vha. følgende:

1.
INSERT INTO kategorixsprog (KID, Navn) SELECT Id, Navn FROM kategorier
UPDATE kategorixsprog SET Sprog = 'DK'

2.
INSERT INTO dataxkategori (DID, KID) SELECT ID, ParentID FROM data

Så må jeg i gang med at rette alle min sql udtræk til. Jeg holder spørgsmålet åben hvis jeg skulle få brug for hjælp til det!
Avatar billede tblaster Nybegynder
05. august 2006 - 01:21 #6
Kan vi blive enige om at den bedste måde at lave de nye sql udtræk bliver:

LEFT JOIN dataXkategori ON data.ID = dataXkategori.DID
LEFT JOIN kategoriXsprog ON kategorier.ID = kategoriXsprog.KID
Avatar billede arne_v Ekspert
05. august 2006 - 02:03 #7
skal det være LEFT JOIN ?
Avatar billede tblaster Nybegynder
05. august 2006 - 14:27 #8
Hvad skal det eller? RIGHT JOIN?
Avatar billede tblaster Nybegynder
05. august 2006 - 15:50 #9
Hvordan skal denne sql ændres, så den virker med den nye struktur?

SELECT Count(*) as Antal FROM StemmerXIp as S, Data as D, Kategorier as K Where S.BrugerID = '1' and S.ID = D.ID and D.ParentID = K.ID And (K.ID = 0 " & IDer & " )
Avatar billede tblaster Nybegynder
05. august 2006 - 23:32 #10
Skal også have lidt hjælp til at rette følgende sql til, så den passer til den nye struktur:

Sql = "SELECT D.Id, D.ParentID, D.Navn, D.Stemmer, D.Score, D.Url, D.hits, D.dato, D.censur FROM Data D where D.ID not in (select S.ID from stemmerxip S where S.BrugerID ='" & Session("BrugerID") & "') and (" & Replace(Session("SqlSoeg"), "ParentID", "D.ParentID") & ") and (Sprog LIKE '%" & Session("Lang") & "%' or Sprog = 'All') and " & Session("CensurSql") & " Order By LENGTH(D.Tekst), D.Score/D.Stemmer desc LIMIT " & intStart & ", " & intPageSize & ";"
Avatar billede arne_v Ekspert
06. august 2006 - 02:38 #11
JOIN uden noget
Avatar billede arne_v Ekspert
06. august 2006 - 02:39 #12
for begge queries skal du vel tilføje de tabeller du har brug for og så nogle
ekstra where betingelse (svarende til ON i JOIN)
Avatar billede tblaster Nybegynder
06. august 2006 - 03:09 #13
Mht. join så ved jeg ikke hvorfor jeg ville have LEFT med, det er noget jeg altid har brugt.


Og mht. de 2 nævnte sql'er, så har jeg svært ved at samle det hele når jeg henter fra flere tabeller og har flere selects. Håber på at jeg kunne få hjælp til at ombygge de 2 sql'er. Skal naturligvis nok suppler med flere point.
Avatar billede arne_v Ekspert
06. august 2006 - 04:08 #14
LEFT betyder jo at den giver en række selvom tabellen til venstre ikke har noget
match i tabellen til højre

jeg tror ikke at det er aktuelt for dig
Avatar billede arne_v Ekspert
06. august 2006 - 04:13 #15
jeg kan bare ikke se nogen problemer

SELECT Count(*) as Antal FROM StemmerXIp as S, Data as D, Kategorier as K Where S.BrugerID = '1' and S.ID = D.ID and D.ParentID = K.ID And (K.ID = 0 " & IDer & " )

må vel blive til

SELECT Count(*) as Antal FROM StemmerXIp as S, Data as D, DataXKategorier as DXK, Kategorier as K Where S.BrugerID = '1' and S.ID = D.ID and D.ParentID = DXK.DID and DXK.KID = K.ID And (K.ID = 0 " & IDer & " )

eller ??
Avatar billede tblaster Nybegynder
07. august 2006 - 19:35 #16
Du havde ret. det var bare det der skulle gøres.

Kan du hjælpe med denne hvor jeg i forvejen har en join:
Sql = "SELECT D.Url, D.navn, D.ID FROM Data as D JOIN nyhedsbrev_templates_log L ON D.ID = L.DataID Where L.DataID IS NULL and (ParentID = 0 " & FindIDer(3) & ") Order By Score/Stemmer desc"

Jeg har prøvet med nedenstående men det trækker ingen poster ud:
Sql = "SELECT D.Url, D.navn, D.ID FROM Data as D, dataXkategori as dXk JOIN nyhedsbrev_templates_log L ON D.ID = L.DataID Where D.ID = dXk.DID and L.DataID IS NULL and (ParentID = 0 " & FindIDer(3) & ") Order By Score/Stemmer desc"
Avatar billede tblaster Nybegynder
07. august 2006 - 19:55 #17
Hvis jeg trækker joinen med nyhedsbrev_templates_log ud og kravet at L.DataID IS NULL, så får jeg fint posterne ud. Så det er sammenkoblingen af dette med de 2 andre tabeller der giver problemer. Er der nogen der kan se hvorfor?
Avatar billede tblaster Nybegynder
07. august 2006 - 19:58 #18
Og hvis jeg kun fjerner "L.DataID IS NULL" så får jeg de poster ud som ligger i nyhedsbrev_templates_log. Og det er netop alle andre poster jeg skal have ud end lige dem!
Avatar billede arne_v Ekspert
08. august 2006 - 02:40 #19
du skal nok ikke blande , join og JOIN join
Avatar billede arne_v Ekspert
08. august 2006 - 02:42 #20
Sql = "SELECT D.Url, D.navn, D.ID
FROM (Data as D JOIN dataXkategori as dXk ON D.ID = dXk.DID)
LEFT JOIN nyhedsbrev_templates_log L ON D.ID = L.DataID
Where L.DataID IS NULL and (ParentID = 0 " & FindIDer(3) & ") Order By Score/Stemmer desc"


måske
Avatar billede arne_v Ekspert
08. august 2006 - 02:43 #21
jeg brugte så en LEFT JOIN til det som skal være NULL
Avatar billede tblaster Nybegynder
08. august 2006 - 18:46 #22
Genial! Så virker det igen!
Avatar billede tblaster Nybegynder
14. august 2006 - 20:53 #23
Lige en sidste ting, skal jeg gøre noget for at få mine sql udtræk til at køre hurtiger, syntes de er noget langsommer efter opdateringen. Og hvilke "Indeks" skal jeg give de 4 tabeller?
Avatar billede arne_v Ekspert
15. august 2006 - 00:38 #24
alle felter som du bruger i ON og WHERE fraregnet dem som er et felts primær nøgler
Avatar billede tblaster Nybegynder
15. august 2006 - 16:54 #25
Takker for hjælpen med det hele. Har føjet 100 ekstra point til spørgsmålet! Smid endelig et svar!
Avatar billede arne_v Ekspert
15. august 2006 - 17:24 #26
svar
Avatar billede tblaster Nybegynder
15. august 2006 - 18:08 #27
Kan det passe at det fylder meget at oprette de indeks? Min database gik fra 9.1 MB til 15.2 MB. Men hvis det er normalt så er det jo fint. Vil hellere have at det fylder det mere mod at det så kørere det hurtigere!
Avatar billede arne_v Ekspert
15. august 2006 - 18:30 #28
det lyder ikke helt forkert

med korte raekker fylder index paent i forhold til data
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