Този урок предоставя пълни стъпки за проектиране на схема на база данни от затворени или отворени анкети и анкети чрез въпросник за управление на потребителите, анкети, въпроси, отговори и гласове. Може да се използва допълнително за разработване на уебсайт за анкети и анкети или мобилно приложение.
Диаграмата на взаимоотношенията на обектите или визуалният дизайн на базата данни е показан по-долу.
Фигура 1
Бележки :За да запази схемата на базата данни проста и да разработи минимален жизнеспособен продукт, тя не покрива по-разширените опции като версия на версиите и преглед на анкети и проучвания. Той ограничава само влезли потребители, за да участват в анкета или анкета, за да се избегне спам, така че да се подават само легитимни гласове.
Можете също така да посетите популярните уроци, включително Как да инсталирате MySQL 8 на Ubuntu, Как да инсталирате MySQL 8 на Windows, RBAC база данни в MySql, Блог база данни в MySql, Научете основни SQL заявки в MySQL.
База данни за анкети
Първата стъпка е да създадете база данни за анкети. Може да се създаде с помощта на заявката, както е показано по-долу.
CREATE SCHEMA `poll` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Използвал съм набора от знаци utf8mb4 за поддръжка на широк спектър от знаци.
Таблица с потребители
В този раздел ще проектираме Таблица на потребителите за съхраняване на потребителска информация на собственика на анкетата/анкетата. Същата таблица може да се използва за свързване на собствениците на анкета/проучване, така че потребителите да могат да управляват собствената си анкета или проучване и да проследяват дейностите по гласуване. По-долу е посочено описанието на всички колони на потребителската таблица.
Id | Уникалният идентификатор за идентифициране на потребителя. |
Име | Първото име на потребителя. |
Биринно име | Биринното име на потребителя. |
Фамилия | Фамилията на потребителя. |
Мобилни | Мобилният номер на потребителя. Може да се използва за влизане и регистрация. |
Имейл | Имейлът на потребителя. Може да се използва за влизане и регистрация. |
Хеш на парола | Хешът на паролата, генериран от подходящия алгоритъм. Трябва да избягваме съхраняването на обикновени пароли. |
Хост | Флагът за идентифициране дали потребителят може да хоства анкета или анкета. |
Регистриран в | Тази колона може да се използва за изчисляване на живота на потребителя с приложението. |
Последно влизане | Може да се използва за идентифициране на последното влизане на потребителя. |
Въведение | Краткото представяне на потребителя, което да бъде показано на страницата на анкетата или анкетата. |
Профил | Данните за собственика да се показват на страницата на анкетата или анкетата. |
Потребителската таблица със съответните ограничения е както е показано по-долу.
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) );
Таблица с анкети
В този раздел ще проектираме Таблица за анкети за съхраняване на данните от анкетата и анкетата. По-долу е споменато описанието на всички колони на таблицата с анкети.
Id | Уникалният идентификатор за идентифициране на анкетата/анкетата. |
Идентификатор на хост | Идентификаторът на хоста за идентифициране на хоста на анкетата/анкетата. |
Заглавие | Заглавието на анкетата/проучването, което да се показва на страницата Анкета/Проучване и списъците. |
Метазаглавие | Мета заглавието, което ще се използва за заглавие на браузъра и SEO. |
Плюс | Плужката за формиране на URL адреса. |
Резюме | Резюме за споменаване на ключови акценти. |
Тип | Типът за разграничаване между анкетата и анкетата. |
Публикувано | Може да се използва за идентифициране дали анкетата/анкетата е публично достъпна. |
Създаден в | Той съхранява датата и часа, в които е създадена анкетата/анкетата. |
Актуализирано в | Той съхранява датата и часа, в които анкетата/анкетата се актуализира. |
Публикувано в | Той съхранява датата и часа на публикуване на анкетата/анкетата. |
Започва в | Той съхранява датата и часа, в които започва анкетата/анкетата и се отваря за гласуване. |
Завършва в | Той съхранява датата и часа, в които анкетата/анкетата приключва за гласуване. |
Съдържание | Колоната, използвана за съхраняване на данните от анкетата/проучването. |
Таблицата за анкети със съответните ограничения е както е показано по-долу.
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);
Мета на анкетата
Метатаблицата на анкетата може да се използва за съхраняване на допълнителна информация за анкета или анкета, включително URL адреса на банера на анкетата и т.н. По-долу е посочено описанието на всички колони на метатаблицата на анкетата.
Id | Уникалният идентификатор за идентифициране на мета анкетата. |
Идентификатор на анкета | Идент. № на анкетата за идентифициране на родителската анкета/анкета. |
Ключ | Ключът, идентифициращ мета. |
Съдържание | Колоната, използвана за съхраняване на метаданните на анкетата. |
Мета таблицата на анкетата със съответните ограничения е както е показано по-долу.
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;
Таблица с въпроси на анкетата
Таблицата с въпроси на анкетата може да се използва за съхраняване на въпросите, свързани с анкети и анкети. Идеалният сценарий е да имате един въпрос за анкети и няколко въпроса за анкети. По-долу е посочено описанието на всички колони на таблицата с въпроси на анкетата.
Id | Уникалният идентификатор за идентифициране на въпроса в анкетата. |
Идентификатор на анкета | Идент. № на анкетата за идентифициране на родителската анкета/анкета. |
Тип | Типът на въпроса. Типът може да бъде с един избор (Да/Не), с множество избори, избор или въвеждане. |
Активно | Флаг, за да определите дали въпросът е активен. |
Създаден в | Той съхранява датата и часа, в които е създаден въпросът. |
Актуализирано в | Той съхранява датата и часа, в които въпросът е актуализиран. |
Съдържание | Колоната, използвана за съхраняване на въпроса. |
Таблицата с въпроси на анкетата със съответните ограничения е както е показано по-долу.
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;
Таблица с отговори на анкетата
Таблицата с отговори на анкетата може да се използва за съхраняване на отговорите на въпроси с единичен, многократен избор и въпроси от избран тип. В случай на въпрос с един избор, отговорите могат да бъдат да и не. По-долу е посочено описанието на всички колони в таблицата с отговори на анкетата.
Id | Уникалният идентификатор за идентифициране на отговора на анкетата. |
Идентификатор на анкета | Идент. № на анкетата за идентифициране на родителската анкета/анкета. |
Идентификатор на въпроса | Идентификаторът на въпроса за идентифициране на родителския въпрос. |
Активно | Флаг, за да определите дали отговорът е активен. |
Създаден в | Той съхранява датата и часа, в които е създаден отговорът. |
Актуализирано в | Той съхранява датата и часа, в които отговорът се актуализира. |
Съдържание | Колоната, използвана за съхраняване на отговора. |
Таблицата с отговори на анкетата със съответните ограничения е както е показано по-долу.
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;
Таблица с гласуване в анкета
Таблицата за гласуване на анкети може да се използва за съхраняване на потребителския избор и въведените данни. По-долу е посочено описанието на всички колони в таблицата с гласуване.
Id | Уникалният идентификатор за идентифициране на вота в анкетата. |
Идентификатор на анкета | Идент. № на анкетата за идентифициране на анкетата/анкетата. |
Идентификатор на въпроса | Идентификаторът на въпроса за идентифициране на въпроса. |
Идентификатор на отговора | Идентификаторът на отговора за идентифициране на отговора. |
Потребителски идентификатор | Потребителският идентификатор за идентифициране на потребителя. |
Създаден в | Той съхранява датата и часа, в които е създаден отговорът. |
Актуализирано в | Той съхранява датата и часа, в които отговорът се актуализира. |
Съдържание | Колоната, използвана за съхраняване на въведеното от потребителя. |
Таблицата за гласуване в анкетата със съответните ограничения е както е показано по-долу.
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;
Таблица с категории и таблица с категории на анкети
В този раздел ще проектираме Таблица с категории и Таблица с категории на анкети за съхраняване на категориите на анкетата и техните съпоставяния. По-долу е споменато описанието на всички колони на таблицата с категории.
Id | Уникалният идентификатор за идентифициране на категорията. |
Идентификатор на родител | Идентификаторът на родител за идентифициране на родителската категория. |
Заглавие | Заглавието на категорията. |
Метазаглавие | Мета заглавието, което ще се използва за заглавие на браузъра и SEO. |
Плюс | Категорията, която формира URL адреса. |
Съдържание | Колоната, използвана за съхраняване на данните за категорията. |
Таблицата на категориите със съответните ограничения е както е показано по-долу.
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;
По-долу е посочено описанието на всички колони в таблицата с категории на анкети.
Идентификатор на анкетата | Идентификаторът на анкетата за идентифициране на анкетата или анкетата. |
Идентификатор на категория | Идентификаторът на категорията за идентифициране на категорията. |
Таблицата с категориите на анкетата със съответните ограничения е както е показано по-долу.
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);
Таблица с маркери и Таблица с маркери на анкета
Подобно на таблиците с категории и категории в анкетата, можем да проектираме Таблица с етикети и Таблица с маркери на анкета . Основните разлики между категорията и етикета са изброени по-долу.
- Колоната parentId не се изисква в таблицата с маркери.
- Броят на категориите остава нисък, тъй като те могат да се използват за формиране на главното меню за навигационни цели. Таговете могат да бъдат повече в сравнение с категориите.
- И двете категории и тагове могат да се използват за свързване на анкетите.
- Трябва да се присвоят само няколко категории на анкета, докато броят на маркерите може да бъде повече.
Резюме
Ето как можем да проектираме база данни за анкети, която да се използва като формиране на уебсайтове и мобилни приложения, базирани на анкети и анкети. Същото може да бъде допълнително подобрено, за да се добавят по-разширени опции, включително видеоклипове, плащания, абонаменти и т.н.
Можете да изпратите вашите коментари, за да се присъедините към дискусията. Може да се интересувате и от проектирането на база данни с блог приложения. Дизайнът на RBAC може да се използва за изпълнение на контрол на достъп, базиран на роли.
Пълната схема на базата данни е достъпна и на GitHub.