Opbouw hulp voor database

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Yllnath
  • Registratie: Mei 2009
  • Laatst online: 08-06 09:56
Hallo allemaal,

Voor mijzelf (en een beetje voor mijn vrouw) ben ik bezig met een project om een website te maken voor een soort van beroepskeuze test voor haar.

Simpel gezegd, we hebben een lijstje met 40 beroepen, die steeds als eliminatie voor elke test in 2 kolommen tegen over elkaar worden gezet, waaruit 1 optie gekozen moet worden, zoals dit:
o Beroep A x Beroep B
x Beroep C o Beroep D

o Beroep B x Beroep C

Beroep C wint (bij wijze van spreken)

Met 40 beroepen heb je dus in de eerste ronde 2 kolommen van 20 opties. Daarna krijg je dus een 10 vs 10 > 5 vs 5, en wanneer er 5 over zijn moeten deze nog gerangschikt kunnen worden in een top 5 situatie.

Mijn vrouw maakt het niet zo uit of ik dit maak of niet, ze is alleen maar een beetje aan het rondkijken of ze misschien wil herscholen naar iets anders. Maar mij lijkt het daarentegen een erg leuk projectje om deze site te maken.

De reden dat ik in de knoop kom met mijn data structuur is dat ik de volgende dingen wil realiseren.
- Natuurlijk moet er een basistabel komen waarin alle beroepen staan opgenomen.
- Er moet een tabel komen met wat gebruikersinformatie, vrienden/familie moeten de test kunnen invoeren en gelinkt kunnen worden aan die ingevoerde tests.
- Er moet een complete historie van de ingevoerde tests wordt opgeslagen, niet alleen de top 5.

Voor die laatste eis een voorbeeld schets als toevoeging:
Test (ID = datumtijd + 00volgnummer)
Ingevoerd door: Persoon A

Pagina (/ronde) 3 (Pagina's 1 en 2 zijn in feite hetzelfde, alleen veel meer opties)
o Beroep A x Beroep I
x Beroep B o Beroep J
o Beroep C x Beroep K
x Beroep D o Beroep L
o Beroep E x Beroep M

Pagina 4
1 Beroep K
2 Beroep D
3 Beroep M
4 Beroep B
5 Beroep I

Het gaat me erom dat ik elke stap van de invoer kan terugkijken. Bijvoorbeeld, op pagina 1 had jantje optie A en optie M tegenover elkaar staan. Ik vind het leuk om terug te zien dat hij daar voor optie A heeft gekozen over optie M. Op pagina 2 kan bijvoorbeeld heel goed optie A vervolgens ge-elimineerd zijn tegenover optie N, maar het is ook interessant om bij te houden dat optie A het dus beter heeft gedaan ten opzichte van M. Dus zelfs wanneer deze optie A niet in de top 5 van deze test voorkomt. Op deze manier kan je dus een logica creëren om in feite een rapport te hebben met een top 40 gebaseerd op welke het meest in de top 5 zijn terecht gekomen, maar ook welke vaker gekozen zijn over andere opties in eerdere rondes. Als optie A bijvoorbeeld voortdurend in de laatste ronde sneuvelt, dan kan je stellen dat dat een interessantere optie is dan een optie die nooit gekozen wordt op welke test dan ook.


Ik wil dus een tabel die dus voor elke ingevoerde test een:
- ID genereert (op basis van datum/tijd)
- User ID van invoerder
- Bijhoudt per ronde (mogelijk verschillende tabellen per ronde?) welke opties tegen over elkaar staan. Ik wil dit namelijk randomizen zodat elke keer dat je de test invoert, de eliminatie net wat anders kan verlopen
- Bijhoudt welke opties per ronde voor wordt gekozen
- Bijhoudt de volgorde van de laatste 5

Zelf zat ik te denken aan de volgende tabel structuur, maar mogelijk is dit helemaal niet logisch of efficiënt. Query technisch is het in ieder geval alles behalve efficiënt.

Tabel test resultaten
Veld ID
Veld User_ID
Veld Round1_LeftColumnOptions VARCHAR
Veld Round1_RightColumnOptions VARCHAR
Veld Round1_SelectedOptions VARCHAR
Veld Round2_LeftColumnOptions VARCHAR
Veld Round2_RightColumnOptions VARCHAR
Veld Round2_SelectedOptions VARCHAR
Veld Round3_LeftColumnOptions VARCHAR
Veld Round3_RightColumnOptions VARCHAR
Veld Round3_SelectedOptions VARCHAR
Veld Round4_Top5Result VARCHAR

In elk van deze velden wordt dan een komma gescheiden string opgeslagen die ik 1 op 1 kan ophalen en in een arraylist kan gooien om daar te verwerken.
Voor opslag en voor individueel weer gemaakte testen ophalen en weergeven is dit meer dan voldoende, in feite maak ik op deze alleen maar een letterlijke screenshot van wat de gebruiker toentertijd heeft ingevoerd en geeft die screenshot weer opnieuw weer.

Voor rapportage doeleinden is dit echter verschrikkelijk. Dan moet ik voor elke test ID een arraylist maken en winnaars met elkaar gaan zitten vergelijken.

Maar hoe ik de datastructuur moet maken dat ik ook dit efficiënt kan doen, weet ik dus niet, en is dus de reden van mijn post.
Ik heb mij nu een aantal uren d.m.v. o.a. google blind lopen staren op verschillende bizarre tabel constructies, en ik kom er nu helaas echt niet meer uit.
Zou iemand hier mij kunnen helpen met hoe ik mijn tabel kan opbouwen voor het beschreven doeleinde?

Bedankt voor de hulp!

Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Je bent bekend met Wikipedia: Databasenormalisatie?

Ik zou eerst beginnen met minimaal de eerste twee normaalvormen te beschrijven om dan door te gaan naar de derde :)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • Yllnath
  • Registratie: Mei 2009
  • Laatst online: 08-06 09:56
