sql >> Databasteknik >  >> RDS >> Mysql

Guide till designdatabas för restaurangordersystem i MySQL

Denna handledning innehåller fullständiga steg för att utforma ett databasschema för restaurangbeställningssystemet för att hantera användare, bordsbokningar, menyer, inventering, beställningar och betalningar. Det tillhandahåller designen för matorderdatabasen för att hantera matbeställningarna för restauranger. Det kan användas ytterligare för att utveckla lokala applikationer för restaurangbeställningssystem.

Sådana beställningssystem är implementerade för att automatisera orderhantering och effektivt hantera topptider för beställning, vilket förbättrar kundnöjdheten med mindre ansträngningar – en win-win-situation för restaurangföretag.

Entity Relationship Diagram eller visuell databasdesign visas nedan.

Restaurangbeställningssystem

Anteckningar :Den kan användas för onlinebokning av borden och förbeställning innan du når restaurangen. Säkerheten kan också hanteras genom att följa RBAC Database i MySQL.

Du kan också besöka de populära handledningarna inklusive Hur man installerar MySQL 8 på Ubuntu, Hur man installerar MySQL 8 på Windows, Hur man installerar MySQL 8 med Workbench på Windows 10, RBAC Database i MySql, Blog Database i MySql, Quiz Database i MySQL, Enkät- och enkätdatabas i MySQL, online kundvagnsdatabas och lär dig grundläggande SQL-frågor i MySQL.

Restaurangdatabas

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

CREATE SCHEMA `restaurant` 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 hantera olika typer av användare inklusive administratörer, kockar, agenter och kunder. Den kan användas för att relatera användarna till menyer, artiklar, bordsbokningar och beställningar. Användare kan spåra sina egna bord och beställningar. 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 eller krypterade lösenord.
Admin Flaggan för att identifiera om användaren är en administratör. Det krävs inte om RBAC-tabeller skapas genom att följa RBAC-databasdesignen.
Leverantör Flaggan för att identifiera om användaren kan ta emot lagerbeställningar. Det krävs inte om RBAC-tabeller skapas genom att följa RBAC-databasdesignen.
Kock Flaggan för att identifiera om användaren kan laga maten. Det krävs inte om RBAC-tabeller skapas genom att följa RBAC-databasdesignen.
Agent Flaggan för att identifiera om användaren kan vara värd för en tabell. Det krävs inte om RBAC-tabeller skapas genom att följa RBAC-databasdesignen.
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 leverantörsanvändaren som ska visas på produktsidan.
Profil Leverantörsinformation som ska visas på produktsidan.

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

CREATE TABLE `restaurant`.`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,
`admin` TINYINT(1) NOT NULL DEFAULT 0,
`vendor` TINYINT(1) NOT NULL DEFAULT 0,
`chef` TINYINT(1) NOT NULL DEFAULT 0,
`agent` 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) );

Ingrediens-, artikel-, recept- och menytabeller

I det här avsnittet kommer vi att utforma Ingrediens-, artikel-, recept- och menytabeller för att lagra menyerna och objektdata.

Nedan nämns beskrivningen av alla kolumner i Ingredienstabellen . Ingredienstabellen är också mappad för att identifiera leverantören som kan leverera ingrediensen för att fylla på lagret. I ett mer avancerat scenario kan det finnas en separat tabell för att lagra ingrediens- och leverantörsrelationen för att stödja flera leverantörer för samma ingrediens.

Id Det unika ID:t för att identifiera ingrediensen.
Användar-ID Användar-ID för att identifiera administratören.
Leverant-ID Leverantörs-id för att identifiera leverantören.
Titel Ingrediensens titel som ska visas på artikelreceptet.
Snigel Den unika snigeln som ska användas som GID för ingrediensen.
Sammanfattning Sammanfattningen för att nämna de viktigaste höjdpunkterna.
Typ Typen för att skilja mellan de olika ingredienstyperna.
SKU Lagerhållningsenheten för att spåra ingrediensinventeringen.
Mängd Den tillgängliga kvantiteten av ingrediensen.
Enhet Mätenheterna som tilldelats ingrediensen.
Skapat vid Den lagrar datum och tid då ingrediensen skapades.
Uppdaterad kl. Den lagrar datum och tid då ingrediensen uppdateras.
Innehåll Kolumnen som används för att lagra ytterligare information om ingrediensen.

Den använder kolumnerna kvantitet och enhet för att spåra det tillgängliga lagret i ingrediensinventeringen. Ingredienstabellen med lämpliga begränsningar är som visas nedan.

CREATE TABLE `restaurant`.`ingredient` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`vendorId` BIGINT DEFAULT NULL,
`title` VARCHAR(75) NOT NULL,
`slug` VARCHAR(100) NOT NULL,
`summary` TINYTEXT NULL,
`type` SMALLINT(6) NOT NULL DEFAULT 0,
`sku` VARCHAR(100) NOT NULL,
`quantity` FLOAT NOT NULL DEFAULT 0,
`unit` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_slug` (`slug` ASC),
INDEX `idx_ingredient_user` (`userId` ASC),
CONSTRAINT `fk_ingredient_user`
FOREIGN KEY (`userId`)
REFERENCES `restaurant`.`user` (`id`)
ON DELETE RESTRICT
ON UPDATE NO ACTION);

