Hopelijk staat deze in t juiste topic 
Ik ben bezig met een (access)-database waarin een grote set data moet komen te staan, maar het probleem is dat al deze data verschillende vormen heeft. Het gaat om tabelwaarden die op basis van één of meer parameters gevonden moeten worden, dus iets als:
tabel
De juiste waarde is te vinden door te zoeken op 2 parameters, dus:
SELECT waarde FROM tabel WHERE param1 = A and param2 = 3 levert: 20
Nu is het probleem dat er tientallen, honderden sets zijn met 1 tot wel 10 parameters, en voor elke set zijn de parameters anders benoemd. En het aantal sets kan zomaar uitgebreid worden met nieuwe sets met andere parameters
Dan zijn er drie oplossingen:
1) alles volledig normaliseren in afzonderlijke tabellen: geen beginnen aan en te inflexibel
2)
Dit vind ik geen fijne oplossing want de hele structuur van de sets zit in de kolomnamen. Heel veel kolomnamen (honderden) en elke aanpassing aan een set betekent aanpassingen aan de structuur van de database.
3) Andere oplossing
Voordeel: elke set waarden kan zoveel parameters gebruiken als er kolommen zijn. Nadeel: als het aantal kolommen niet toereikend is voor een nieuwe set betekent dat structurele aanpassingen. Groter nadeel vind ik dat de kolommen geen duidelijke naam hebben en je telkens moet gaan zoeken welke kolom ook al weer welke parameter vertegenwoordigd (zou op te lossen zijn met een "configuratietabel" waarin het systeem de juiste kolom aan de juiste parameter koppelt.
De juiste waarde vind je door SELECT waarde FROM tabel WHERE kolom1 = X AND kolom2 = Y and kolom3 = Z (waarbij je moet weten welke kolom waarvoor staat)
Nu heb ik een andere oplossing voor ogen, nl. met "meta-velden"
Tabel1:
tabel2
Dit levert een ultraflexibele structuur op, immers, de "kolomnamen" zijn nu records geworden en ik kan nu zonder enige invloed op de databasestructuur een nieuwe set opnemen met eender welke aantal parameters of parameterveldnamen.
Het nadeel is echter dat zoeken in deze structuur wat lastiger is en ook kan deze "virtuele" tabel niet meer aan bijv. een userform gekoppeld worden. Dat laatste is niet zo'n probleem, alleen ben ik niet helemaal tevreden met de manier waarop ik nu mijn "waarde" op kan zoeken.
Ik moet nl. de twee tabellen aan elkaar knopen en in dezelfde kolom gaan zoeken naar één waarde die aan alle parameters voldoet.
Een
Een
Er is echter maar één waarde die aan allebei de voorwaarden voldoet, maar hoe vind ik die?
Ik hoop dat het een beetje duidelijk is wat de bedoeling is.
Misschien dat het helpt om duidelijk te maken wat ik bedoel: een site als Wordpress is gebaseerd op een dergelijk datamodel: alle tabellen zitten verstopt in een dergelijke structuur en de "relatie" zijn verwijzingen naar kolommen binnen de tabellen zelf en in de basis zijn er maar twee tabellen: de "waarden" en de "metavelden" (post+postmeta)
Ik heb een mogelijke oplossing, maar daar ben ik niet zo enthousiast op (nl. van alle gevonden waarden tellen aan hoeveel van de gezochte parameters deze voldoet. Alleen degene met de hoogst aantal "hits" is de waarde die ik zoek)
Ik ben bezig met een (access)-database waarin een grote set data moet komen te staan, maar het probleem is dat al deze data verschillende vormen heeft. Het gaat om tabelwaarden die op basis van één of meer parameters gevonden moeten worden, dus iets als:
tabel
code:
1
2
3
4
5
6
7
| waarde lengte breedte 10 A 1 15 A 2 20 A 3 30 B 1 40 B 2 50 B 3 |
De juiste waarde is te vinden door te zoeken op 2 parameters, dus:
SELECT waarde FROM tabel WHERE param1 = A and param2 = 3 levert: 20
Nu is het probleem dat er tientallen, honderden sets zijn met 1 tot wel 10 parameters, en voor elke set zijn de parameters anders benoemd. En het aantal sets kan zomaar uitgebreid worden met nieuwe sets met andere parameters
Dan zijn er drie oplossingen:
1) alles volledig normaliseren in afzonderlijke tabellen: geen beginnen aan en te inflexibel
2)
code:
1
2
3
4
5
6
7
8
9
| waarde lengte breedte dichtheid gewicht etc set1 10 AB x 15 AC y 20 AD z set2 30 B 1 40 B 2 50 B 3 |
Dit vind ik geen fijne oplossing want de hele structuur van de sets zit in de kolomnamen. Heel veel kolomnamen (honderden) en elke aanpassing aan een set betekent aanpassingen aan de structuur van de database.
3) Andere oplossing
code:
1
2
3
4
5
6
7
8
9
10
11
12
| waarde kolom1 kolom2 kolom3 etc set1 10 A 1 15 A 2 20 A 3 30 B 1 40 B 2 50 B 3 set2 zz 123 434 543 yy 432 767 656 vv 765 432 32 |
Voordeel: elke set waarden kan zoveel parameters gebruiken als er kolommen zijn. Nadeel: als het aantal kolommen niet toereikend is voor een nieuwe set betekent dat structurele aanpassingen. Groter nadeel vind ik dat de kolommen geen duidelijke naam hebben en je telkens moet gaan zoeken welke kolom ook al weer welke parameter vertegenwoordigd (zou op te lossen zijn met een "configuratietabel" waarin het systeem de juiste kolom aan de juiste parameter koppelt.
De juiste waarde vind je door SELECT waarde FROM tabel WHERE kolom1 = X AND kolom2 = Y and kolom3 = Z (waarbij je moet weten welke kolom waarvoor staat)
Nu heb ik een andere oplossing voor ogen, nl. met "meta-velden"
Tabel1:
code:
1
2
3
4
5
| waardeID waarde 1 10 2 15 3 AC 4 AB |
tabel2
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| metaID waardeID metaveld metavalue set1 1 1 lengte 23 2 1 breedte 10 3 2 lengte 45 4 2 breedte 20 set2 5 3 dichtheid 543 6 3 gewicht 23 7 3 materiaal B 8 4 dichtheid 123 9 4 gewicht 12 10 4 materiaal A |
Dit levert een ultraflexibele structuur op, immers, de "kolomnamen" zijn nu records geworden en ik kan nu zonder enige invloed op de databasestructuur een nieuwe set opnemen met eender welke aantal parameters of parameterveldnamen.
Het nadeel is echter dat zoeken in deze structuur wat lastiger is en ook kan deze "virtuele" tabel niet meer aan bijv. een userform gekoppeld worden. Dat laatste is niet zo'n probleem, alleen ben ik niet helemaal tevreden met de manier waarop ik nu mijn "waarde" op kan zoeken.
Ik moet nl. de twee tabellen aan elkaar knopen en in dezelfde kolom gaan zoeken naar één waarde die aan alle parameters voldoet.
code:
1
2
| SELECT tabel1.Waarde, tabel2.MetaKey, tabel2.MetaValue FROM tabel1 INNER JOIN tabel2 ON tabel1.WaardeID = tabel2.waardeID |
Een
code:
levert niets op, want geen enkele record voldoet daaraan. Een metaveld is nl. maar één waarde, dus niet param2 en param11
| WHERE (metaveld="param1set1" AND metavalue=X) AND (metaveld="param2set1" and metavalue=y) |
Een
code:
levert meerdere records op, want er voldoen meer "waarden" aan één van beide eisen.1
| WHERE (metaveld="param1set1" AND metavalue=X) OR (metaveld="param2set1" and metavalue=y) |
Er is echter maar één waarde die aan allebei de voorwaarden voldoet, maar hoe vind ik die?
Ik hoop dat het een beetje duidelijk is wat de bedoeling is.
Misschien dat het helpt om duidelijk te maken wat ik bedoel: een site als Wordpress is gebaseerd op een dergelijk datamodel: alle tabellen zitten verstopt in een dergelijke structuur en de "relatie" zijn verwijzingen naar kolommen binnen de tabellen zelf en in de basis zijn er maar twee tabellen: de "waarden" en de "metavelden" (post+postmeta)
Ik heb een mogelijke oplossing, maar daar ben ik niet zo enthousiast op (nl. van alle gevonden waarden tellen aan hoeveel van de gezochte parameters deze voldoet. Alleen degene met de hoogst aantal "hits" is de waarde die ik zoek)
[ Voor 3% gewijzigd door Stefke op 27-02-2013 17:22 ]