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.