ALTER TABLE `restaurant`.`ingredient`
ADD INDEX `idx_ingredient_vendor` (`vendorId` ASC);
ALTER TABLE `restaurant`.`ingredient`
ADD CONSTRAINT `fk_ingredient_vendor`
FOREIGN KEY (`vendorId`)
REFERENCES `restaurant`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Nedan nämns beskrivningen av alla kolumner i Artikeltabellen . Artikeltabellen är också mappad för att identifiera leverantören som kan leverera den icke-tillagade artikeln för att fylla på lagret igen. I ett mer avancerat scenario kan det finnas en separat tabell för att lagra artikeln och leverantörsrelationen för att stödja flera leverantörer för samma artikel.

Anteckningar :Vi kan också använda samma tabell för att lagra ingredienser och varor för att förenkla restaurang- och leverantörsbeställningar. I ett sådant fall krävs en självanslutning för att identifiera varans ingredienser. Dessutom är kolumnerna matlagning och pris inte användbara för ingrediensrader.

Id Det unika ID:t för att identifiera objektet.
Användar-ID Användar-ID för att identifiera administratören.
Leverant-ID Leverantörs-id för att identifiera leverantören.
Titel Artikeltiteln som ska visas på menyn.
Snigel Den unika slug som ska användas som GID för artikeln.
Sammanfattning Sammanfattningen för att nämna de viktigaste höjdpunkterna.
Typ Typen för att skilja mellan de olika objekttyperna.
Matlagning Flaggan för att identifiera om tillagning krävs för föremålet.
SKU Lagerhållningsenheten för att spåra artikelinventeringen. Det krävs bara om varan inte är kopplad till ingredienser.
Pris Försäljningspriset för antingen en enhet eller en portion.
Mängd Den tillgängliga kvantiteten av artikeln. Det krävs bara om varan inte är kopplad till ingredienser.
Enhet Mätenheterna som tilldelats objektet. Det krävs bara om varan inte är kopplad till ingredienser.
Recept Instruktionerna som krävs för att laga varan.
Instruktioner Instruktionerna som krävs för att visa objektet.
Skapat vid Den lagrar datum och tid då objektet skapades.
Uppdaterad kl. Den lagrar datum och tid då objektet uppdateras.
Innehåll Kolumnen som används för att lagra ytterligare detaljer för objektet.

I likhet med ingredienstabellen använder den kolumnerna kvantitet och enhet för att spåra det tillgängliga lagret i artikelinventeringen. Artikeltabellen med lämpliga begränsningar är som visas nedan.

