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