sql >> Databasteknik >  >> RDS >> Mysql

Guide till designdatabas för frågesport i MySQL

Denna handledning innehåller fullständiga steg för att utforma ett databasschema med onlinetester och frågesportsystem för att hantera användare, frågesporter, frågor, svar och svar. Den kan användas ytterligare för att utveckla onlinetestning eller frågesportbaserade webbplatser eller applikationer.

Entity Relationship Diagram eller visuell databasdesign visas nedan.

Fig 1

Anteckningar :Det begränsar till att endast inloggade användare kan delta i frågesporten för att undvika spam. Frågesporterna anses vara lika korta jämfört med tester.

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.

Frågesportsdatabas

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

CREATE SCHEMA `quiz` 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. Samma tabell kan användas för att relatera frågesportvärdarna så att användarna kan hantera sina egna frågesporter och spåra tagningarna. 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 en frågesport.
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 värdanvändaren som ska visas på test- eller frågesportsidan.
Profil Ägarinformationen som ska visas på test- eller frågesportsidan.

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

CREATE TABLE `quiz`.`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) );

Frågesportstabell

I det här avsnittet kommer vi att utforma Frågesportstabellen för att lagra frågesportsdata. Nedan nämns beskrivningen av alla kolumner i frågesportstabellen.

Id Det unika ID:t för att identifiera frågesporten.
Värd-ID Värd-id för att identifiera frågesportvärden.
Titel Frågesportstiteln som ska visas på frågesportsidan 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 testet och frågesporten.
Poäng Totalpoängen för frågesporten.
Publicerad Den kan användas för att identifiera om testet/quizet är allmänt tillgängligt.
Skapat vid Den lagrar datum och tid då testet/frågesporten skapas.
Uppdaterad kl. Den lagrar datum och tid då testet/frågesporten uppdateras.
Publicerad på Den lagrar datum och tid då testet/quizet publiceras.
Börjar vid Den lagrar datum och tid då testet/quizet startar och öppnas för upptagningar.
Slutar vid Den lagrar datum och tid då testet/quizet stängs för upptagningar.
Innehåll Kolumnen som används för att lagra test-/frågesportdata.

Frågesportstabellen med lämpliga begränsningar är som visas nedan.

CREATE TABLE `quiz`.`quiz` (
`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,
`score` 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_quiz_host` (`hostId` ASC),
CONSTRAINT `fk_quiz_host`
FOREIGN KEY (`hostId`)
REFERENCES `quiz`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

Frågesport Meta

Quiz Meta Table kan användas för att lagra ytterligare information om tester eller frågesport inklusive frågesportsbannerns URL etc. Nedan nämns en beskrivning av alla kolumner i Quiz Meta Table.

Id Det unika ID:t för att identifiera frågesportens meta.
Frågesports-ID Frågesport-ID för att identifiera föräldertestet/frågesporten.
Nyckel Nyckeln som identifierar meta.
Innehåll Kolumnen som används för att lagra frågesportens metadata.

Quiz-metatabellen med lämpliga begränsningar är som visas nedan.

CREATE TABLE `quiz`.`quiz_meta` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`quizId` BIGINT NOT NULL,
`key` VARCHAR(50) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_meta_quiz` (`quizId` ASC),
UNIQUE INDEX `uq_quiz_meta` (`quizId` ASC, `key` ASC),
CONSTRAINT `fk_meta_quiz`
FOREIGN KEY (`quizId`)
REFERENCES `quiz`.`quiz` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

Frågesportstabell

Tabellen Frågesportsfrågor kan användas för att lagra frågor relaterade till tester och frågesporter. Nedan nämns beskrivningen av alla kolumner i frågesportstabellen.

Id Det unika ID:t för att identifiera frågesportsfrågan.
Frågesports-ID Frågesport-ID för att identifiera föräldertestet/frågesporten.
Typ Typen av fråga. Typen kan vara ett enda val (Ja/Nej), flervalsalternativ eller välj. Vi kan också ha typ som inmatning och textområde ifall frågesportresultatet behöver kontrolleras manuellt.
Aktiv Flagga för att identifiera om frågan är aktiv. En frågesport kan ha flera frågor, men endast selektiva frågor är aktiva åt gången.
Nivå Nivån på frågan för att identifiera om den är lätt, medium eller svår.
Poäng Poängen för en enskild fråga. Vi bör se till att endast selektiva frågor är aktiva åt gången och totalpoängen för de aktiva frågorna är lika med quizresultatet innan vi publicerar quizet.
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.

Frågesportstabellen med lämpliga begränsningar är som visas nedan.