CREATE TABLE `restaurant`.`item` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`vendorId` BIGINT DEFAULT NULL,
`title` VARCHAR(75) NOT NULL,
`slug` VARCHAR(100) NOT NULL,
`summary` TINYTEXT NULL,
`type` SMALLINT(6) NOT NULL DEFAULT 0,
`cooking` TINYINT(1) NOT NULL DEFAULT 0,
`sku` VARCHAR(100) NOT NULL,
`price` FLOAT NOT NULL DEFAULT 0,
`quantity` FLOAT NOT NULL DEFAULT 0,
`unit` SMALLINT(6) NOT NULL DEFAULT 0,
`recipe` TEXT NULL DEFAULT NULL,
`instructions` TEXT NULL DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_slug` (`slug` ASC),
INDEX `idx_item_user` (`userId` ASC),
CONSTRAINT `fk_item_user`
FOREIGN KEY (`userId`)
REFERENCES `restaurant`.`user` (`id`)
ON DELETE RESTRICT
ON UPDATE NO ACTION);

ALTER TABLE `restaurant`.`item`
ADD INDEX `idx_item_vendor` (`vendorId` ASC);
ALTER TABLE `restaurant`.`item`
ADD CONSTRAINT `fk_item_vendor`
FOREIGN KEY (`vendorId`)
REFERENCES `restaurant`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Recepttabellen kan användas för att spåra mängden ingredienser som krävs för ett föremål för en enda portion. Nedan nämns beskrivningen av alla kolumner i recepttabellen.

Id Det unika ID:t för att identifiera receptet.
Artikel-ID Artikel-id för att identifiera objektet.
Ingrediens-ID Ingrediens-id för att identifiera ingrediensen.
Mängd Mängden av ingrediensen som krävs för att tillaga föremålet för en enda portion.
Enhet Mätenheterna för att identifiera den ingredienskvantitet som krävs för artikeln.
Instruktioner Ingrediensinstruktionerna som krävs för att laga varan.

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

CREATE TABLE `restaurant`.`recipe` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`itemId` BIGINT NOT NULL,
`ingredientId` BIGINT NOT NULL,
`quantity` FLOAT NOT NULL DEFAULT 0,
`unit` SMALLINT(6) NOT NULL DEFAULT 0,
`instructions` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_recipe_item` (`itemId` ASC),
UNIQUE INDEX `uq_recipe_item_ingredient` (`itemId` ASC, `ingredientId` ASC),
CONSTRAINT `fk_recipe_item`
FOREIGN KEY (`itemId`)
REFERENCES `restaurant`.`item` (`id`)
ON DELETE RESTRICT
ON UPDATE NO ACTION)
ENGINE = InnoDB;

ALTER TABLE `restaurant`.`recipe`
ADD INDEX `idx_recipe_ingredient` (`ingredientId` ASC);
ALTER TABLE `restaurant`.`recipe`
ADD CONSTRAINT `fk_recipe_ingredient`
FOREIGN KEY (`ingredientId`)
REFERENCES `restaurant`.`ingredient` (`id`)
ON DELETE RESTRICT
ON UPDATE NO ACTION;

Nedan nämns beskrivningen av alla kolumner i menytabellen . Menytabellen kan användas för att lagra flera menyer i samma restaurang.

Id Det unika ID:t för att identifiera menyn.
Användar-ID Användar-ID för att identifiera administratören.
Titel Menytiteln som ska visas på menykortet.
Snigel Den unika slug som ska användas som GID för menyn.
Sammanfattning Sammanfattningen för att nämna de viktigaste höjdpunkterna på menykortet.
Typ Typen för att skilja mellan de olika menytyperna.
Skapat vid Den lagrar datum och tid då objektet skapades.
Uppdaterad kl. Den lagrar datum och tid då objektet uppdateras.
Innehåll Kolumnen som används för att lagra ytterligare information om menyn.

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

