sql >> Databasteknik >  >> RDS >> Mysql

Guide till designdatabas för omröstning och undersökning i MySQL

Denna handledning innehåller fullständiga steg för att designa ett databasschema över stängda eller öppna omröstningar och enkäter via frågeformulär för att hantera användare, omröstningar, frågor, svar och röster. Den kan användas vidare för att utveckla en webbsida för opinionsundersökningar och enkäter eller mobilapplikationer.

Entity Relationship Diagram eller visuell databasdesign visas nedan.

Fig 1

Anteckningar :För att hålla databasschemat enkelt och för att utveckla en minimal livskraftig produkt täcker det inte de mer avancerade alternativen som versionshantering och granskning av undersökningar och undersökningar. Det begränsar till att endast inloggade användare kan delta i en undersökning eller omröstning för att undvika spam så att endast legitima röster skickas in.

Du kan också besöka de populära handledningarna inklusive Hur man installerar MySQL 8 på Ubuntu, Hur man installerar MySQL 8 på Windows, RBAC-databas i MySql, Bloggdatabas i MySql, Lär dig grundläggande SQL-frågor i MySQL.

Omröstningsdatabas

Det allra första steget är att skapa omröstningsdatabasen. Den kan skapas med hjälp av frågan som visas nedan.

CREATE SCHEMA `poll` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Jag har använt teckenuppsättningen utf8mb4 för att stödja ett stort antal tecken.

Användartabell

I det här avsnittet kommer vi att utforma användartabellen för att lagra användarinformation för ägaren av omröstningen/enkäten. Samma tabell kan användas för att relatera ägarna till enkäten/enkäten så att användarna kan hantera sin egen enkät eller enkät och för att spåra röstningsaktiviteterna. Nedan nämns beskrivningen av alla kolumner i användartabellen.

Id Det unika ID:t för att identifiera användaren.
Förnamn Användarens förnamn.
Mellannamn Användarens mellannamn.
Efternamn Användarens efternamn.
Mobil Användarens mobilnummer. Den kan användas för inloggning och registreringsändamål.
E-post Användarens e-postadress. Den kan användas för inloggning och registreringsändamål.
Lösenordshash Lösenords-hash som genereras av lämplig algoritm. Vi måste undvika att lagra vanliga lösenord.
Värd Flaggan för att identifiera om användaren kan vara värd för omröstning eller enkät.
Registrerad på Denna kolumn kan användas för att beräkna användarens livslängd med programmet.
Senaste inloggning Den kan användas för att identifiera användarens senaste inloggning.
Intro Den korta introduktionen av användaren som ska visas på omröstnings- eller undersökningssidan.
Profil Ägarinformationen som ska visas på omröstnings- eller undersökningssidan.

Användartabellen med lämpliga begränsningar är som visas nedan.

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

Omröstningstabell

I det här avsnittet kommer vi att utforma omröstningstabellen för att lagra omröstnings- och undersökningsdata. Nedan nämns beskrivningen av alla kolumner i omröstningstabellen.

Id Det unika ID:t för att identifiera omröstningen/enkäten.
Värd-ID Värd-id för att identifiera omröstnings-/enkätvärden.
Titel Omröstningen/enkätens titel som ska visas på omröstningen/enkätsidan och listorna.
Metatitel Metatiteln som ska användas för webbläsartitel och SEO.
Snigel Snigeln för att bilda URL:en.
Sammanfattning Sammanfattningen för att nämna de viktigaste höjdpunkterna.
Typ Typen för att skilja mellan enkäten och enkäten.
Publicerad Den kan användas för att identifiera om enkäten/enkäten är allmänt tillgänglig.
Skapat vid Den lagrar datum och tid då omröstningen/enkäten skapas.
Uppdaterad kl. Den lagrar datum och tid då omröstningen/enkäten uppdateras.
Publicerad på Den lagrar datum och tid då omröstningen/enkäten publiceras.
Börjar vid Den lagrar datum och tid då omröstningen/enkäten startar och öppnar upp för omröstning.
Slutar vid Den lagrar datum och tid då omröstningen/enkäten stänger för omröstning.
Innehåll Kolumnen som används för att lagra omröstnings-/enkätdata.

Enkättabellen med lämpliga begränsningar är som visas nedan.

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

Omröstningsmeta

Omröstningsmetatabellen kan användas för att lagra ytterligare information om en omröstning eller enkät inklusive webbadressen till omröstningsbannern etc. Nedan nämns en beskrivning av alla kolumner i omröstningsmetatabellen.

Id Det unika ID:t för att identifiera omröstningens meta.
Omröstnings-ID Enkät-id för att identifiera den överordnade omröstningen/enkäten.
Nyckel Nyckeln som identifierar meta.
Innehåll Kolumnen som används för att lagra omröstningsmetadata.

Omröstningsmetatabellen med lämpliga begränsningar är som visas nedan.

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;

Omröstningsfrågetabell

