"Martin Larsen" <want@no.spam> skrev i en meddelelse
news:gtag2l$2ur9$1@newsbin.cybercity.dk...
> Hej alle
>
> I forbindelse med en opgave hvor en applikation skal tilpasses en helt ny
> tabelstruktur med et meget stort konverteringsarbejde til følge, er jeg
> kommet frem til at den bedste og hurtigste løsning er at lave et view i
> den nye DB som "emulerer" den gamle struktur. Hvis dette er muligt, skal
> der kun rettes minimalt i applikationen.
>
> Min første tanke var at det måtte være muligt, men efter en masse
> overvejelser og eksperimenter er jeg knap så sikker!
>
> Nedenstående stærkt simplificerede eksempel viser strukturen i den
> eksisterende tabel:
>
> id, frugt, farve, form
>
> fx:
> 1,banan,gul,krum
> 2,æble,rød,rund
> 3,avocado,grøn,pæreformet
>
> Den nye struktur er således:
>
> id, feltnavn, værdi
>
> fx:
> 1,frugt,banan
> 1,farve,gul
> 1,form,krum
>
> 2,frugt,æble
> 2,farve,rød
> 2,form,rund
>
> osv.
>
> Dvs. man i den eksisterende struktur kan sige :
> SELECT frugt,farve,form FROM frugter where id=1
>
> I den nye struktur må man sige fx:
> SELECT værdi FROM mintabel where id=1 AND feltnavn="frugt"
> SELECT værdi FROM mintabel where id=1 AND feltnavn="farve"
> SELECT værdi FROM mintabel where id=1 AND feltnavn="form"
>
> Årsagen til den nye struktur er at brugerne selv kan oprette felterne, og
> i den eksisterende struktur skal hver ændring afspejles af en strukturel
> ændring i databasen hvilket er noget rod. I den nye struktur skal der ikke
> ændres noget i databasen uanset hvor mange felter brugeren vil oprette.
>
> Spørgsmålet er nu om man kan lave fx et (self)JOIN som konverterer den nye
> struktur til den gamle. Ideen er at lave et view i den nye struktur som
> danner den flade struktur fra den gamle DB.
>
> Jeg har prøvet forskellige variationer over dette tema:
>
> SELECT t2.værdi AS frugt, t3.værdi AS farve, t4.værdi AS form
> FROM mintabel t1
> INNER JOIN mintabel t2
> ON t1.id=t2.id AND t2.feltnavn="frugt"
> INNER JOIN mintabel t3
> ON t1.id=t3.id AND t3.feltnavn="farve"
> INNER JOIN mintabel t4
> ON t1.id=t4.id AND t4.feltnavn="form"
> WHERE id=1
>
> Men det giver for mange rækker - det skal jo kun give én. Og rækkefølgen
> af felterne passer heller ikke.
>
> Er der nogen som har ideer til hvordan dette kan laves?
> Hvis jeg ikke har forklaret mig grundigt nok, så sig endelig til!
>
> Det er i MySQL 5.
>
> Hilsen og tak på forhånd
> Martin
Jeg vil mene, at du er på rette spor med din forespørgsel, men har en join
for meget med:
CREATE VIEW mitview AS (
SELECT t1.id, t1.værdi AS frugt, t2.værdi AS farve, t3.værdi AS form
FROM mintabel t1
INNER JOIN mintabel t2 ON t1.id=t2.id AND t2.feltnavn="farve"
INNER JOIN mintabel t3 ON t1.id=t3.id AND t3.feltnavn="form"
WHERE t1.feltnavn="frugt")
Så burde du kunne bruge din normale forespørgsel mod dette view.
Måske skulle du også overveje at bruge en LEFT OUTER JOIN i viewet i stedet
for INNER JOIN, hvis du ikke er absolut sikker på, at der ALTID bliver
indtastet en række til de to attributter, farve og form.