Db-ontwerp studentenantwoorden: context.

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
We hebben een (Drupal) systeem waarin studenten vragen maken. Antwoorden op die vragen worden opgeslagen in de tabel:

code:
1
2
3
(int) nid
(int) studentId
(text) antwoord


waarbij nid = de node id van de vraag. So far so good.

Nu kunnen vragen door docenten ook in andere "pagina's" (nodes) gehangen worden. Deze nodes kunnen zelf weer childnodes hebben waar ook weer vragen in gehangen kunnen worden. Childnodes's kunnen ook weer kinderen hebben, enz. Tenslotte: studenten kunnen in sommige nodes instellingen doen, die van invloed zijn op het antwoord op de vraag. De relatie tussen nodes, childnodes, instellingen en vragen is altijd many-to-many maar wel hiërarchisch (kinderen hebben niet hun voorouders als kind).

Docenten willen overzichten krijgen van antwoorden op vragen. De context (dus: of een vraag in een pagina hangt, welke dan en wat waren de evt instellingen) is hierbij erg belangrijk.

Hoe slaan we dit een beetje netjes op in de database? Onze huidige oplossing is dat we een context-string aanmaken, volgens het volgende stramien:

code:
1
(<nodeType>_<nid>)(#<settingKey>_<settingValue>)


bijv.

code:
1
book_1-page_4-page_8#temperature_50#valve_open


wat dus wil zeggen: deze vraag is beantwoord in de context van een book met nid 1 met als child page met nid 4 met als child met nid 8, waarop studenten voor de setting 'temperature' 50 heeft ingesteld en voor 'valve' de setting 'open'. Settings worden alfabetisch gesorteerd.

In de database wordt context opgeslagen als text-kolom. Het idee is dat we nu m.b.v. queries met reguliere expressies kunnen opvragen:
- geef mij alle antwoorden bij book 1
- geef mij alle antwoorden voor setting temperature 50 in page met nid 8
- enz.

Wat we feitelijk dus doen is een relationele hiërarchische structuur opslaan als platte tekst, om vervolgens daar met regulier expressies in te zoeken. Dit voelt niet zo goed, maar een goed alternatief weet ik ook niet, aangezien we niet van te voren weten hoe lagen een hiërarchie heeft. Wat denken jullie

Acties:
  • 0 Henk 'm!

  • emnich
  • Registratie: November 2012
  • Niet online

emnich

kom je hier vaker?

Je kan beginnen met de context en setting opslaan in hun eigen tabel, dus

contextID naam waarde
99 book 1

settingID naam waarde
52 temperatuur 50
53 valve open

Voor de parent-child zou ik gewoon het id van de parent opslaan. Als je weet dat het een kind is van 8 dan kan je daarvan kijken wie daar de vader van is (4) en zo verder.

Acties:
  • 0 Henk 'm!

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
Je kan beginnen met de context en setting opslaan in hun eigen tabel, dus
Maar wat win ik hiermee?
Voor de parent-child zou ik gewoon het id van de parent opslaan. Als je weet dat het een kind is van 8 dan kan je daarvan kijken wie daar de vader van is (4) en zo verder.
Nee, want dat kind kan kind zijn van meerdere ouders (m2m).

Acties:
  • 0 Henk 'm!

  • emnich
  • Registratie: November 2012
  • Niet online

emnich

kom je hier vaker?

Daarmee win je dat je niet meer met een regex hoeft te zoeken maar gewoon op ID kan zoeken. Je moet gewoon je data normaliseren.

Je krijgt dus naast de settings tabel een koppeltabel waarbij je de nid en de settingId aan elkaar koppelt:
nid settingId
[...]


Nee, want dat kind kan kind zijn van meerdere ouders (m2m).
Dan krijg je dus een koppeltabel, iets als:
nid parentId level
1 4 1
1 8 2

Dus nid is eerst een child van 8 en daarna een child van 4.

Alle data die je nu gestructureerd in een tekst veld zet, kan je ook gestructureerd in tabellen plaatsen.