Mysql
 sql >> Database >  >> RDS >> Mysql

Guida alla progettazione di database per quiz in MySQL

Questo tutorial fornisce passaggi completi per progettare uno schema di database di test online e sistemi di quiz per gestire utenti, quiz, domande, risposte e take. Può essere ulteriormente utilizzato per sviluppare test online o siti Web o applicazioni basati su quiz.

Il diagramma della relazione tra entità o il design del database visivo è mostrato di seguito.

Fig 1

Note :Limita solo gli utenti che hanno effettuato l'accesso a rispondere al quiz per evitare lo spamming. I quiz sono considerati brevi rispetto ai test.

Puoi anche visitare i tutorial popolari tra cui Come installare MySQL 8 su Ubuntu, Come installare MySQL 8 su Windows, Database RBAC in MySql, Database del blog in MySql, Impara le query SQL di base in MySQL.

Database dei quiz

Il primo passo è creare il database dei quiz. Può essere creato utilizzando la query come mostrato di seguito.

CREATE SCHEMA `quiz` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Ho usato il set di caratteri utf8mb4 per supportare un'ampia gamma di caratteri.

Tabella utenti

In questa sezione, progetteremo la Tabella utente per memorizzare le informazioni sull'utente. La stessa tabella può essere utilizzata per mettere in relazione gli host dei quiz in modo che gli utenti possano gestire i propri quiz e tenere traccia delle riprese. Di seguito è riportata la descrizione di tutte le colonne della Tabella Utente.

ID L'ID univoco per identificare l'utente.
Nome Il nome dell'utente.
Secondo nome Il secondo nome dell'utente.
Cognome Il cognome dell'utente.
Cellulare Il numero di cellulare dell'utente. Può essere utilizzato per scopi di accesso e registrazione.
E-mail L'e-mail dell'utente. Può essere utilizzato per scopi di accesso e registrazione.
Hash password L'hash della password generato dall'algoritmo appropriato. Dobbiamo evitare di memorizzare password semplici.
Ospite Il flag per identificare se l'utente può ospitare un quiz.
Registrato presso Questa colonna può essere utilizzata per calcolare la vita dell'utente con l'applicazione.
Ultimo accesso Può essere utilizzato per identificare l'ultimo accesso dell'utente.
Introduzione La breve introduzione dell'Utente Host da visualizzare nella Pagina Test o Quiz.
Profilo I dettagli del proprietario da visualizzare nella pagina del test o del quiz.

La tabella utente con i vincoli appropriati è quella mostrata di seguito.

CREATE TABLE `quiz`.`user` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`firstName` VARCHAR(50) NULL DEFAULT NULL,
`middleName` VARCHAR(50) NULL DEFAULT NULL,
`lastName` VARCHAR(50) NULL DEFAULT NULL,
`mobile` VARCHAR(15) NULL,
`email` VARCHAR(50) NULL,
`passwordHash` VARCHAR(32) NOT NULL,
`host` TINYINT(1) NOT NULL DEFAULT 0,
`registeredAt` DATETIME NOT NULL,
`lastLogin` DATETIME NULL DEFAULT NULL,
`intro` TINYTEXT NULL DEFAULT NULL,
`profile` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_mobile` (`mobile` ASC),
UNIQUE INDEX `uq_email` (`email` ASC) );

Tabella dei quiz

In questa sezione, progetteremo la Tabella dei quiz per memorizzare i dati del quiz. Di seguito è riportata la descrizione di tutte le colonne della Tabella dei Quiz.

ID L'ID univoco per identificare il quiz.
ID host L'ID host per identificare l'host del quiz.
Titolo Il titolo del quiz da visualizzare nella pagina del quiz e negli elenchi.
Metatitolo Il meta titolo da utilizzare per il titolo del browser e SEO.
Slug Lo slug per formare l'URL.
Riepilogo Il riepilogo per citare i punti salienti.
Tipo Il tipo per distinguere tra test e quiz.
Punteggio Il punteggio totale del quiz.
Pubblicato Può essere utilizzato per identificare se il test/quiz è disponibile pubblicamente.
Creato a Memorizza la data e l'ora in cui viene creato il test/quiz.
Aggiornato a Memorizza la data e l'ora in cui il test/quiz viene aggiornato.
Pubblicato su Memorizza la data e l'ora in cui viene pubblicato il test/quiz.
Inizia alle Memorizza la data e l'ora in cui il test/quiz inizia e si apre per le riprese.
Termina alle Memorizza la data e l'ora in cui il test/quiz si chiude per le riprese.
Contenuto La colonna utilizzata per memorizzare i dati del test/quiz.

La tabella dei quiz con i vincoli appropriati è quella mostrata di seguito.

CREATE TABLE `quiz`.`quiz` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`hostId` BIGINT NOT NULL,
`title` VARCHAR(75) NOT NULL,
`metaTitle` VARCHAR(100) NULL,
`slug` VARCHAR(100) NOT NULL,
`summary` TINYTEXT NULL,
`type` SMALLINT(6) NOT NULL DEFAULT 0,
`score` SMALLINT(6) NOT NULL DEFAULT 0,
`published` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`publishedAt` DATETIME NULL DEFAULT NULL,
`startsAt` DATETIME NULL DEFAULT NULL,
`endsAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_slug` (`slug` ASC),
INDEX `idx_quiz_host` (`hostId` ASC),
CONSTRAINT `fk_quiz_host`
FOREIGN KEY (`hostId`)
REFERENCES `quiz`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

Quiz Meta

La Meta Table del quiz può essere utilizzata per memorizzare informazioni aggiuntive su test o quiz, incluso l'URL del banner del quiz, ecc. Di seguito è menzionata la descrizione di tutte le colonne della Meta Table del quiz.

ID L'ID univoco per identificare il meta del quiz.
ID quiz L'ID del quiz per identificare il test/quiz genitore.
Chiave La chiave che identifica il meta.
Contenuto La colonna utilizzata per memorizzare i metadati del quiz.

La Meta Table del Quiz con i vincoli appropriati è quella mostrata di seguito.

CREATE TABLE `quiz`.`quiz_meta` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`quizId` BIGINT NOT NULL,
`key` VARCHAR(50) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_meta_quiz` (`quizId` ASC),
UNIQUE INDEX `uq_quiz_meta` (`quizId` ASC, `key` ASC),
CONSTRAINT `fk_meta_quiz`
FOREIGN KEY (`quizId`)
REFERENCES `quiz`.`quiz` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