CREATE TABLE `restaurant`.`menu` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`title` VARCHAR(75) NOT NULL,
`slug` VARCHAR(100) NOT NULL,
`summary` TINYTEXT NULL,
`type` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_slug` (`slug` ASC),
INDEX `idx_menu_user` (`userId` ASC),
CONSTRAINT `fk_menu_user`
FOREIGN KEY (`userId`)
REFERENCES `restaurant`.`user` (`id`)
ON DELETE RESTRICT
ON UPDATE NO ACTION);

Menyposttabellen kan användas för att spåra de objekt som är tillgängliga på menykortet. Nedan nämns beskrivningen av alla kolumner i menypunktstabellen.

Id Det unika ID:t för att identifiera menyalternativet.
Meny-ID Meny-id för att identifiera menyn.
Artikel-ID Artikel-id för att identifiera objektet.
Aktiv Flaggan för att kontrollera om objektet är tillgängligt.

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

CREATE TABLE `restaurant`.`menu_item` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`menuId` BIGINT NOT NULL,
`itemId` BIGINT NOT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 1,
PRIMARY KEY (`id`),
INDEX `idx_menu_item_menu` (`menuId` ASC),
UNIQUE INDEX `uq_menu_item` (`menuId` ASC, `itemId` ASC),
CONSTRAINT `fk_menu_item_menu`
FOREIGN KEY (`menuId`)
REFERENCES `restaurant`.`menu` (`id`)
ON DELETE RESTRICT
ON UPDATE NO ACTION)
ENGINE = InnoDB;

ALTER TABLE `restaurant`.`menu_item`
ADD INDEX `idx_menu_item_item` (`itemId` ASC);
ALTER TABLE `restaurant`.`menu_item`
ADD CONSTRAINT `fk_menu_item_item`
FOREIGN KEY (`itemId`)
REFERENCES `restaurant`.`item` (`id`)
ON DELETE RESTRICT
ON UPDATE NO ACTION;

Item Chef-bordet kan användas för att identifiera den kock som tilldelats att laga maten. Nedan nämns beskrivningen av alla kolumner i Item Chef Table.

Id Det unika ID:t för att identifiera menyalternativet.
Artikel-ID Artikel-id för att identifiera objektet.
Kock-ID Kockens ID för att identifiera användaren.
Aktiv Flaggan för att kontrollera om kocken är tillgänglig för att laga maten.

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

CREATE TABLE `restaurant`.`item_chef` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`itemId` BIGINT NOT NULL,
`chefId` BIGINT NOT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 1,
PRIMARY KEY (`id`),
INDEX `idx_item_chef_item` (`itemId` ASC),
UNIQUE INDEX `uq_item_chef` (`itemId` ASC, `chefId` ASC),
CONSTRAINT `fk_item_chef_item`
FOREIGN KEY (`itemId`)
REFERENCES `restaurant`.`item` (`id`)
ON DELETE CASCADE
ON UPDATE NO ACTION)
ENGINE = InnoDB;

ALTER TABLE `restaurant`.`item_chef`
ADD INDEX `idx_item_chef_chef` (`chefId` ASC);
ALTER TABLE `restaurant`.`item_chef`
ADD CONSTRAINT `fk_item_chef_chef`
FOREIGN KEY (`chefId`)
REFERENCES `restaurant`.`user` (`id`)
ON DELETE CASCADE
ON UPDATE NO ACTION;

Bordskiva och bokningsbord

I det här avsnittet kommer vi att designa bordsskivan och bokningsborden för att lagra restaurangborden och deras bokningsuppgifter.

TableTop-tabellen kan användas för att lagra detaljerna om borden på restaurangen. Tabellens status kan vara ledig, reserverad och aktiv. Jag har använt TableTop istället för Table för att skilja det från tabellnyckelordet i MySQL. Nedan nämns beskrivningen av alla kolumner i TableTop-tabellen.

Id Det unika ID:t för att identifiera tabellen.
Kod Tabellkoden.
Status Recensionsbetyget.
Kapacitet Bordets totala sittkapacitet.
Skapat vid Den lagrar datum och tid då tabellen skapas.
Uppdaterad kl. Den lagrar datum och tid då tabellen uppdateras.
Innehåll Kolumnen som används för att lagra ytterligare information om tabellen.

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

CREATE TABLE `restaurant`.`table_top` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`code` VARCHAR(100) NOT NULL,
`status` SMALLINT(6) NOT NULL DEFAULT 0,
`capacity` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`));

Bokningsbord kan användas för att boka restaurangborden antingen online eller på plats. En inloggad eller befintlig användare kan också kopplas till Booking. Den förutsätter också att endast de bord som har statusen Gratis kan reserveras. Bordsstatusen kan ändras till Reserverad efter att bokningen är bekräftad. Bordsstatusen kan också ställas in på Aktiv så snart gästerna ockuperar det. Nedan nämns beskrivningen av alla kolumner i bokningstabellen.

Anteckningar :Bokningsbordet täcker inte betalningarna för att boka bord. Det kan uppdateras ytterligare genom att lägga till ytterligare kolumner för att hantera betalningarna som ingår i bokningen av bordet.

Id Det unika ID:t för att identifiera bokningen.
Tabell-ID Bords-ID för att identifiera bordet som är kopplat till bokningen.
Användar-ID Användar-ID för att identifiera den registrerade användaren som är kopplad till bokningen.
Token Den unika token som är kopplad till bokningen.
Status Status för bokningen kan vara Ny, Lounge, Aktiv och Slutförd.
Förnamn Gästens förnamn.
Mellannamn Gästens mellannamn.
Efternamn Användarens efternamn.
Mobil Användarens mobilnummer.
E-post Användarens e-postadress.
rad 1 Första raden att lagra adress.
rad 2 Den andra raden för att lagra adressen.
Stad Stad för adressen.
Provins Adressens provins.
Land Adressens land.
Skapat vid Den lagrar datum och tid då bokningen skapas.
Uppdaterad kl. Den lagrar datum och tid då bokningen uppdateras.
Innehåll Kolumnen som används för att lagra ytterligare information om bokningen.

