Database-design
We zijn aan het begin van het project erg ambitieus te werk gegaan. Niet wetende hoeveel het onderzoek en het schrijfwerk in beslag zou nemen, hadden we bedacht dat het nuttig zou zijn als de applicatie de gegenereerde vragen zou kunnen opslaan. Daarnaast gingen we er op dat moment nog van uit dat de applicatie lokaal bij de gebruiker zou draaien (in plaats van gehost op een server).
Daaruit ontstond een simpel ERD dat slechts voorziet in het opslaan van de gegenereerde quizzes:
erDiagram
quizzes {
integer id PK
varchar(50) name
}
questions {
integer id PK
varchar(255) title
varchar(255) question
integer points
varchar(255) options
varchar(255) hint
varchar(255) feedback
integer quiz_id FK
varchar(10) question_type FK
}
question_types {
varchar(10) name PK
}
quizzes ||--o{ questions : contains
question_types ||--o{ questions : has
Hierna bedachten we dat het project mogelijk gehost zou worden, waarmee het noodzakelijk wordt om security te implementeren. Zodoende hebben we users toegevoegd. Daarnaast wilden we uitzoeken of het mogelijk is de embeddings op te slaan van de ingevoerde documenten en deze documenten in een collectie op te slaan. Dit zou mogelijk maken dat je zonder al teveel moeite opnieuw dezelfde (collectie van) documenten kunt gebruiken om een nieuwe quiz te genereren, of gemakkelijk aan een vorige quiz kunt sleutelen.
In het volgende ERD zijn dan ook de tabellen users, collections, documents en embeddings toegevoegd:
erDiagram
quizzes {
integer id PK
varchar(50) name
integer user_id FK
}
questions {
integer id PK
varchar(255) title
varchar(255) question
integer points
varchar(255) options
varchar(255) hint
varchar(255) feedback
integer quiz_id FK
varchar(10) question_type FK
}
question_types {
varchar(10) name PK
}
users {
integer id PK
varchar(80) first_name
varchar(80) last_name
varchar(80) username UK
varchar(80) password
}
collections {
integer id PK
varchar(255) title
varchar(255) metadata
integer user_id FK
}
collections_quizzes {
integer collection_id FK
integer quiz_id FK
}
documents {
integer id PK
varchar(255) text
}
embeddings {
integer id PK
varchar embedding
varchar(255) document
varchar(255) metadata
integer collection_id FK
integer document_id FK
}
quizzes ||--o{ questions : contains
question_types ||--o{ questions : has
users ||--o{ quizzes : owns
users ||--o{ collections : owns
collections ||--o{ collections_quizzes : contains
quizzes ||--o{ collections_quizzes : part_of
collections ||--o{ embeddings : embeds
documents ||--o{ embeddings : has
In het prototype
Tijdens het bepalen van de prioriteiten, is persistentie minder belangrijk gebleken. Hierdoor hebben we gekeken naar simpelere oplossingen voor de eerste versie van het prototype. Daarom hebben we uiteindelijk besloten de ERD's te archiveren en te gaan voor een tijdelijke persistentie middels Redis.
Wanneer je een quiz genereert wordt deze tijdelijk bewaart, samen met de embedding in Redis. Na een paar uur wordt deze data weer verwijderd. Toegang tot de quiz wordt verleend via de URL waar de applicatie automatisch heen navigeert wanneer de quiz gemaakt is. Deze URL bevat dan ook het quiz_id.