Este tutorial fornece etapas completas para projetar um esquema de banco de dados de testes online e sistemas de questionários para gerenciar os usuários, questionários, perguntas, respostas e resultados. Ele pode ser usado para desenvolver testes on-line ou sites ou aplicativos baseados em questionários.
O diagrama de relacionamento de entidade ou design de banco de dados visual é mostrado abaixo.
Figura 1
Observações :Restringe a apenas usuários logados para fazer o teste para evitar spam. Os questionários são considerados curtos em comparação com os testes.
Você também pode visitar os tutoriais populares, incluindo How To Install MySQL 8 on Ubuntu, How To Install MySQL 8 on Windows, RBAC Database in MySql, Blog Database in MySql, Learn Basic SQL Queries In MySQL.
Banco de dados de questionários
O primeiro passo é criar o banco de dados de questionários. Ele pode ser criado usando a consulta conforme mostrado abaixo.
CREATE SCHEMA `quiz` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Eu usei o conjunto de caracteres utf8mb4 para suportar uma ampla gama de caracteres.
Tabela de usuário
Nesta seção, projetaremos a Tabela do usuário para armazenar informações do usuário. A mesma tabela pode ser usada para relacionar os hosts do questionário para que os usuários possam gerenciar seus próprios questionários e acompanhar as respostas. Abaixo está a descrição de todas as colunas da Tabela de Usuários.
ID | O ID exclusivo para identificar o usuário. |
Nome | O primeiro nome do usuário. |
Nome do meio | O nome do meio do usuário. |
Sobrenome | O sobrenome do usuário. |
Celular | O número de celular do usuário. Ele pode ser usado para fins de login e registro. |
O e-mail do usuário. Ele pode ser usado para fins de login e registro. | |
Hash de senha | O hash de senha gerado pelo algoritmo apropriado. Devemos evitar armazenar senhas simples. |
Anfitrião | O sinalizador para identificar se o usuário pode hospedar um questionário. |
Registrado em | Esta coluna pode ser usada para calcular a vida útil do usuário com o aplicativo. |
Último login | Pode ser usado para identificar o último login do usuário. |
Introdução | A breve introdução do usuário host a ser exibida na página de teste ou questionário. |
Perfil | Os detalhes do proprietário a serem exibidos na página de teste ou questionário. |
A Tabela de Usuários com as restrições apropriadas é mostrada abaixo.
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) );
Tabela de teste
Nesta seção, criaremos a Tabela de questionário para armazenar os dados do questionário. Abaixo está a descrição de todas as colunas da Tabela de Quiz.
ID | O ID exclusivo para identificar o questionário. |
ID do host | O ID do host para identificar o host do quiz. |
Título | O título do questionário a ser exibido na página do questionário e nas listas. |
Metatítulo | O meta-título a ser usado para o título do navegador e SEO. |
Slug | O slug para formar o URL. |
Resumo | O resumo para mencionar os principais destaques. |
Tipo | O tipo para distinguir entre o teste e o questionário. |
Pontuação | A pontuação total do questionário. |
Publicado | Ele pode ser usado para identificar se o teste/questionário está disponível publicamente. |
Criado em | Ele armazena a data e hora em que o teste/quiz é criado. |
Atualizado em | Ele armazena a data e hora em que o teste/quiz é atualizado. |
Publicado em | Ele armazena a data e hora em que o teste/quiz é publicado. |
Começa em | Ele armazena a data e hora em que o teste/quiz inicia e abre para tomadas. |
Termina em | Ele armazena a data e a hora em que o teste/quiz fecha para tomada. |
Conteúdo | A coluna usada para armazenar os dados do teste/questionário. |
A Tabela de Quiz com as restrições apropriadas é mostrada abaixo.
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);
Meta do questionário
A Quiz Meta Table pode ser usada para armazenar informações adicionais de testes ou quiz, incluindo o URL do banner do quiz, etc. Abaixo mencionada é a descrição de todas as colunas da Quiz Meta Table.
ID | O ID exclusivo para identificar a meta do questionário. |
ID do questionário | O ID do quiz para identificar o teste/quiz pai. |
Chave | A chave que identifica o meta. |
Conteúdo | A coluna usada para armazenar os metadados do questionário. |
A Tabela Meta do Quiz com as restrições apropriadas é mostrada abaixo.
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;
Tabela de perguntas do questionário
A Tabela de perguntas do questionário pode ser usado para armazenar as perguntas relacionadas a testes e questionários. Abaixo está a descrição de todas as colunas da Tabela de Perguntas do Quiz.
ID | O ID exclusivo para identificar a pergunta do questionário. |
ID do questionário | O ID do quiz para identificar o teste/quiz pai. |
Tipo | O tipo de pergunta. O tipo pode ser uma única escolha (Sim/Não), múltipla escolha ou selecionar. Também podemos ter tipo como entrada e área de texto caso o resultado do teste precise de verificações manuais. |
Ativo | Sinalize para identificar se a pergunta está ativa. Um questionário pode ter várias perguntas, mas apenas perguntas seletivas permanecem ativas por vez. |
Nível | O nível da pergunta para identificar se é fácil, médio ou difícil. |
Pontuação | A pontuação de uma pergunta individual. Devemos garantir que apenas perguntas seletivas estejam ativas por vez e que a pontuação total das perguntas ativas seja igual à pontuação do questionário antes de publicar o questionário. |
Criado em | Ele armazena a data e hora em que a pergunta foi criada. |
Atualizado em | Ele armazena a data e hora em que a pergunta é atualizada. |
Conteúdo | A coluna usada para armazenar a pergunta. |
A Tabela de perguntas do questionário com as restrições apropriadas é mostrada abaixo.
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;
Tabela de respostas do questionário
A Tabela de respostas do questionário pode ser usado para armazenar as respostas de perguntas de escolha única, múltipla escolha e do tipo selecionado. No caso de uma questão de escolha única, as respostas podem ser Sim e Não. Abaixo está a descrição de todas as colunas da Tabela de Respostas do Quiz.
ID | O ID exclusivo para identificar a resposta do questionário. |
ID do questionário | O ID do quiz para identificar o teste/quiz pai. |
ID da pergunta | O ID da pergunta para identificar a pergunta principal. |
Ativo | Sinalize para identificar se a resposta está ativa. |
Correto | Sinalize para identificar se a resposta está correta. |
Criado em | Ele armazena a data e hora em que a resposta é criada. |
Atualizado em | Ele armazena a data e hora em que a resposta é atualizada. |
Conteúdo | A coluna usada para armazenar a resposta. |
A Tabela de Respostas do Questionário com as restrições apropriadas é mostrada abaixo.
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;
Pegue a mesa
Nesta seção, projetaremos a Tabela de captura para rastrear a inscrição e o tempo de tentativas do usuário nos questionários. Abaixo mencionada é a descrição de todas as colunas da Tabela de Take.
ID | O ID exclusivo para identificar a tomada. |
ID de usuário | O ID do usuário para identificar o respondente do teste. |
ID do questionário | O ID do questionário para identificar o questionário. |
Estado | O status da tomada. Ele pode ser registrado, iniciado, pausado, finalizado, declarado. |
Pontuação | A pontuação total obtida pelo usuário. |
Criado em | Ele armazena a data e hora em que a tomada foi criada. |
Atualizado em | Ele armazena a data e a hora em que a tomada é atualizada. |
Iniciado em | Ele armazena a data e hora em que a tomada começou. |
Concluído em | Ele armazena a data e a hora em que a tomada foi concluída. |
Conteúdo | A coluna usada para armazenar as observações da tomada. |
A Tabela Take com as restrições apropriadas é mostrada abaixo.
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;
Pegue a Tabela de Respostas
A Tabela de Respostas pode ser usado para armazenar as respostas selecionadas pelo usuário durante o teste. No caso de uma pergunta de múltipla escolha, pode haver várias respostas. Abaixo mencionada é a descrição de todas as colunas da Tabela Take Answer.
ID | O id exclusivo para identificar a resposta. |
Pegar ID | O ID do take para identificar a tentativa de teste. |
ID da resposta | O ID da resposta para identificar a resposta do questionário. |
Ativo | Sinalize para identificar se a resposta está ativa. |
Criado em | Ele armazena a data e hora em que a resposta é criada. |
Atualizado em | Ele armazena a data e hora em que a resposta é atualizada. |
Conteúdo | A coluna usada para armazenar a resposta em caso de perguntas do tipo input ou textarea. |
A Tabela Take Answer com as restrições apropriadas é mostrada abaixo.
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;
Resumo
Neste tutorial, discutimos o design do banco de dados de um sistema de questionário para armazenar os usuários, questionários, perguntas, respostas e tentativas de questionário na forma de tomadas.
Você pode enviar seus comentários para participar da discussão. Você também pode estar interessado em projetar o banco de dados dos aplicativos Blog e Poll &Survey.
O esquema completo do banco de dados também está disponível no GitHub.