CREATE TABLE `quiz`.`quiz_question` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`quizId` BIGINT NOT NULL,
`type` VARCHAR(50) NOT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 0,
`level` SMALLINT(6) NOT NULL DEFAULT 0,
`score` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_question_quiz` (`quizId` ASC),
CONSTRAINT `fk_question_quiz`
FOREIGN KEY (`quizId`)
REFERENCES `quiz`.`quiz` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

Svarstabell för frågesport

Svarstabellen för frågesport kan användas för att lagra svaren på envals-, flervals- och utvalda typfrågor. När det gäller en envalsfråga kan svaren vara Ja och Nej. Nedan nämns beskrivningen av alla kolumner i frågesportssvarstabellen.

Id Det unika ID:t för att identifiera frågesportsvaret.
Frågesports-ID Frågesport-ID för att identifiera föräldertestet/frågesporten.
Fråge-ID Fråge-id för att identifiera den överordnade frågan.
Aktiv Flagga för att identifiera om svaret är aktivt.
Rätt Flagga för att identifiera om svaret är korrekt.
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.

Frågesportssvarstabellen med lämpliga begränsningar är som visas nedan.

CREATE TABLE `quiz`.`quiz_answer` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`quizId` BIGINT NOT NULL,
`questionId` BIGINT NOT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 0,
`correct` 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_quiz` (`quizId` ASC),
CONSTRAINT `fk_answer_quiz`
FOREIGN KEY (`quizId`)
REFERENCES `quiz`.`quiz` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

ALTER TABLE `quiz`.`quiz_answer`
ADD INDEX `idx_answer_question` (`questionId` ASC);
ALTER TABLE `quiz`.`quiz_answer`
ADD CONSTRAINT `fk_answer_question`
FOREIGN KEY (`questionId`)
REFERENCES `quiz`.`quiz_question` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Ta tabell

I det här avsnittet kommer vi att utforma Ta-tabellen för att spåra registreringen och tidpunkten för användarförsök till frågesporten. Nedan nämns beskrivningen av alla kolumner i Take Table.

Id Det unika ID:t för att identifiera tagningen.
Användar-ID Användar-ID för att identifiera frågesporttagaren.
Frågesports-ID Frågesport-ID för att identifiera frågesporten.
Status Tamens status. Det kan registreras, startas, pausas, avslutas, deklareras.
Poäng Totalpoäng som användaren har fått.
Skapat vid Den lagrar datum och tid då tagningen skapas.
Uppdaterad kl. Den lagrar datum och klockslag då tagningen uppdateras.
Började vid Den lagrar datum och tid då tagningen startade.
Färdig vid Den lagrar datum och tid då tagningen är klar.
Innehåll Kolumnen som används för att lagra ta-kommentarerna.

Ta-tabellen med lämpliga begränsningar är som visas nedan.

CREATE TABLE `quiz`.`take` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`quizId` BIGINT NOT NULL,
`status` SMALLINT(6) NOT NULL DEFAULT 0,
`score` SMALLINT(6) NOT NULL DEFAULT 0,
`published` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`startedAt` DATETIME NULL DEFAULT NULL,
`finishedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_take_user` (`userId` ASC),
CONSTRAINT `fk_take_user`
FOREIGN KEY (`userId`)
REFERENCES `quiz`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

ALTER TABLE `quiz`.`take`
ADD INDEX `idx_take_quiz` (`quizId` ASC);
ALTER TABLE `quiz`.`take`
ADD CONSTRAINT `fk_take_quiz`
FOREIGN KEY (`quizId`)
REFERENCES `quiz`.`quiz` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Ta svarstabell

Ta svarstabellen kan användas för att lagra de svar som valts av användaren när han gör frågesporten. När det gäller en flervalsfråga kan det finnas flera svar. Nedan nämns beskrivningen av alla kolumner i tabellen Ta svar.

Id Det unika ID:t för att identifiera svaret.
Ta ID Take-id för att identifiera frågesportförsöket.
Svars-ID Svars-ID för att identifiera frågesportsvaret.
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 vid frågor av inmatning eller textområdestyp.

Ta svarstabellen med lämpliga begränsningar visas nedan.

CREATE TABLE `quiz`.`take_answer` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`takeId` BIGINT NOT NULL,
`questionId` BIGINT NOT NULL,
`answerId` 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_take` (`takeId` ASC),
CONSTRAINT `fk_answer_take`
FOREIGN KEY (`takeId`)
REFERENCES `quiz`.`take` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

ALTER TABLE `quiz`.`take_answer`
ADD INDEX `idx_tanswer_question` (`questionId` ASC);
ALTER TABLE `quiz`.`take_answer`
ADD CONSTRAINT `fk_tanswer_question`
FOREIGN KEY (`questionId`)
REFERENCES `quiz`.`quiz_question` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

ALTER TABLE `quiz`.`take_answer`
ADD INDEX `idx_tanswer_answer` (`answerId` ASC);
ALTER TABLE `quiz`.`take_answer`
ADD CONSTRAINT `fk_tanswer_answer`
FOREIGN KEY (`answerId`)
REFERENCES `quiz`.`quiz_answer` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Sammanfattning

I den här handledningen har vi diskuterat databasdesignen för ett frågesportsystem för att lagra användarna, frågesporter, frågor, svar och frågesportförsök i form av take.

Du kan skicka in dina kommentarer för att delta i diskussionen. Du kanske också är intresserad av att designa databasen för blogg- och omröstnings- och undersökningsapplikationerna.

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


  1. Hur man konfigurerar PostgreSQL för att acceptera alla inkommande anslutningar

  2. SELECT höjer undantag i PL/pgSQL-funktionen

  3. Hur kan jag använda regex för att dela en sträng med en sträng som avgränsare?

  4. Kolumn _ID finns inte fel även om den finns i tabellen