Bokningstabellen med lämpliga begränsningar visas nedan.

CREATE TABLE `restaurant`.`booking` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`tableId` BIGINT NOT NULL,
`userId` BIGINT NULL DEFAULT NULL,
`token` VARCHAR(100) NOT NULL,
`status` SMALLINT(6) NOT NULL DEFAULT 0,
`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,
`line1` VARCHAR(50) NULL DEFAULT NULL,
`line2` VARCHAR(50) NULL DEFAULT NULL,
`city` VARCHAR(50) NULL DEFAULT NULL,
`province` VARCHAR(50) NULL DEFAULT NULL,
`country` VARCHAR(50) NULL DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_booking_table` (`tableId` ASC),
CONSTRAINT `fk_booking_table`
FOREIGN KEY (`tableId`)
REFERENCES `restaurant`.`table_top` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

ALTER TABLE `restaurant`.`booking`
ADD INDEX `idx_booking_user` (`userId` ASC);
ALTER TABLE `restaurant`.`booking`
ADD CONSTRAINT `fk_booking_user`
FOREIGN KEY (`userId`)
REFERENCES `restaurant`.`user` (`id`)
ON DELETE CASCADE
ON UPDATE NO ACTION;

tabellen för bokningsobjekt krävs för att spåra de varor som gästen beställt. Nedan nämns beskrivningen av alla kolumner i bokningsobjekttabellen.

Id Det unika ID:t för att identifiera bokningsobjektet.
Boknings-ID Boknings-id för att identifiera bokningen som är kopplad till bokningsobjektet.
Artikel-ID Artikel-id för att identifiera objektet som är kopplat till bokningsobjektet.
SKU Varans SKU när du beställde den.
Pris Varans försäljningspris vid beställning.
Rabatt Rabatten på varan när du beställer den.
Mängd Mängden av artikeln som beställts av användaren. Det kan antingen vara multiplikatorn för objektenheten eller enstaka visningar.
Enhet Mätenheterna när du beställer artikeln.
Status Status för att spåra objektets framsteg. Det kan vara Nytt, Kök, Matlagning, Tillagat, Serverat.
Skapat vid Den lagrar datum och tid då bokningsobjektet skapas.
Uppdaterad kl. Den lagrar datum och tid då bokningsobjektet uppdateras.
Innehåll Kolumnen som används för att lagra ytterligare information om bokningsobjektet.

Bokningsobjekttabellen med lämpliga begränsningar visas nedan.

