sql >> Database >  >> RDS >> Mysql

Gids voor het ontwerpen van een database voor peilingen en enquêtes in MySQL

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


  1. Is er een manier om geen vierkante haken te gebruiken in SQL Server?

  2. Fout 28000:Inloggen mislukt voor gebruiker DOMAIN\\gebruiker met pyodbc

  3. Talend op Windows verbinden met een ODBC-database

  4. ORACLE SQL*Plus-zelfstudie