Tabella delle domande del quiz

La Tabella delle domande del quiz può essere utilizzato per memorizzare le domande relative a test e quiz. Di seguito è riportata la descrizione di tutte le colonne della Tabella delle domande del quiz.

ID L'ID univoco per identificare la domanda del quiz.
ID quiz L'ID del quiz per identificare il test/quiz genitore.
Tipo Il tipo di domanda. Il tipo può essere a scelta singola (Sì/No), a scelta multipla o seleziona. Possiamo anche avere type come input e textarea nel caso in cui il risultato del quiz necessiti di controlli manuali.
Attivo Segnala per identificare se la domanda è attiva. Un quiz può avere più domande, ma rimangono attive solo le domande selettive alla volta.
Livello Il livello della domanda per identificare se è facile, medio o difficile.
Punteggio Il punteggio di una singola domanda. Prima di pubblicare il quiz, dobbiamo assicurarci che siano attive solo domande selettive e che il punteggio totale delle domande attive sia uguale al punteggio del quiz.
Creato a Memorizza la data e l'ora in cui viene creata la domanda.
Aggiornato a Memorizza la data e l'ora in cui la domanda viene aggiornata.
Contenuto La colonna utilizzata per memorizzare la domanda.

La tabella delle domande del quiz con i vincoli appropriati è quella mostrata di seguito.

CREATE TABLE `quiz`.`quiz_question` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`quizId` BIGINT NOT NULL,
`type` VARCHAR(50) NOT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 0,
`level` SMALLINT(6) NOT NULL DEFAULT 0,
`score` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_question_quiz` (`quizId` ASC),
CONSTRAINT `fk_question_quiz`
FOREIGN KEY (`quizId`)
REFERENCES `quiz`.`quiz` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

Tabella delle risposte ai quiz

La Tabella delle risposte ai quiz può essere utilizzato per memorizzare le risposte di domande a scelta singola, a scelta multipla e di tipo selezionato. Nel caso di una domanda a scelta singola, le risposte possono essere Sì e No. Di seguito è riportata la descrizione di tutte le colonne della Tabella delle Risposte del Quiz.

ID L'ID univoco per identificare la risposta del quiz.
ID quiz L'ID del quiz per identificare il test/quiz genitore.
ID domanda L'ID domanda per identificare la domanda principale.
Attivo Segnala per identificare se la risposta è attiva.
Corretto Segnala per identificare se la risposta è corretta.
Creato a Memorizza la data e l'ora in cui viene creata la risposta.
Aggiornato a Memorizza la data e l'ora in cui viene aggiornata la risposta.
Contenuto La colonna utilizzata per memorizzare la risposta.

La tabella delle risposte ai quiz con i vincoli appropriati è quella mostrata di seguito.

CREATE TABLE `quiz`.`quiz_answer` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`quizId` BIGINT NOT NULL,
`questionId` BIGINT NOT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 0,
`correct` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_answer_quiz` (`quizId` ASC),
CONSTRAINT `fk_answer_quiz`
FOREIGN KEY (`quizId`)
REFERENCES `quiz`.`quiz` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