CREATE TABLE `restaurant`.`booking_item` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`bookingId` BIGINT NOT NULL,
`itemId` BIGINT NOT NULL,
`sku` VARCHAR(100) NOT NULL,
`price` FLOAT NOT NULL DEFAULT 0,
`discount` FLOAT NOT NULL DEFAULT 0,
`quantity` FLOAT NOT NULL DEFAULT 0,
`unit` SMALLINT(6) NOT NULL DEFAULT 0,
`status` 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_booking_item_booking` (`bookingId` ASC),
CONSTRAINT `fk_booking_item_booking`
FOREIGN KEY (`bookingId`)
REFERENCES `restaurant`.`booking` (`id`)
ON DELETE RESTRICT
ON UPDATE NO ACTION);

ALTER TABLE `restaurant`.`booking_item`
ADD INDEX `idx_booking_item_item` (`itemId` ASC);
ALTER TABLE `restaurant`.`booking_item`
ADD CONSTRAINT `fk_booking_item_item`
FOREIGN KEY (`itemId`)
REFERENCES `restaurant`.`item` (`id`)
ON DELETE RESTRICT
ON UPDATE NO ACTION;

Beställningstabell och Beställningsartikeltabell

Det här avsnittet innehåller tabellerna för att hantera beställningarna. En inloggad användare kan också kopplas till beställningen. Ordertabellen kan användas för att lagra genomförda bokningar och leverantörsbeställningar. Leverantörens orderstatus kan ställas in på ny när beställningen görs och den kan ställas in så att den slutförs efter att ha tagit emot artiklarna från leverantören. Dessutom måste artikelpriset fyllas i manuellt efter mottagande av varorna från leverantören. Nedan nämns beskrivningen av alla kolumner i beställningstabellen.

Id Det unika ID:t för att identifiera beställningen.
Användar-ID Användar-ID för att identifiera gästen som är kopplad till beställningen.
Leverant-ID Leverantörs-id för att identifiera leverantören som är kopplad till beställningen.
Token Den unika token som är kopplad till beställningen för att relatera den till bokningen. Samma token kan också skickas till Payment Gateway om det behövs.
Status Beställningens status kan vara Ny, Utcheckning, Betald, Misslyckad, Levererad, Levererad, Returnerad och Komplett. Statusen Skickat, Levererat och Returnerat kan användas för leverantörsbeställningar.
Subtotal Totalpriset för beställningsartiklarna.
Artiklarabatt Den totala rabatten på beställningsartiklarna.
Skatt Skatten på beställningsartiklarna.
Frakt Fraktavgifterna för beställningsartiklarna.
Totalt Det totala priset för beställningen inklusive moms och frakt. Det exkluderar varornas rabatt.
Kampanj Kampanjkoden för beställningen.
Rabatt Den totala rabatten för beställningen baserat på kampanjkoden eller butiksrabatten.
Grundsumma Summan av beställningen som gästen ska betala till restaurangen eller restaurangen till leverantören.
Förnamn Användarens förnamn.
Mellannamn Användarens mellannamn.
Efternamn Användarens efternamn.
Mobil Användarens mobilnummer.
E-post Användarens e-postadress.
rad 1 Första raden att lagra adress.
rad 2 Den andra raden för att lagra adressen.
Stad Stad för adressen.
Provins Adressens provins.
Land Adressens land.
Skapat vid Den lagrar datum och tid då beställningen skapas.
Uppdaterad kl. Den lagrar datum och tid då beställningen uppdateras.
Innehåll Kolumnen som används för att lagra ytterligare information om beställningen.

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

CREATE TABLE `restaurant`.`order` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NULL DEFAULT NULL,
`vendorId` BIGINT NULL DEFAULT NULL,
`token` VARCHAR(100) NOT NULL,
`status` SMALLINT(6) NOT NULL DEFAULT 0,
`subTotal` FLOAT NOT NULL DEFAULT 0,
`itemDiscount` FLOAT NOT NULL DEFAULT 0,
`tax` FLOAT NOT NULL DEFAULT 0,
`shipping` FLOAT NOT NULL DEFAULT 0,
`total` FLOAT NOT NULL DEFAULT 0,
`promo` VARCHAR(50) NULL DEFAULT NULL,
`discount` FLOAT NOT NULL DEFAULT 0,
`grandTotal` FLOAT NOT NULL DEFAULT 0,
`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,
`line1` VARCHAR(50) NULL DEFAULT NULL,
`line2` VARCHAR(50) NULL DEFAULT NULL,
`city` VARCHAR(50) NULL DEFAULT NULL,
`province` VARCHAR(50) NULL DEFAULT NULL,
`country` VARCHAR(50) NULL DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_order_user` (`userId` ASC),
CONSTRAINT `fk_order_user`
FOREIGN KEY (`userId`)
REFERENCES `restaurant`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

ALTER TABLE `restaurant`.`order`
ADD INDEX `idx_order_vendor` (`vendorId` ASC);
ALTER TABLE `restaurant`.`order`
ADD CONSTRAINT `fk_order_vendor`
FOREIGN KEY (`vendorId`)
REFERENCES `restaurant`.`user` (`id`)
ON DELETE RESTRICT
ON UPDATE NO ACTION;

Nedan nämns beskrivningen av alla kolumner i beställningsartikeltabellen.

Id Det unika ID:t för att identifiera den beställda artikeln.
Artikel-ID Produkt-id för att identifiera artikeln som är kopplad till den beställda artikeln.
Beställnings-ID Beställnings-ID för att identifiera beställningen som är kopplad till den beställda artikeln.
SKU Varans SKU när du beställde den.
Pris Priset på varan när du beställde den.
Rabatt Rabatten på varan när du beställer den.
Mängd Mängden av föremålet som valts av användaren.
Enhet Mätenheterna när du beställer artikeln.
Skapat vid Den lagrar datum och tid då den beställda artikeln skapas.
Uppdaterad kl. Den lagrar datum och tid då den beställda artikeln uppdateras.
Innehåll Kolumnen som används för att lagra ytterligare information om den beställda artikeln.

Beställningsartikeltabellen med lämpliga begränsningar är som visas nedan.

CREATE TABLE `restaurant`.`order_item` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`orderId` BIGINT NOT NULL,
`itemId` BIGINT NOT NULL,
`sku` VARCHAR(100) NOT NULL,
`price` FLOAT NOT NULL DEFAULT 0,
`discount` FLOAT NOT NULL DEFAULT 0,
`quantity` FLOAT NOT NULL DEFAULT 0,
`unit` 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_order_item_order` (`orderId` ASC),
CONSTRAINT `fk_order_item_order`
FOREIGN KEY (`orderId`)
REFERENCES `restaurant`.`order` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

