Denne vejledning indeholder komplette trin til at designe et databaseskema over lukkede eller åbne afstemninger og undersøgelser via spørgeskema for at administrere brugere, afstemninger, spørgsmål, svar og stemmer. Det kan yderligere bruges til at udvikle et afstemnings- og undersøgelseswebsted eller mobilapplikation.
Entity Relationship Diagram eller visuelle databasedesign er vist nedenfor.
Fig. 1
Noter :For at holde databaseskemaet simpelt og for at udvikle et minimalt levedygtigt produkt, dækker det ikke de mere avancerede muligheder som versionering og gennemgang af afstemninger og undersøgelser. Det begrænser til kun loggede brugere til at deltage i en undersøgelse eller afstemning for at undgå spamming, så kun legitime stemmer bliver afgivet.
Du kan også besøge de populære selvstudier, herunder Sådan installeres MySQL 8 på Ubuntu, Sådan installeres MySQL 8 på Windows, RBAC-database i MySql, Blogdatabase i MySql, Lær grundlæggende SQL-forespørgsler i MySQL.
Afstemningsdatabase
Det allerførste skridt er at oprette afstemningsdatabasen. Den kan oprettes ved hjælp af forespørgslen som vist nedenfor.
CREATE SCHEMA `poll` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Jeg har brugt tegnsættet utf8mb4 for at understøtte en bred vifte af tegn.
Brugertabel
I dette afsnit vil vi designe Brugertabellen at gemme brugeroplysninger om afstemningen/undersøgelsesejeren. Den samme tabel kan bruges til at relatere ejerne af afstemningen/undersøgelsen, så brugerne kan administrere deres egen afstemning eller undersøgelse og til at spore afstemningsaktiviteterne. Nedenfor nævnt er beskrivelsen af alle kolonnerne i brugertabellen.
Id | Det unikke id til at identificere brugeren. |
Fornavn | Brugerens fornavn. |
Mellemnavn | Brugerens mellemnavn. |
Efternavn | Brugerens efternavn. |
Mobil | Brugerens mobilnummer. Det kan bruges til login og registreringsformål. |
Brugerens e-mail. Det kan bruges til login og registreringsformål. | |
Password Hash | Adgangskodehashen genereret af den passende algoritme. Vi skal undgå at gemme almindelige adgangskoder. |
Vært | Flaget til at identificere, om brugeren kan være vært for afstemning eller undersøgelse. |
Registreret på | Denne kolonne kan bruges til at beregne levetiden for brugeren med applikationen. |
Sidste login | Det kan bruges til at identificere brugerens sidste login. |
Introduktion | Den korte introduktion af brugeren, der skal vises på afstemnings- eller undersøgelsessiden. |
Profil | Ejeroplysningerne, der skal vises på afstemnings- eller undersøgelsessiden. |
Brugertabellen med de relevante begrænsninger er som vist nedenfor.
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) );
Afstemningstabel
I dette afsnit vil vi designe afstemningstabellen til at gemme afstemnings- og undersøgelsesdata. Nedenfor nævnt er beskrivelsen af alle kolonnerne i afstemningstabellen.
Id | Det unikke id til at identificere afstemningen/undersøgelsen. |
Værts-id | Vært-id'et til at identificere afstemnings-/undersøgelsesværten. |
Titel | Afstemnings-/undersøgelsestitlen, der skal vises på afstemnings-/undersøgelsessiden og listerne. |
Metatitel | Metatitlen, der skal bruges til browsertitel og SEO. |
Snegl | Sneglen til at danne URL'en. |
Oversigt | Opsummeringen for at nævne de vigtigste højdepunkter. |
Type | Typen til at skelne mellem afstemningen og undersøgelsen. |
Udgivet | Det kan bruges til at identificere, om afstemningen/undersøgelsen er offentligt tilgængelig. |
Oprettet på | Den gemmer datoen og klokkeslættet, hvor afstemningen/undersøgelsen er oprettet. |
Opdateret kl. | Den gemmer datoen og klokkeslættet, hvor afstemningen/undersøgelsen opdateres. |
Udgivet på | Det gemmer datoen og klokkeslættet, hvor afstemningen/undersøgelsen offentliggøres. |
Starter ved | Den gemmer datoen og klokkeslættet, hvor afstemningen/undersøgelsen starter, og åbner op for afstemning. |
Ender kl. | Den gemmer datoen og klokkeslættet, hvor afstemningen/undersøgelsen lukker for afstemning. |
Indhold | Kolonnen, der bruges til at gemme afstemnings-/undersøgelsesdataene. |
Afstemningstabellen med de relevante begrænsninger er som vist nedenfor.
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);
Afstemningsmeta
Afstemningsmetatabellen kan bruges til at gemme yderligere information om en afstemning eller undersøgelse, inklusive afstemningens banner-URL osv. Nedenfor nævnt er beskrivelsen af alle kolonnerne i afstemningsmetatabellen.
Id | Det unikke id til at identificere afstemningens meta. |
Afstemnings-id | Afstemnings-id'et til at identificere den overordnede afstemning/undersøgelse. |
Nøgle | Nøglen, der identificerer metaen. |
Indhold | Kolonnen, der bruges til at gemme afstemningens metadata. |
Afstemningsmetatabellen med de relevante begrænsninger er som vist nedenfor.
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 med afstemningsspørgsmål
Afstemningsspørgsmålstabellen kan bruges til at gemme spørgsmål relateret til afstemninger og undersøgelser. Det ideelle scenarie er at have ét spørgsmål til afstemninger og flere spørgsmål til undersøgelser. Nedenfor nævnt er beskrivelsen af alle kolonnerne i afstemningsspørgsmålstabellen.
Id | Det unikke id til at identificere afstemningsspørgsmålet. |
Afstemnings-id | Afstemnings-id'et til at identificere den overordnede afstemning/undersøgelse. |
Type | Spørgsmålstypen. Typen kan være et enkelt valg (Ja/Nej), multiple-choice, vælg eller input. |
Aktiv | Flag for at identificere, om spørgsmålet er aktivt. |
Oprettet på | Den gemmer datoen og klokkeslættet, hvor spørgsmålet oprettes. |
Opdateret kl. | Den gemmer dato og klokkeslæt, hvor spørgsmålet opdateres. |
Indhold | Kolonnen, der bruges til at gemme spørgsmålet. |
Afstemningsspørgsmålstabellen med de relevante begrænsninger er som vist nedenfor.
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;
Tabel med afstemningssvar
Afstemningssvartabellen kan bruges til at gemme svarene på enkeltvalgs-, multiple-choice- og udvalgte spørgsmål. I tilfælde af enkeltvalgsspørgsmål kan svarene være Ja og Nej. Nedenfor nævnt er beskrivelsen af alle kolonnerne i afstemningssvartabellen.
Id | Det unikke id til at identificere afstemningssvaret. |
Afstemnings-id | Afstemnings-id'et til at identificere den overordnede afstemning/undersøgelse. |
Spørgsmåls-id | Spørgsmåls-id'et til at identificere det overordnede spørgsmål. |
Aktiv | Flag for at identificere, om svaret er aktivt. |
Oprettet på | Den gemmer datoen og klokkeslættet, hvor svaret er oprettet. |
Opdateret kl. | Den gemmer datoen og klokkeslættet, hvor svaret er opdateret. |
Indhold | Kolonnen, der bruges til at gemme svaret. |
Afstemningssvarstabellen med de relevante begrænsninger er som vist nedenfor.
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;
Afstemningens stemmetabel
Afstemningstemmetabellen kan bruges til at gemme brugervalg og input. Nedenfor nævnt er beskrivelsen af alle kolonnerne i afstemningstabellen.
Id | Det unikke id til at identificere afstemningens stemme. |
Afstemnings-id | Afstemnings-id'et til at identificere afstemningen/undersøgelsen. |
Spørgsmåls-id | Spørgsmåls-id'et til at identificere spørgsmålet. |
Svar-id | Svar-id'et til at identificere svaret. |
Bruger-id | Bruger-id'et til at identificere brugeren. |
Oprettet på | Den gemmer datoen og klokkeslættet, hvor svaret er oprettet. |
Opdateret kl. | Den gemmer datoen og klokkeslættet, hvor svaret er opdateret. |
Indhold | Kolonnen, der bruges til at gemme brugerinput. |
Afstemningstabellen med de relevante begrænsninger er som vist nedenfor.
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;
Kategori- og afstemningskategoritabel
I dette afsnit vil vi designe Kategoritabellen og afstemningskategoritabel for at gemme afstemningskategorierne og deres tilknytninger. Nedenfor nævnt er beskrivelsen af alle kolonnerne i kategoritabellen.
Id | Det unikke id til at identificere kategorien. |
Forældre-id | Det overordnede id til at identificere den overordnede kategori. |
Titel | Kategorititlen. |
Metatitel | Metatitlen, der skal bruges til browsertitel og SEO. |
Snegl | Kategoriesneglen til at danne URL'en. |
Indhold | Kolonnen, der bruges til at gemme kategoridataene. |
Kategoritabellen med de relevante begrænsninger er som vist nedenfor.
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;
Nedenfor nævnt er beskrivelsen af alle kolonnerne i afstemningskategoritabellen.
Afstemnings-id | Afstemnings-id'et til at identificere afstemningen eller undersøgelsen. |
Kategori-id | Kategori-id'et til at identificere kategorien. |
Afstemningskategoritabellen med de relevante begrænsninger er som vist nedenfor.
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 og afstemnings-tag-tabel
På samme måde som kategori- og afstemningskategoritabellerne kan vi designe Tag-tabellen og afstemningsmærketabel . De største forskelle mellem kategorien og tagget er angivet nedenfor.
- Forældre-id-kolonnen er ikke påkrævet i tagtabellen.
- Antallet af kategorier forbliver lavt, da disse kan bruges til at danne hovedmenuen til navigationsformål. Mærkerne kan være flere sammenlignet med kategorier.
- Både kategorier og tags kan bruges til at relatere afstemningerne.
- Man bør kun tildele nogle få kategorier til en afstemning, hvorimod antallet af tags kan være mere.
Oversigt
Sådan kan vi designe en afstemningsdatabase, der skal bruges som dannelse af afstemnings- og undersøgelsesbaserede websteder og mobilapplikationer. Det samme kan forbedres yderligere for at tilføje mere avancerede muligheder, herunder videoer, betalinger, abonnementer osv.
Du kan indsende dine kommentarer for at deltage i diskussionen. Du kan også være interesseret i at designe databasen med blogapplikationer. RBAC-designet kan bruges til rollebaseret adgangskontrolimplementering.
Det komplette databaseskema er også tilgængeligt på GitHub.