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

Guia para projetar banco de dados para pesquisa e pesquisa no MySQL


Este tutorial fornece etapas completas para projetar um esquema de banco de dados de enquetes e pesquisas fechadas ou abertas por meio de questionário para gerenciar os usuários, enquetes, perguntas, respostas e votos. Ele pode ser usado para desenvolver um site de pesquisa e pesquisa ou aplicativo móvel.



O diagrama de relacionamento de entidade ou design de banco de dados visual é mostrado abaixo.



Figura 1



Observações :Para manter o esquema do banco de dados simples e desenvolver um produto mínimo viável, ele não abrange as opções mais avançadas, como controle de versão e revisão de pesquisas e pesquisas. Ele se restringe a apenas usuários logados para participar de uma pesquisa ou enquete para evitar spam, para que apenas votos legítimos sejam enviados.



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 pesquisa




O primeiro passo é criar o banco de dados de pesquisa. Ele pode ser criado usando a consulta conforme mostrado abaixo.


CREATE SCHEMA `poll` 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 do proprietário da pesquisa/pesquisa. A mesma tabela pode ser usada para relacionar os proprietários de pesquisa/pesquisa para que os usuários possam gerenciar sua própria pesquisa ou pesquisa e acompanhar as atividades de votação. 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 enquete ou pesquisa.
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 a ser exibida na página de pesquisa ou pesquisa.
Perfil Os detalhes do proprietário a serem exibidos na página de pesquisa ou pesquisa.



A Tabela de Usuários com as restrições apropriadas é mostrada abaixo.


CREATE TABLE `poll`.`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 Enquete




Nesta seção, projetaremos a Tabela de Enquete para armazenar os dados de pesquisa e pesquisa. Abaixo mencionada é a descrição de todas as colunas da Tabela de Enquetes.


ID O ID exclusivo para identificar a enquete/pesquisa.
ID do host O ID do host para identificar o host da enquete/pesquisa.
Título O título da enquete/pesquisa a ser exibido na página de enquete/pesquisa 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 a enquete e a pesquisa.
Publicado Pode ser usado para identificar se a enquete/pesquisa está disponível publicamente.
Criado em Ele armazena a data e hora em que a enquete/pesquisa é criada.
Atualizado em Ele armazena a data e hora em que a enquete/pesquisa é atualizada.
Publicado em Ele armazena a data e hora em que a enquete/pesquisa é publicada.
Começa em Ele armazena a data e hora em que a enquete/pesquisa começa e abre para votação.
Termina em Ele armazena a data e hora em que a enquete/pesquisa fecha para votação.
Conteúdo A coluna usada para armazenar os dados da enquete/pesquisa.



A Tabela de Enquetes com as restrições apropriadas é mostrada abaixo.


CREATE TABLE `poll`.`poll` (
`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,
`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_poll_host` (`hostId` ASC),
CONSTRAINT `fk_poll_host`
FOREIGN KEY (`hostId`)
REFERENCES `poll`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);


Meta de enquete




A Meta Tabela de Enquetes pode ser usada para armazenar informações adicionais de uma enquete ou pesquisa, incluindo o URL do banner da enquete, etc. Abaixo está a descrição de todas as colunas da Meta Tabela de Enquetes.


ID O ID exclusivo para identificar a meta da enquete.
ID da enquete O ID da enquete para identificar a enquete/pesquisa pai.
Chave A chave que identifica o meta.
Conteúdo A coluna usada para armazenar os metadados da enquete.



A Poll Meta Table com as restrições apropriadas é mostrada abaixo.


CREATE TABLE `poll`.`poll_meta` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`pollId` BIGINT NOT NULL,
`key` VARCHAR(50) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_meta_poll` (`pollId` ASC),
UNIQUE INDEX `uq_poll_meta` (`pollId` ASC, `key` ASC),
CONSTRAINT `fk_meta_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;


Tabela de perguntas da enquete




A Tabela de Perguntas de Enquete pode ser usada para armazenar as perguntas relacionadas a enquetes e pesquisas. O cenário ideal é ter uma pergunta para enquetes e várias perguntas para pesquisas. Abaixo mencionada é a descrição de todas as colunas da Tabela de Perguntas da Enquete.


ID O ID exclusivo para identificar a pergunta da enquete.
ID da enquete O ID da enquete para identificar a enquete/pesquisa pai.
Tipo O tipo de pergunta. O tipo pode ser uma única escolha (Sim/Não), múltipla escolha, seleção ou entrada.
Ativo Sinalize para identificar se a pergunta está ativa.
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 da Enquete com as restrições apropriadas é mostrada abaixo.


CREATE TABLE `poll`.`poll_question` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`pollId` BIGINT NOT NULL,
`type` VARCHAR(50) 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_question_poll` (`pollId` ASC),
CONSTRAINT `fk_question_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;


Tabela de respostas da pesquisa




A Tabela de respostas da pesquisa pode ser usada para armazenar as respostas de perguntas de escolha única, múltipla escolha e do tipo selecionado. No caso de 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 à Enquete.


ID O ID exclusivo para identificar a resposta da enquete.
ID da enquete O ID da enquete para identificar a enquete/pesquisa pai.
ID da pergunta O ID da pergunta para identificar a pergunta principal.
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.



A Tabela de Respostas à Enquete com as restrições apropriadas é mostrada abaixo.


CREATE TABLE `poll`.`poll_answer` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`pollId` BIGINT NOT NULL,
`questionId` 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_poll` (`pollId` ASC),
CONSTRAINT `fk_answer_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