ALTER TABLE `restaurant`.`order_item`
ADD INDEX `idx_order_item_item` (`itemId` ASC);
ALTER TABLE `restaurant`.`order_item`
ADD CONSTRAINT `fk_order_item_item`
FOREIGN KEY (`itemId`)
REFERENCES `restaurant`.`item` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Transaktionstabell

Vi behöver också en transaktionstabell för att spåra beställningsbetalningarna som gästerna gör till restaurangen och restaurangen till leverantörerna för bokföring. Vi kan också använda samma tabell för att registrera kredit(gäster) och debet(leverantörer) transaktioner. Nedan nämns beskrivningen av alla kolumner i transaktionstabellen.

Id Det unika ID:t för att identifiera transaktionen.
Användar-ID Användar-ID för att identifiera användaren som är kopplad till transaktionen.
Leverant-ID Leverantörs-id för att identifiera leverantören som är kopplad till transaktionen.
Beställnings-ID Beställnings-ID för att identifiera beställningen som är kopplad till transaktionen.
Kod Betalnings-id som tillhandahålls av betalningsgatewayen.
Typ Typen av ordertransaktion kan vara antingen Kredit eller Debet.
Läge Läget för beställningstransaktionen kan vara offline, postförskott, check, växel, fast och online.
Status Status för ordertransaktionen kan vara Ny, Avbruten, Misslyckad, Väntande, Avvisad, Avvisad och Framgång.
Skapat vid Den lagrar datum och tid då ordertransaktionen skapas.
Uppdaterad kl. Den lagrar datum och tid då ordertransaktionen uppdateras.
Innehåll Kolumnen som används för att lagra ytterligare information om transaktionen.

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

CREATE TABLE `restaurant`.`transaction` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`vendorId` BIGINT NOT NULL,
`orderId` BIGINT NOT NULL,
`code` VARCHAR(100) NOT NULL,
`type` SMALLINT(6) NOT NULL DEFAULT 0,
`mode` SMALLINT(6) NOT NULL DEFAULT 0,
`status` 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_transaction_user` (`userId` ASC),
CONSTRAINT `fk_transaction_user`
FOREIGN KEY (`userId`)
REFERENCES `restaurant`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

ALTER TABLE `restaurant`.`transaction`
ADD INDEX `idx_transaction_vendor` (`vendorId` ASC),
ADD INDEX `idx_transaction_order` (`orderId` ASC);

ALTER TABLE `restaurant`.`transaction`
ADD CONSTRAINT `fk_transaction_vendor`
FOREIGN KEY (`vendorId`)
REFERENCES `restaurant`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
ADD CONSTRAINT `fk_transaction_order`
FOREIGN KEY (`orderId`)
REFERENCES `restaurant`.`order` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Address Table

An address table can be used to avoid the redundant columns in the Booking and Order table depending on the actual implementation. It can be directly mapped to the Booking Table and Order Table using the appropriate foreign keys.

Sammanfattning

In this tutorial, we have discussed the database design of a Restaurant Ordering System or Food Ordering System to store the users, book tables, automate kitchen, and manage product inventory. The same database schema can be used to accept online table booking and pre-orders. The database schema provided in this tutorial can be considered as the starting point and further optimized or updated based on the actual needs. The On-Premises Restaurant Ordering System Flowchart can be referred to implement the restaurant order system.

Du kan skicka in dina kommentarer för att delta i diskussionen. You may also be interested in designing the database of the Blog, Online Shopping Cart, and Poll &Survey applications. Det fullständiga databasschemat finns också tillgängligt på GitHub.


  1. Hur infogar man BLOB- och CLOB-filer i MySQL?

  2. JSON-funktioner är nu aktiverade som standard i SQLite

  3. Vänta händelse:ändra storlek på asynkron deskriptor

  4. Hämta poster där json-kolumnnyckeln är null