Bedankt voor je reactie. Een erg helder artikel, maar al in zekere mate bekend van eerder gemaakte databases. Voor de 2e NV wordt data bijvoorbeeld ondergebracht in een andere tabel die in de 1e NV bij elkaar in 1 tabel werd geplaatst. Dit is alleen niet echt van toepassing op mijn test_resultaten tabel.
Ik haal natuurlijk al wel persoonsgegevens uit de persoon tabel, één persoon kan uiteindelijk uiteraard meer als 1 test maken. Maar de test resultaten en de opbouw van de test in kwestie zijn onlosmakelijk verbonden aan 1 test. (opbouw veranderd per keer vanwege randomizing volgorde)

Nou kan ik i.p.v. kolommen en grote 'dumpvelden', kiezen voor een tabel met 60 + 30 + 15 + 5 = 110 unieke veldnamen kiezen voor elk record in die tabel (+2 voor ID en user_ID), maar dat wordt dan een verschrikkelijk onoverzichtelijke tabel. Niet te bedenken de queries om 112 velden steeds te vullen of gegevens uit velden op te halen.

Nou zat ik nog te denken om test_resultaten op te splitsen in 2 tabellen, één specifiek voor de opbouw en 1 voor de resultaten, oftewel:
1 tabel die onthoudt in welke volgorde welke beroepen werden weergegeven in alle 4 stappen;
1 tabel die onthoudt welke beroepen gekozen werden en in welke volgorde de top 5 uiteindelijk is geplaatst.

Maar echt een toegevoegde waarde behalve overzichtelijkheid heeft dit niet.

Dus helaas lijkt het mij (althans dat denk ik) niet mogelijk om de test gegevens verder uit elkaar te trekken, aangezien hier dubbele gegevens niet kunnen voortkomen.

Hier bijvoorbeeld een simpel opzetje om een idee te krijgen wat ik nou precies bedoel:
https://docs.google.com/s...FabENQR1JTVEtMTTJoUlY3NFE

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Het hangt er nogal van af wat je met die gegevens wil gaan doen. Stel dat je later vragen van het type 'hoeveel mensen kozen er voor optie x' wil beantwoorden, dan is het wel zo handig als je dat met iets als sql gewoon kan doen. 100+ velden in 50+ rijen lijkt me niet zo'n issue, daarvoor automatiseer je nu eenmaal :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten