sql >> Databáze >  >> RDS >> Mysql

Průvodce návrhem databáze pro hlasování a průzkum v MySQL

Tento tutoriál poskytuje kompletní kroky k návrhu schématu databáze uzavřených nebo otevřených průzkumů a průzkumů prostřednictvím dotazníku pro správu uživatelů, průzkumů, otázek, odpovědí a hlasování. Lze jej dále použít k vývoji webové stránky pro hlasování a průzkumy nebo mobilní aplikace.

Diagram vztahů entit nebo návrh vizuální databáze je uveden níže.

Obr. 1

Poznámky :Aby bylo schéma databáze jednoduché a aby byl vyvinut minimální životaschopný produkt, nepokrývá pokročilejší možnosti, jako je verzování a kontrola průzkumů a průzkumů. Omezuje pouze na přihlášené uživatele, kteří se mohou zúčastnit průzkumu nebo hlasování, aby se zabránilo spamování, aby byly odesílány pouze legitimní hlasy.

Můžete také navštívit oblíbené výukové programy včetně Jak nainstalovat MySQL 8 na Ubuntu, Jak nainstalovat MySQL 8 na Windows, Databáze RBAC v MySql, Databáze blogu v MySql, Naučte se základní SQL dotazy v MySQL.

Databáze průzkumů

Úplně prvním krokem je vytvoření databáze hlasování. Lze jej vytvořit pomocí dotazu, jak je uvedeno níže.

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

Použil jsem znakovou sadu utf8mb4 pro podporu široké škály znaků.

Tabulka uživatelů

V této části navrhneme Tabulku uživatelů k uložení uživatelských informací o vlastníkovi ankety/průzkumu. Stejnou tabulku lze použít ke spojení vlastníků ankety/průzkumu, takže uživatelé mohou spravovat své vlastní hlasování nebo průzkum a sledovat hlasovací aktivity. Níže je uveden popis všech sloupců tabulky uživatelů.

ID Jedinečné ID k identifikaci uživatele.
Křestní jméno Křestní jméno uživatele.
Prostřední jméno Prostřední jméno uživatele.
Příjmení Příjmení uživatele.
Mobil Číslo mobilního telefonu uživatele. Lze jej použít pro účely přihlášení a registrace.
E-mail E-mailová adresa uživatele. Lze jej použít pro účely přihlášení a registrace.
Hašování hesla Hash hash hesla vygenerovaný příslušným algoritmem. Musíme se vyhnout ukládání jednoduchých hesel.
Hostitel Příznak pro identifikaci, zda uživatel může hostit hlasování nebo průzkum.
Registrováno na Tento sloupec lze použít k výpočtu životnosti uživatele s aplikací.
Poslední přihlášení Lze jej použít k identifikaci posledního přihlášení uživatele.
Úvod Krátké představení uživatele, které se zobrazí na stránce s anketou nebo průzkumem.
Profil Podrobnosti vlastníka, které se mají zobrazit na stránce ankety nebo průzkumu.

Tabulka uživatelů s příslušnými omezeními je uvedena níže.

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

Tabulka hlasování

V této sekci navrhneme Tabulku hlasování k ukládání dat z průzkumu a průzkumu. Níže je uveden popis všech sloupců tabulky hlasování.

ID Jedinečné ID k identifikaci ankety/průzkumu.
ID hostitele ID hostitele k identifikaci hostitele ankety/průzkumu.
Název Název ankety/průzkumu, který se zobrazí na stránce s anketou/průzkumem a v seznamech.
Název metadat Název metadat, který se má použít pro název prohlížeče a SEO.
Slimák Slim tvořící adresu URL.
Shrnutí Souhrn, ve kterém jsou zmíněny hlavní body.
Typ Typ pro rozlišení mezi anketou a průzkumem.
Publikováno Lze jej použít ke zjištění, zda je hlasování/průzkum veřejně dostupné.
Vytvořeno v Ukládá datum a čas, kdy je anketa/průzkum vytvořena.
Aktualizováno dne Ukládá datum a čas, kdy je průzkum/průzkum aktualizován.
Zveřejněno v Ukládá datum a čas, kdy je hlasování/průzkum zveřejněno.
Začíná v Ukládá datum a čas zahájení průzkumu/průzkumu a otevírá možnost hlasování.
Končí v Ukládá datum a čas, kdy se hlasování/průzkum uzavírá pro hlasování.
Obsah Sloupec používaný k ukládání dat průzkumu/průzkumu.

Tabulka hlasování s příslušnými omezeními je uvedena níže.

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 průzkumu

Metatabulku ankety lze použít k uložení dalších informací o anketě nebo průzkumu, včetně adresy URL banneru ankety atd. Níže je uveden popis všech sloupců metatabulky anket.

ID Jedinečné ID k identifikaci meta v anketě.
ID ankety ID ankety k identifikaci nadřazené ankety/průzkumu.
Klíč Klíč identifikující meta.
Obsah Sloupec používaný k uložení metadat průzkumu.

Metatabulka hlasování s příslušnými omezeními je uvedena níže.

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;