Omröstningsfrågetabellen kan användas för att lagra frågor relaterade till omröstningar och undersökningar. Det ideala scenariot är att ha en fråga för enkäter och flera frågor för enkäter. Nedan nämns beskrivningen av alla kolumner i omröstningsfrågetabellen.

Id Det unika ID:t för att identifiera omröstningsfrågan.
Omröstnings-ID Enkät-id för att identifiera den överordnade omröstningen/enkäten.
Typ Typen av fråga. Typen kan vara ett enda val (Ja/Nej), flervalsalternativ, välj eller inmatning.
Aktiv Flagga för att identifiera om frågan är aktiv.
Skapat vid Den lagrar datum och tid då frågan skapades.
Uppdaterad kl. Den lagrar datum och tid då frågan uppdateras.
Innehåll Kolumnen som används för att lagra frågan.

Omröstningsfrågetabellen med lämpliga begränsningar är som visas nedan.

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;

Enkätsvarstabell

Omröstningssvarstabellen kan användas för att lagra svaren på envals-, flervals- och utvalda frågor. Vid envalsfråga kan svaren vara Ja och Nej. Nedan nämns beskrivningen av alla kolumner i omröstningssvarstabellen.

Id Det unika ID:t för att identifiera omröstningssvaret.
Omröstnings-ID Enkät-id för att identifiera den överordnade omröstningen/enkäten.
Fråge-ID Fråge-id för att identifiera den överordnade frågan.
Aktiv Flagga för att identifiera om svaret är aktivt.
Skapat vid Den lagrar datum och tid då svaret skapas.
Uppdaterad kl. Den lagrar datum och tid då svaret uppdateras.
Innehåll Kolumnen som används för att lagra svaret.

Enkätsvarstabellen med lämpliga begränsningar är som visas nedan.

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;

Omröstningstabell

Omröstningstabellen kan användas för att lagra användarens val och inmatningar. Nedan nämns beskrivningen av alla kolumner i omröstningstabellen.

Id Det unika ID:t för att identifiera omröstningen.
Omröstnings-ID Enkät-id för att identifiera omröstningen/enkäten.
Fråge-ID Fråge-id för att identifiera frågan.
Svars-ID Svars-id för att identifiera svaret.
Användar-ID Användar-ID för att identifiera användaren.
Skapat vid Den lagrar datum och tid då svaret skapas.
Uppdaterad kl. Den lagrar datum och tid då svaret uppdateras.
Innehåll Kolumnen som används för att lagra användarinmatningen.

Omröstningstabellen med lämpliga begränsningar visas nedan.

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;

Kategoritabell och undersökningskategoritabell

I det här avsnittet kommer vi att utforma Kategoritabellen och Enkätkategoritabell för att lagra omröstningskategorierna och deras mappningar. Nedan nämns beskrivningen av alla kolumner i kategoritabellen.

Id Det unika ID:t för att identifiera kategorin.
Förälder-ID Det överordnade id för att identifiera den överordnade kategorin.
Titel Kategorititeln.
Metatitel Metatiteln som ska användas för webbläsartitel och SEO.
Snigel Kategorin som bildar URL:en.
Innehåll Kolumnen som används för att lagra kategoridata.

Kategoritabellen med lämpliga begränsningar är som visas nedan.

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;

Nedan nämns beskrivningen av alla kolumner i undersökningskategoritabellen.

Omröstnings-ID Enkät-id för att identifiera omröstningen eller undersökningen.
Kategori-ID Kategori-id för att identifiera kategorin.

Omröstningskategoritabellen med lämpliga begränsningar är som visas nedan.

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

Taggtabell och omröstningstaggtabell

I likhet med kategori- och omröstningskategoritabellerna kan vi designa Taggtabellen och Omröstningstaggtabell . De största skillnaderna mellan kategorin och taggen listas nedan.

  • Kolumnen parentId krävs inte i taggtabellen.
  • Antalet kategorier är fortfarande lågt eftersom dessa kan användas för att bilda huvudmenyn för navigeringsändamål. Taggarna kan vara fler jämfört med kategorier.
  • Både kategorier och taggar kan användas för att relatera omröstningarna.
  • Man bör bara tilldela ett fåtal kategorier till en omröstning, medan antalet taggar kan vara fler.

Sammanfattning

Så här kan vi designa en omröstningsdatabas som ska användas som bildandet av omröstnings- och enkätbaserade webbplatser och mobilapplikationer. Detsamma kan förbättras ytterligare för att lägga till mer avancerade alternativ inklusive videor, betalningar, prenumerationer, etc.

Du kan skicka in dina kommentarer för att delta i diskussionen. Du kanske också är intresserad av att designa databasen med bloggapplikationer. RBAC-designen kan användas för rollbaserad åtkomstkontrollimplementering.

Det fullständiga databasschemat finns också tillgängligt på GitHub.


  1. Jag behöver min PHP-sida för att visa min BLOB-bild från mysql-databasen

  2. Kör prestanda i en hybridmolninstallation

  3. Hur man utför grupperad rankning i MySQL

  4. Skillnaden mellan SELECT INTO och INSERT INTO i MySQL