Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Guia para projetar banco de dados para teste no MySQL


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.
E-mail 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.