Tabulka anketních otázek

Tabulku anketních otázek lze použít k uložení otázek souvisejících s anketami a průzkumy. Ideální scénář je mít jednu otázku pro průzkumy a více otázek pro průzkumy. Níže je uveden popis všech sloupců tabulky anketních otázek.

ID Jedinečné ID k identifikaci anketní otázky.
ID ankety ID ankety k identifikaci nadřazené ankety/průzkumu.
Typ Typ otázky. Typ může být jedna volba (Ano/Ne), více možností, výběr nebo vstup.
Aktivní Příznakem zjistíte, zda je otázka aktivní.
Vytvořeno v Ukládá datum a čas, kdy byla otázka vytvořena.
Aktualizováno dne Ukládá datum a čas, kdy je otázka aktualizována.
Obsah Sloupec používaný k uložení otázky.

Tabulka anketních otázek s příslušnými omezeními je uvedena níže.

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;

Tabulka odpovědí v anketě

Tabulku odpovědí ankety lze použít k uložení odpovědí na otázky s jednou volbou, s více možnostmi a vybrané typy otázek. V případě otázky s jednou volbou mohou být odpovědi Ano a Ne. Níže je uveden popis všech sloupců tabulky odpovědí v anketě.

ID Jedinečné ID k identifikaci odpovědi v anketě.
ID ankety ID ankety k identifikaci nadřazené ankety/průzkumu.
ID otázky ID otázky k identifikaci nadřazené otázky.
Aktivní Příznakem zjistíte, zda je odpověď aktivní.
Vytvořeno v Ukládá datum a čas, kdy byla odpověď vytvořena.
Aktualizováno dne Ukládá datum a čas, kdy je odpověď aktualizována.
Obsah Sloupec používaný k uložení odpovědi.

Tabulka odpovědí v anketě s příslušnými omezeními je uvedena níže.

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;

Tabulka hlasování v anketě

Tabulku hlasování v anketě lze použít k uložení uživatelských voleb a vstupů. Níže je uveden popis všech sloupců tabulky hlasování v anketě.

ID Jedinečné ID k identifikaci hlasování v anketě.
ID ankety ID ankety k identifikaci ankety/průzkumu.
ID otázky ID otázky k identifikaci otázky.
ID odpovědi ID odpovědi k identifikaci odpovědi.
ID uživatele ID uživatele k identifikaci uživatele.
Vytvořeno v Ukládá datum a čas, kdy byla odpověď vytvořena.
Aktualizováno dne Ukládá datum a čas, kdy je odpověď aktualizována.
Obsah Sloupec používaný k uložení uživatelského vstupu.

Tabulka hlasování v anketě s příslušnými omezeními je uvedena níže.

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;

Tabulka kategorií a tabulka kategorií anket

V této části navrhneme Tabulku kategorií a Tabulka kategorií anket pro uložení kategorií hlasování a jejich mapování. Níže je uveden popis všech sloupců tabulky kategorií.

ID Jedinečné ID k identifikaci kategorie.
ID rodiče ID rodiče k identifikaci nadřazené kategorie.
Název Název kategorie.
Název metadat Název metadat, který se má použít pro název prohlížeče a SEO.
Slimák Slug kategorie tvořící adresu URL.
Obsah Sloupec používaný k uložení dat kategorie.

Tabulka kategorií s příslušnými omezeními je uvedena níže.

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;

Níže je uveden popis všech sloupců tabulky kategorií hlasování.

ID ankety ID ankety k identifikaci ankety nebo průzkumu.
ID kategorie ID kategorie k identifikaci kategorie.

Tabulka kategorií průzkumu s příslušnými omezeními je uvedena níže.

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

Tabulka značek a tabulka značek průzkumu

Podobně jako u tabulek kategorií a kategorií hlasování můžeme navrhnout Tabulku značek a Tabulka značek průzkumu . Hlavní rozdíly mezi kategorií a štítkem jsou uvedeny níže.

  • Sloupec parentId není v tabulce značek povinný.
  • Počet kategorií zůstává nízký, protože je lze použít k vytvoření hlavní nabídky pro navigační účely. Značek může být více než kategorie.
  • K propojení průzkumů lze použít kategorie i značky.
  • Do ankety je třeba přiřadit pouze několik kategorií, zatímco počet značek může být vyšší.

Shrnutí

Takto můžeme navrhnout databázi průzkumů, která bude použita jako vytvoření webových stránek a mobilních aplikací založených na průzkumech a průzkumech. Totéž lze dále vylepšit přidáním pokročilejších možností včetně videí, plateb, odběrů atd.

Do diskuse můžete zasílat své komentáře. Může vás také zajímat návrh databáze aplikací Blogu. Návrh RBAC lze použít pro implementaci Role-Based Access Control.

Kompletní schéma databáze je k dispozici také na GitHubu.


  1. Jak funguje operátor LIKE v MariaDB

  2. Funkce řetězce SQL Server (úplný seznam)

  3. Jak vytvořit jedinečný index ve sloupci NULL?

  4. Jak otevřít databázi v exkluzivním režimu v Accessu 2016