ALTER TABLE `quiz`.`quiz_answer`
ADD INDEX `idx_answer_question` (`questionId` ASC);
ALTER TABLE `quiz`.`quiz_answer`
ADD CONSTRAINT `fk_answer_question`
FOREIGN KEY (`questionId`)
REFERENCES `quiz`.`quiz_question` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Prendi il tavolo

In questa sezione, progetteremo il Take Table per tenere traccia delle iscrizioni e dei tempi dei tentativi degli utenti ai quiz. Di seguito è riportata la descrizione di tutte le colonne della Take Table.

ID L'ID univoco per identificare la ripresa.
ID utente L'ID utente per identificare chi risponde al quiz.
ID quiz L'ID del quiz per identificare il quiz.
Stato Lo stato del Take. Può essere registrato, avviato, sospeso, terminato, dichiarato.
Punteggio Il punteggio totale ottenuto dall'utente.
Creato a Memorizza la data e l'ora in cui viene creata la ripresa.
Aggiornato a Memorizza la data e l'ora in cui il Take viene aggiornato.
Iniziato a Memorizza la data e l'ora in cui è iniziata la ripresa.
Fine alle Memorizza la data e l'ora in cui il Take è terminato.
Contenuto La colonna utilizzata per memorizzare i commenti sul take.

La Take Table con i vincoli appropriati è quella mostrata di seguito.

CREATE TABLE `quiz`.`take` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`quizId` BIGINT NOT NULL,
`status` SMALLINT(6) NOT NULL DEFAULT 0,
`score` SMALLINT(6) NOT NULL DEFAULT 0,
`published` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`startedAt` DATETIME NULL DEFAULT NULL,
`finishedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_take_user` (`userId` ASC),
CONSTRAINT `fk_take_user`
FOREIGN KEY (`userId`)
REFERENCES `quiz`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

ALTER TABLE `quiz`.`take`
ADD INDEX `idx_take_quiz` (`quizId` ASC);
ALTER TABLE `quiz`.`take`
ADD CONSTRAINT `fk_take_quiz`
FOREIGN KEY (`quizId`)
REFERENCES `quiz`.`quiz` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Prendi la tabella delle risposte

La Tabella Accetta Risposte può essere utilizzato per memorizzare le risposte selezionate dall'utente durante lo svolgimento del quiz. Nel caso di una domanda a scelta multipla, possono esserci più risposte. Di seguito è indicata la descrizione di tutte le colonne della Take Answer Table.

ID L'ID univoco per identificare la risposta take.
Prendi ID L'ID take per identificare il tentativo di quiz.
ID risposta L'ID risposta per identificare la risposta del quiz.
Attivo Segnala per identificare se la risposta è attiva.
Creato a Memorizza la data e l'ora in cui viene creata la risposta.
Aggiornato a Memorizza la data e l'ora in cui viene aggiornata la risposta.
Contenuto La colonna utilizzata per memorizzare la risposta in caso di domande di tipo input o textarea.

La tabella Take Answer con i vincoli appropriati è quella mostrata di seguito.

CREATE TABLE `quiz`.`take_answer` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`takeId` BIGINT NOT NULL,
`questionId` BIGINT NOT NULL,
`answerId` BIGINT NOT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_answer_take` (`takeId` ASC),
CONSTRAINT `fk_answer_take`
FOREIGN KEY (`takeId`)
REFERENCES `quiz`.`take` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

ALTER TABLE `quiz`.`take_answer`
ADD INDEX `idx_tanswer_question` (`questionId` ASC);
ALTER TABLE `quiz`.`take_answer`
ADD CONSTRAINT `fk_tanswer_question`
FOREIGN KEY (`questionId`)
REFERENCES `quiz`.`quiz_question` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

ALTER TABLE `quiz`.`take_answer`
ADD INDEX `idx_tanswer_answer` (`answerId` ASC);
ALTER TABLE `quiz`.`take_answer`
ADD CONSTRAINT `fk_tanswer_answer`
FOREIGN KEY (`answerId`)
REFERENCES `quiz`.`quiz_answer` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Riepilogo

In questo tutorial, abbiamo discusso la progettazione del database di un sistema di quiz per memorizzare utenti, quiz, domande, risposte e tentativi di quiz sotto forma di take.

Puoi inviare i tuoi commenti per partecipare alla discussione. Potresti anche essere interessato a progettare il database delle applicazioni Blog e Sondaggi e sondaggi.

Lo schema completo del database è disponibile anche su GitHub.