Deze zelfstudie biedt volledige stappen voor het ontwerpen van een databaseschema van gesloten of open peilingen en enquêtes via vragenlijsten om de gebruikers, peilingen, vragen, antwoorden en stemmen te beheren. Het kan verder worden gebruikt om een polling- en enquêtewebsite of mobiele applicatie te ontwikkelen.
Het entiteitsrelatiediagram of visueel databaseontwerp wordt hieronder weergegeven.
Afb. 1
Opmerkingen :Om het databaseschema eenvoudig te houden en een minimaal levensvatbaar product te ontwikkelen, dekt het niet de meer geavanceerde opties zoals versiebeheer en het herzien van de peilingen en enquêtes. Het beperkt zich tot alleen ingelogde gebruikers om deel te nemen aan een enquête of poll om spamming te voorkomen, zodat alleen legitieme stemmen worden ingediend.
U kunt ook de populaire tutorials bezoeken, waaronder 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.
Poll-database
De allereerste stap is het maken van de Poll Database. Het kan worden gemaakt met behulp van de onderstaande query.
CREATE SCHEMA `poll` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Ik heb de tekenset utf8mb4 . gebruikt om een breed scala aan karakters te ondersteunen.
Gebruikerstabel
In deze sectie zullen we de Gebruikerstabel . ontwerpen om gebruikersinformatie van de eigenaar van de enquête/enquête op te slaan. Dezelfde tabel kan worden gebruikt om de eigenaren van de enquête/enquête te relateren, zodat de gebruikers hun eigen poll of enquête kunnen beheren en de stemactiviteiten kunnen volgen. Hieronder staat de beschrijving van alle kolommen van de gebruikerstabel.
Id | Het unieke ID om de gebruiker te identificeren. |
Voornaam | De voornaam van de gebruiker. |
Middelste naam | De middelste naam van de gebruiker. |
Achternaam | De achternaam van de gebruiker. |
Mobiel | Het mobiele nummer van de gebruiker. Het kan worden gebruikt voor aanmeldings- en registratiedoeleinden. |
Het e-mailadres van de gebruiker. Het kan worden gebruikt voor aanmeldings- en registratiedoeleinden. | |
Wachtwoordhash | De wachtwoord-hash gegenereerd door het juiste algoritme. We moeten vermijden om gewone wachtwoorden op te slaan. |
Host | De vlag om aan te geven of de gebruiker poll of enquête kan hosten. |
Geregistreerd bij | Deze kolom kan worden gebruikt om de levensduur van de gebruiker met de applicatie te berekenen. |
Laatste aanmelding | Het kan worden gebruikt om de laatste login van de gebruiker te identificeren. |
Inleiding | De korte introductie van de gebruiker die moet worden weergegeven op de peiling- of enquêtepagina. |
Profiel | De details van de eigenaar die moeten worden weergegeven op de peiling- of enquêtepagina. |
De gebruikerstabel met de juiste beperkingen is zoals hieronder weergegeven.
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) );
Polltabel
In deze sectie zullen we de Poll Table . ontwerpen om de peiling- en enquêtegegevens op te slaan. Hieronder vindt u de beschrijving van alle kolommen van de enquêtetabel.
Id | Het unieke ID om de peiling/enquête te identificeren. |
Host-ID | De host-ID om de poll-/enquêtehost te identificeren. |
Titel | De titel van de peiling/enquête die moet worden weergegeven op de peiling-/enquêtepagina en de lijsten. |
Metatitel | De metatitel die moet worden gebruikt voor browsertitel en SEO. |
Naaktslak | De slug om de URL te vormen. |
Samenvatting | De samenvatting om de belangrijkste hoogtepunten te noemen. |
Type | Het type om onderscheid te maken tussen de peiling en de enquête. |
Gepubliceerd | Het kan worden gebruikt om te bepalen of de peiling/enquête openbaar beschikbaar is. |
Gemaakt op | Het slaat de datum en tijd op waarop de peiling/enquête is gemaakt. |
Bijgewerkt om | Het slaat de datum en tijd op waarop de peiling/enquête is bijgewerkt. |
Gepubliceerd op | Het slaat de datum en tijd op waarop de peiling/enquête is gepubliceerd. |
Begint om | Het slaat de datum en tijd op waarop de peiling/enquête begint en kan worden gestemd. |
Eindigt op | Het slaat de datum en tijd op waarop de peiling/enquête sluit om te stemmen. |
Inhoud | De kolom die wordt gebruikt om de poll-/enquêtegegevens op te slaan. |
De enquêtetabel met de juiste beperkingen is zoals hieronder weergegeven.
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);
Poll-meta
De poll-metatabel kan worden gebruikt om aanvullende informatie van een poll of enquête op te slaan, inclusief de poll-banner-URL enz. Hieronder vindt u de beschrijving van alle kolommen van de poll-metatabel.
Id | Het unieke ID om de poll-meta te identificeren. |
Poll-ID | De poll-ID om de bovenliggende poll/enquête te identificeren. |
Sleutel | De sleutel die de meta identificeert. |
Inhoud | De kolom die wordt gebruikt om de metadata van de peiling op te slaan. |
De poll-metatabel met de juiste beperkingen is zoals hieronder weergegeven.
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;
Tabel met enquêtevragen
De Poll-vragentabel kan worden gebruikt om de vragen met betrekking tot polls en enquêtes op te slaan. Het ideale scenario is om één vraag voor peilingen en meerdere vragen voor enquêtes te hebben. Hieronder vindt u de beschrijving van alle kolommen van de enquêtevragentabel.
Id | Het unieke ID om de peilingvraag te identificeren. |
Poll-ID | De poll-ID om de bovenliggende poll/enquête te identificeren. |
Type | Het type vraag. Het type kan een enkele keuze zijn (Ja/Nee), meerkeuze, selecteren of invoeren. |
Actief | Vlag om aan te geven of de vraag actief is. |
Gemaakt op | Het slaat de datum en tijd op waarop de vraag is gemaakt. |
Bijgewerkt om | Het slaat de datum en tijd op waarop de vraag is bijgewerkt. |
Inhoud | De kolom waarin de vraag is opgeslagen. |
De enquêtevragentabel met de juiste beperkingen ziet er als volgt uit.
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;
Enquête-antwoordtabel
De Poll Answer Table kan worden gebruikt om de antwoorden van single-choice, multiple-choice en select type vragen op te slaan. In het geval van een enkelvoudige vraag kunnen de antwoorden Ja en Nee zijn. Hieronder vindt u de beschrijving van alle kolommen van de Poll Answer Table.
Id | De unieke id om het peilingantwoord te identificeren. |
Poll-ID | De poll-ID om de bovenliggende poll/enquête te identificeren. |
Vraag-ID | De vraag-ID om de bovenliggende vraag te identificeren. |
Actief | Vlag om aan te geven of het antwoord actief is. |
Gemaakt op | Het slaat de datum en tijd op waarop het antwoord is gemaakt. |
Bijgewerkt om | Het slaat de datum en tijd op waarop het antwoord is bijgewerkt. |
Inhoud | De kolom waarin het antwoord is opgeslagen. |
De enquête-antwoordtabel met de juiste beperkingen is zoals hieronder weergegeven.
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;
Poll stemtabel
De Poll Vote Table kan worden gebruikt om de gebruikerskeuzes en invoer op te slaan. Hieronder vindt u de beschrijving van alle kolommen van de Poll Vote Table.
Id | Het unieke ID om de peilingstem te identificeren. |
Poll-ID | De poll-ID om de poll/enquête te identificeren. |
Vraag-ID | De vraag-ID om de vraag te identificeren. |
Antwoord-ID | Het antwoord-ID om het antwoord te identificeren. |
Gebruikers-ID | Het gebruikers-ID om de gebruiker te identificeren. |
Gemaakt op | Het slaat de datum en tijd op waarop het antwoord is gemaakt. |
Bijgewerkt om | Het slaat de datum en tijd op waarop het antwoord is bijgewerkt. |
Inhoud | De kolom die wordt gebruikt om de gebruikersinvoer op te slaan. |
De Poll-stemtabel met de juiste beperkingen is zoals hieronder weergegeven.
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;
Categorietabel en enquêtecategorietabel
In deze sectie zullen we de Categorietabel . ontwerpen en Pollcategorietabel om de poll-categorieën en hun toewijzingen op te slaan. Hieronder vindt u de beschrijving van alle kolommen van de categorietabel.
Id | Het unieke ID om de categorie te identificeren. |
Ouder-ID | Het bovenliggende ID om de bovenliggende categorie te identificeren. |
Titel | De categorietitel. |
Metatitel | De metatitel die moet worden gebruikt voor browsertitel en SEO. |
Naaktslak | De categorie-slug om de URL te vormen. |
Inhoud | De kolom die wordt gebruikt om de categoriegegevens op te slaan. |
De categorietabel met de juiste beperkingen is zoals hieronder weergegeven.
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;
Hieronder vindt u de beschrijving van alle kolommen van de enquêtecategorietabel.
Poll-ID | De poll-ID om de poll of enquête te identificeren. |
Categorie-ID | De categorie-ID om de categorie te identificeren. |
De enquêtecategorietabel met de juiste beperkingen ziet er als volgt uit.
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);
Tag-tabel en poll-tagtabel
Net als bij de categorie- en pollcategorietabellen, kunnen we de Tagtabel . ontwerpen en Poll Tag-tabel . De belangrijkste verschillen tussen de categorie en de tag staan hieronder vermeld.
- De parentId-kolom is niet vereist in de Tag-tabel.
- Het aantal categorieën blijft laag omdat deze kunnen worden gebruikt om het hoofdmenu te vormen voor navigatiedoeleinden. De tags kunnen meer zijn in vergelijking met categorieën.
- Beide categorieën en tags kunnen worden gebruikt om de peilingen te relateren.
- Men zou slechts een paar categorieën aan een peiling moeten toewijzen, terwijl het aantal tags meer kan zijn.
Samenvatting
Dit is hoe we een peilingdatabase kunnen ontwerpen die kan worden gebruikt als de vorming van op peilingen en enquêtes gebaseerde websites en mobiele applicaties. Hetzelfde kan verder worden verbeterd om meer geavanceerde opties toe te voegen, waaronder video's, betalingen, abonnementen, enz.
U kunt uw opmerkingen indienen om deel te nemen aan de discussie. Mogelijk bent u ook geïnteresseerd in het ontwerpen van de database met Blog-applicaties. Het RBAC-ontwerp kan worden gebruikt voor implementatie van op rollen gebaseerde toegangscontrole.
Het volledige databaseschema is ook beschikbaar op GitHub.