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

Guida alla progettazione di database per sondaggi e sondaggi in MySQL

Questo tutorial fornisce passaggi completi per progettare uno schema di database di sondaggi chiusi o aperti e sondaggi tramite questionario per gestire utenti, sondaggi, domande, risposte e voti. Può essere ulteriormente utilizzato per sviluppare un sito Web di sondaggi e sondaggi o un'applicazione mobile.

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

Fig 1

Note :per mantenere lo schema del database semplice e per sviluppare un prodotto minimo praticabile, non copre le opzioni più avanzate come il controllo delle versioni e la revisione di sondaggi e sondaggi. Limita la partecipazione a sondaggi o sondaggi solo agli utenti che hanno effettuato l'accesso per evitare lo spamming in modo che vengano inviati solo i voti legittimi.

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.

Banca dati sondaggi

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

CREATE SCHEMA `poll` 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 del proprietario del sondaggio/sondaggio. La stessa tabella può essere utilizzata per mettere in relazione i proprietari del sondaggio/sondaggio in modo che gli utenti possano gestire il proprio sondaggio o sondaggio e per tenere traccia delle attività di voto. 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 sondaggi o sondaggi.
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 da visualizzare nella Pagina Sondaggio o Sondaggio.
Profilo I dettagli del proprietario da visualizzare nella pagina Sondaggio o Sondaggio.

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

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) );

Tabella dei sondaggi

In questa sezione, progetteremo la Tabella dei sondaggi per memorizzare il sondaggio e i dati del sondaggio. Di seguito è riportata la descrizione di tutte le colonne della Tabella dei Sondaggi.

ID L'ID univoco per identificare il sondaggio/sondaggio.
ID host L'ID host per identificare l'host del sondaggio/sondaggio.
Titolo Il titolo del sondaggio/sondaggio da visualizzare nella pagina del sondaggio/sondaggio 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 sondaggio e sondaggio.
Pubblicato Può essere utilizzato per identificare se il sondaggio/sondaggio è disponibile pubblicamente.
Creato a Memorizza la data e l'ora in cui viene creato il sondaggio/sondaggio.
Aggiornato a Memorizza la data e l'ora in cui il sondaggio/sondaggio viene aggiornato.
Pubblicato su Memorizza la data e l'ora in cui viene pubblicato il sondaggio/sondaggio.
Inizia alle Memorizza la data e l'ora in cui il sondaggio/sondaggio inizia e si apre per la votazione.
Termina alle Memorizza la data e l'ora in cui il sondaggio/sondaggio chiude per la votazione.
Contenuto La colonna utilizzata per memorizzare i dati di sondaggi/sondaggi.

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

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 sondaggio

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

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

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

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;

Tabella delle domande del sondaggio

La tabella delle domande del sondaggio può essere utilizzata per memorizzare le domande relative a sondaggi e sondaggi. Lo scenario ideale è avere una domanda per i sondaggi e più domande per i sondaggi. Di seguito è riportata la descrizione di tutte le colonne della Tabella delle domande del sondaggio.

ID L'ID univoco per identificare la domanda del sondaggio.
ID sondaggio L'ID sondaggio per identificare il sondaggio/sondaggio principale.
Tipo Il tipo di domanda. Il tipo può essere a scelta singola (Sì/No), a scelta multipla, selezione o input.
Attivo Segnala per identificare se la domanda è attiva.
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 sondaggio con i vincoli appropriati è quella mostrata di seguito.

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;

Tabella delle risposte ai sondaggi

La tabella delle risposte ai sondaggi può essere utilizzata per memorizzare le risposte di domande a scelta singola, a scelta multipla e di tipo selezionato. In caso di domanda a scelta singola, le risposte possono essere Sì e No. Di seguito è riportata la descrizione di tutte le colonne della Tabella Risposte Sondaggio.

ID L'ID univoco per identificare la risposta al sondaggio.
ID sondaggio L'ID sondaggio per identificare il sondaggio/sondaggio principale.
ID domanda L'ID domanda per identificare la domanda principale.
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.

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

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;

Tabella dei voti del sondaggio

La tabella dei voti del sondaggio può essere utilizzata per memorizzare le scelte e gli input dell'utente. Di seguito è riportata la descrizione di tutte le colonne della Tabella Voto Sondaggio.

ID L'ID univoco per identificare il voto del sondaggio.
ID sondaggio L'ID sondaggio per identificare il sondaggio/sondaggio.
ID domanda L'ID domanda per identificare la domanda.
ID risposta L'ID risposta per identificare la risposta.
ID utente L'ID utente per identificare l'utente.
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 l'input dell'utente.

La tabella dei voti del sondaggio con i vincoli appropriati è quella mostrata di seguito.

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;

Tabella delle categorie e Tabella delle categorie dei sondaggi

In questa sezione, progetteremo la Tabella delle categorie e Tabella delle categorie di sondaggi per memorizzare le categorie di sondaggi e le relative mappature. Di seguito è riportata la descrizione di tutte le colonne della Tabella delle Categorie.

ID L'ID univoco per identificare la categoria.
ID genitore L'ID genitore per identificare la categoria genitore.
Titolo Il titolo della categoria.
Metatitolo Il meta titolo da utilizzare per il titolo del browser e SEO.
Slug La categoria slug per formare l'URL.
Contenuto La colonna utilizzata per memorizzare i dati della categoria.

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

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;

Di seguito è riportata la descrizione di tutte le colonne della Tabella delle Categorie di Sondaggio.

ID sondaggio L'ID sondaggio per identificare il sondaggio o il sondaggio.
ID categoria L'ID categoria per identificare la categoria.

La tabella delle categorie di sondaggio con i vincoli appropriati è quella mostrata di seguito.

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);

Tabella dei tag e tabella dei tag del sondaggio

Analogamente alle tabelle delle categorie e dei sondaggi, possiamo progettare la Tabella dei tag e Tabella dei tag sondaggio . Le principali differenze tra Categoria e Tag sono elencate di seguito.

  • La colonna parentId non è richiesta nella tabella dei tag.
  • Il conteggio delle categorie rimane basso poiché queste possono essere utilizzate per formare il menu principale per scopi di navigazione. I tag possono essere maggiori rispetto alle categorie.
  • Sia le categorie che i tag possono essere utilizzati per mettere in relazione i sondaggi.
  • Si dovrebbero assegnare solo poche categorie a un sondaggio, mentre il conteggio dei tag può essere maggiore.

Riepilogo

È così che possiamo progettare un database di sondaggi da utilizzare come formazione di siti Web e applicazioni mobili basati su sondaggi e sondaggi. Lo stesso può essere ulteriormente migliorato per aggiungere opzioni più avanzate tra cui video, pagamenti, abbonamenti, ecc.

Puoi inviare i tuoi commenti per partecipare alla discussione. Potresti anche essere interessato a progettare il database delle applicazioni Blog. Il design RBAC può essere utilizzato per l'implementazione del controllo degli accessi in base al ruolo.

Lo schema completo del database è disponibile anche su GitHub.