ALTER TABLE `poll`.`poll_answer`
ADD INDEX `idx_answer_question` (`questionId` ASC);
ALTER TABLE `poll`.`poll_answer`
ADD CONSTRAINT `fk_answer_question`
FOREIGN KEY (`questionId`)
REFERENCES `poll`.`poll_question` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;


Tabela de votação da enquete




A tabela de votação pode ser usada para armazenar as escolhas e entradas do usuário. Abaixo está a descrição de todas as colunas da Tabela de Votação.


ID O ID exclusivo para identificar o voto da enquete.
ID da enquete O ID da enquete para identificar a enquete/pesquisa.
ID da pergunta O ID da pergunta para identificar a pergunta.
ID da resposta O ID da resposta para identificar a resposta.
ID de usuário O ID do usuário para identificar o usuário.
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 entrada do usuário.



A tabela de votação com as restrições apropriadas é mostrada abaixo.


CREATE TABLE `poll`.`poll_vote` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`pollId` BIGINT NOT NULL,
`questionId` BIGINT NOT NULL,
`answerId` BIGINT DEFAULT NULL,
`userId` BIGINT NOT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_vote_poll` (`pollId` ASC),
CONSTRAINT `fk_vote_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

ALTER TABLE `poll`.`poll_vote`
ADD INDEX `idx_vote_question` (`questionId` ASC);
ALTER TABLE `poll`.`poll_vote`
ADD CONSTRAINT `fk_vote_question`
FOREIGN KEY (`questionId`)
REFERENCES `poll`.`poll_question` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

ALTER TABLE `poll`.`poll_vote`
ADD INDEX `idx_vote_answer` (`answerId` ASC);
ALTER TABLE `poll`.`poll_vote`
ADD CONSTRAINT `fk_vote_answer`
FOREIGN KEY (`answerId`)
REFERENCES `poll`.`poll_answer` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

ALTER TABLE `poll`.`poll_vote`
ADD INDEX `idx_vote_user` (`userId` ASC);
ALTER TABLE `poll`.`poll_vote`
ADD CONSTRAINT `fk_vote_user`
FOREIGN KEY (`userId`)
REFERENCES `poll`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;


Tabela de categorias e Tabela de categorias de pesquisa




Nesta seção, projetaremos a Tabela de categorias e Tabela de categorias de pesquisa para armazenar as categorias de pesquisa e seus mapeamentos. Abaixo está a descrição de todas as colunas da Tabela de Categorias.


ID O ID exclusivo para identificar a categoria.
ID pai O ID pai para identificar a categoria pai.
Título O título da categoria.
Metatítulo O meta-título a ser usado para o título do navegador e SEO.
Slug O slug de categoria para formar o URL.
Conteúdo A coluna usada para armazenar os dados da categoria.



A Tabela de Categorias com as restrições apropriadas é mostrada abaixo.


CREATE TABLE `poll`.`category` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`parentId` BIGINT NULL DEFAULT NULL,
`title` VARCHAR(75) NOT NULL,
`metaTitle` VARCHAR(100) NULL DEFAULT NULL,
`slug` VARCHAR(100) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`));

ALTER TABLE `poll`.`category`
ADD INDEX `idx_category_parent` (`parentId` ASC);
ALTER TABLE `poll`.`category`
ADD CONSTRAINT `fk_category_parent`
FOREIGN KEY (`parentId`)
REFERENCES `poll`.`category` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;



Abaixo está a descrição de todas as colunas da Tabela de Categoria de Enquete.


ID da enquete O ID da enquete para identificar a enquete ou pesquisa.
ID da categoria O ID da categoria para identificar a categoria.



A Tabela de Categoria de Enquete com as restrições apropriadas é mostrada abaixo.


CREATE TABLE `poll`.`poll_category` (
`pollId` BIGINT NOT NULL,
`categoryId` BIGINT NOT NULL,
PRIMARY KEY (`pollId`, `categoryId`),
INDEX `idx_pc_category` (`categoryId` ASC),
INDEX `idx_pc_poll` (`pollId` ASC),
CONSTRAINT `fk_pc_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_pc_category`
FOREIGN KEY (`categoryId`)
REFERENCES `poll`.`category` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);


Tabela de Tags e Tabela de Tags de Enquete




Semelhante às tabelas de categorias e categorias de pesquisa, podemos criar a Tabela de tags e Tabela de tags de pesquisa . As principais diferenças entre a Categoria e a Tag estão listadas abaixo.


  • A coluna parentId não é obrigatória na Tabela de tags.
  • A contagem de categorias permanece baixa, pois elas podem ser usadas para formar o menu principal para fins de navegação. As tags podem ser mais do que categorias.
  • Tanto as categorias quanto as tags podem ser usadas para relacionar as enquetes.
  • Deve-se atribuir apenas algumas categorias a uma enquete, enquanto a contagem de tags pode ser maior.


Resumo




É assim que podemos projetar um Banco de Dados de Enquetes para ser usado na formação de sites e aplicativos móveis baseados em Enquetes e Pesquisas. O mesmo pode ser aprimorado ainda mais para adicionar opções mais avançadas, incluindo vídeos, pagamentos, assinaturas, etc.



Você pode enviar seus comentários para participar da discussão. Você também pode estar interessado em projetar o banco de dados de aplicativos do Blog. O design RBAC pode ser usado para implementação de controle de acesso baseado em função.



O esquema completo do banco de dados também está disponível no GitHub.