Deze tutorial biedt volledige stappen voor het ontwerpen van een databaseschema van het restaurantbestelsysteem om de gebruikers, tafelreserveringen, menu's, inventaris, bestellingen en betalingen te beheren. Het biedt het ontwerp van de voedselbestellingdatabase om de voedselbestellingen voor restaurants te beheren. Het kan verder worden gebruikt om lokale restaurantbestelsystemen te ontwikkelen.
Dergelijke bestelsystemen zijn geïmplementeerd om de orderverwerking te automatiseren en efficiënt om te gaan met piekbesteltijden, waardoor de klanttevredenheid met minder inspanningen wordt verbeterd - een win-winsituatie voor restaurantbedrijven.
Het entiteitsrelatiediagram of visueel databaseontwerp wordt hieronder weergegeven.
Restaurantbestelsysteem
Opmerkingen :Het kan worden gebruikt voor het online reserveren van de tafels en pre-orderen voordat ze het restaurant bereiken. De beveiliging kan ook worden afgehandeld door de RBAC-database in MySQL te volgen.
U kunt ook de populaire tutorials bezoeken, waaronder MySQL 8 installeren op Ubuntu, MySQL 8 installeren op Windows, MySQL 8 installeren met Workbench op Windows 10, RBAC Database in MySql, Blog Database in MySql, Quiz Database in MySQL, Enquête- en enquêtedatabase in MySQL, online winkelwagendatabase en leer elementaire SQL-query's in MySQL.
Restaurantdatabase
De allereerste stap is het aanmaken van de Restaurant Database. Het kan worden gemaakt met behulp van de onderstaande query.
CREATE SCHEMA `restaurant` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Ik heb de tekenset utf8mb4 . gebruikt om een breed scala aan karakters te ondersteunen.
Gebruikerstabel
In deze sectie zullen we de Gebruikerstabel . ontwerpen om gebruikersinformatie op te slaan. Dezelfde tabel kan worden gebruikt om verschillende soorten gebruikers te beheren, waaronder beheerders, chef-koks, agenten en klanten. Het kan worden gebruikt om de gebruikers te relateren aan menu's, items, tafelboekingen en bestellingen. Gebruikers kunnen hun eigen tafels en bestellingen volgen. Hieronder staat de beschrijving van alle kolommen van de gebruikerstabel.
Id | Het unieke ID om de gebruiker te identificeren. |
Voornaam | De voornaam van de gebruiker. |
Middelste naam | De middelste naam van de gebruiker. |
Achternaam | De achternaam van de gebruiker. |
Mobiel | Het mobiele nummer van de gebruiker. Het kan worden gebruikt voor aanmeldings- en registratiedoeleinden. |
Het e-mailadres van de gebruiker. Het kan worden gebruikt voor aanmeldings- en registratiedoeleinden. | |
Wachtwoordhash | De wachtwoord-hash gegenereerd door het juiste algoritme. We moeten vermijden om gewone of versleutelde wachtwoorden op te slaan. |
Beheerder | De vlag om aan te geven of de gebruiker een beheerder is. Het is niet vereist als RBAC-tabellen zijn gemaakt door het RBAC-databaseontwerp te volgen. |
Verkoper | De vlag om aan te geven of de gebruiker voorraadorders kan ontvangen. Het is niet vereist als RBAC-tabellen zijn gemaakt door het RBAC-databaseontwerp te volgen. |
Chef-kok | De vlag om aan te geven of de gebruiker de items kan koken. Het is niet vereist als RBAC-tabellen zijn gemaakt door het RBAC-databaseontwerp te volgen. |
Agent | De vlag om aan te geven of de gebruiker een tabel kan hosten. Het is niet vereist als RBAC-tabellen zijn gemaakt door het RBAC-databaseontwerp te volgen. |
Geregistreerd bij | Deze kolom kan worden gebruikt om de levensduur van de gebruiker met de applicatie te berekenen. |
Laatste aanmelding | Het kan worden gebruikt om de laatste login van de gebruiker te identificeren. |
Inleiding | De korte introductie van de verkopergebruiker die op de productpagina moet worden weergegeven. |
Profiel | De details van de leverancier die op de productpagina moeten worden weergegeven. |
De gebruikerstabel met de juiste beperkingen is zoals hieronder weergegeven.
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) );
Ingrediënten-, artikel-, recept- en menutabellen
In deze sectie zullen we de Ingrediënten-, Artikel-, Recept- en Menutabellen . ontwerpen om de menu's en itemgegevens op te slaan.
Hieronder staat de beschrijving van alle kolommen van de Ingrediëntentabel . De ingrediëntentabel wordt ook in kaart gebracht om de leverancier te identificeren die het ingrediënt kan leveren om de inventaris aan te vullen. In een meer geavanceerd scenario kan er een aparte tabel zijn om de relatie tussen ingrediënt en leverancier op te slaan om meerdere leveranciers voor hetzelfde ingrediënt te ondersteunen.
Id | De unieke id om het ingrediënt te identificeren. |
Gebruikers-ID | Het gebruikers-ID om de beheerder te identificeren. |
Verkoper-ID | De leverancier-ID om de leverancier te identificeren. |
Titel | De titel van het ingrediënt die moet worden weergegeven op het artikelrecept. |
Naaktslak | De unieke slug die moet worden gebruikt als GID van het ingrediënt. |
Samenvatting | De samenvatting om de belangrijkste hoogtepunten te noemen. |
Type | Het type om onderscheid te maken tussen de verschillende soorten ingrediënten. |
SKU | De Stock Keeping Unit om de ingrediëntenvoorraad bij te houden. |
Hoeveelheid | De beschikbare hoeveelheid van het ingrediënt. |
Eenheid | De maateenheden die aan het ingrediënt zijn toegewezen. |
Gemaakt op | Het slaat de datum en tijd op waarop het ingrediënt is gemaakt. |
Bijgewerkt om | Het slaat de datum en tijd op waarop het ingrediënt is bijgewerkt. |
Inhoud | De kolom die wordt gebruikt om de aanvullende details van het ingrediënt op te slaan. |
Het gebruikt de kolommen hoeveelheid en eenheid om de beschikbare voorraad in de ingrediënteninventaris bij te houden. De ingrediëntentabel met de juiste beperkingen is zoals hieronder weergegeven.
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;
Hieronder staat de beschrijving van alle kolommen van de Itemtabel . De artikeltabel wordt ook in kaart gebracht om de leverancier te identificeren die het niet-kookartikel kan leveren om de inventaris opnieuw te vullen. In een meer geavanceerd scenario kan er een aparte tabel zijn om de relatie tussen artikel en leverancier op te slaan om meerdere leveranciers voor hetzelfde artikel te ondersteunen.
Opmerkingen :We kunnen dezelfde tabel ook gebruiken om de ingrediënten en artikelen op te slaan om de bestellingen van restaurants en leveranciers te vereenvoudigen. In een dergelijk geval is een self-join vereist om de ingrediënten van het item te identificeren. De kolommen koken en prijs zijn ook niet handig voor rijen met ingrediënten.
Id | De unieke id om het item te identificeren. |
Gebruikers-ID | Het gebruikers-ID om de beheerder te identificeren. |
Verkoper-ID | De leverancier-ID om de leverancier te identificeren. |
Titel | De titel van het item die in het menu moet worden weergegeven. |
Naaktslak | De unieke slug die moet worden gebruikt als GID van het item. |
Samenvatting | De samenvatting om de belangrijkste hoogtepunten te noemen. |
Type | Het type om onderscheid te maken tussen de verschillende itemtypes. |
Koken | De vlag om aan te geven of koken vereist is voor het item. |
SKU | De Stock Keeping Unit om de artikelvoorraad te volgen. Het is alleen vereist als het item niet is gekoppeld aan ingrediënten. |
Prijs | De verkoopprijs van een eenheid of een enkele portie. |
Hoeveelheid | De beschikbare hoeveelheid van het artikel. Het is alleen vereist als het item niet is gekoppeld aan ingrediënten. |
Eenheid | De maateenheden die aan het item zijn toegewezen. Het is alleen vereist als het item niet is gekoppeld aan ingrediënten. |
Recept | De instructies die nodig zijn om het item te koken. |
Instructies | De instructies die nodig zijn om het item te serveren. |
Gemaakt op | Het slaat de datum en tijd op waarop het item is gemaakt. |
Bijgewerkt om | Het slaat de datum en tijd op waarop het item is bijgewerkt. |
Inhoud | De kolom die wordt gebruikt om de aanvullende details van het item op te slaan. |
Net als bij de ingrediëntentabel, gebruikt het de kolommen hoeveelheid en eenheid om de beschikbare voorraad in de artikelinventaris bij te houden. De itemtabel met de juiste beperkingen is zoals hieronder weergegeven.
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;
De Receptentabel kan worden gebruikt om de hoeveelheid ingrediënten bij te houden die nodig zijn voor een item voor een enkele portie. Hieronder staat de beschrijving van alle kolommen van de Receptentabel.
Id | De unieke id om het recept te identificeren. |
Artikel-ID | De item-ID om het item te identificeren. |
Ingrediënten-ID | De ingrediënt-ID om het ingrediënt te identificeren. |
Hoeveelheid | De hoeveelheid van het ingrediënt die nodig is om het item voor een enkele portie te koken. |
Eenheid | De maateenheden om de benodigde hoeveelheid ingrediënten voor het artikel te identificeren. |
Instructies | De ingrediënteninstructies die nodig zijn om het item te koken. |
De Receptentabel met de juiste beperkingen is zoals hieronder weergegeven.
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;
Hieronder staat de beschrijving van alle kolommen van de Menutabel . De menutabel kan worden gebruikt om meerdere menu's van hetzelfde restaurant op te slaan.
Id | De unieke id om het menu te identificeren. |
Gebruikers-ID | Het gebruikers-ID om de beheerder te identificeren. |
Titel | De menutitel die op de menukaart moet worden weergegeven. |
Naaktslak | De unieke slug die als GID van het menu moet worden gebruikt. |
Samenvatting | De samenvatting om de belangrijkste hoogtepunten van de menukaart te vermelden. |
Type | Het type om onderscheid te maken tussen de verschillende menutypes. |
Gemaakt op | Het slaat de datum en tijd op waarop het item is gemaakt. |
Bijgewerkt om | Het slaat de datum en tijd op waarop het item is bijgewerkt. |
Inhoud | De kolom die wordt gebruikt om de aanvullende details van het menu op te slaan. |
De menutabel met de juiste beperkingen is zoals hieronder weergegeven.
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);
De Menu-itemtabel kan worden gebruikt om de items op de menukaart te volgen. Hieronder staat de beschrijving van alle kolommen van de menu-itemtabel.
Id | De unieke id om het menu-item te identificeren. |
Menu-ID | De menu-ID om het menu te identificeren. |
Artikel-ID | De item-ID om het item te identificeren. |
Actief | De vlag om te controleren of het item beschikbaar is. |
De menu-itemtabel met de juiste beperkingen is zoals hieronder weergegeven.
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;
De Item Chef-tafel kan worden gebruikt om de chef-kok te identificeren die is toegewezen om het item te koken. Hieronder staat de beschrijving van alle kolommen van de Item Chef Table.
Id | De unieke id om het menu-item te identificeren. |
Artikel-ID | De item-ID om het item te identificeren. |
Chef-ID | De chef-ID om de gebruiker te identificeren. |
Actief | De vlag om te controleren of de chef-kok beschikbaar is om het item te koken. |
De Item Chef Table met de juiste beperkingen is zoals hieronder weergegeven.
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;
TableTop- en boekingstabellen
In deze sectie zullen we de TableTop- en boekingstabellen . ontwerpen om de restauranttafels en hun boekingsgegevens op te slaan.
De TableTop Table kan worden gebruikt om de details van de tafels in het restaurant op te slaan. De status van de tabel kan Vrij, Gereserveerd en Actief zijn. Ik heb TableTop gebruikt in plaats van Table om het te onderscheiden van het tabelsleutelwoord van MySQL. Hieronder staat de beschrijving van alle kolommen van de TableTop Table.
Id | Het unieke ID om de tafel te identificeren. |
Code | De tabelcode. |
Status | De beoordelingsbeoordeling. |
Capaciteit | De totale capaciteit van de tafel. |
Gemaakt op | Het slaat de datum en tijd op waarop de tabel is gemaakt. |
Bijgewerkt om | Het slaat de datum en tijd op waarop de tabel is bijgewerkt. |
Inhoud | De kolom die wordt gebruikt om de aanvullende details van de tabel op te slaan. |
De TableTop-tabel met de juiste beperkingen is zoals hieronder weergegeven.
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`));
Reserveringstafel kan worden gebruikt om de restauranttafels online of ter plaatse te reserveren. Een ingelogde of bestaande gebruiker kan ook aan Booking worden gekoppeld. Het gaat er ook van uit dat alleen de tafels met de status Vrij kunnen worden gereserveerd. De tafelstatus kan worden gewijzigd in Gereserveerd nadat de boeking is bevestigd. Ook kan de tafelstatus op Actief worden gezet zodra de gasten deze bezetten. Hieronder vindt u de beschrijving van alle kolommen van de boekingstabel.
Opmerkingen :De Reserveringstafel dekt niet de betalingen die gepaard gaan met het reserveren van de tafel. Het kan verder worden bijgewerkt door extra kolommen toe te voegen om de betalingen af te handelen die betrokken zijn bij het boeken van de tafel.
Id | Het unieke ID om de boeking te identificeren. |
Tabel-ID | De tafel-ID om de tafel te identificeren die aan de boeking is gekoppeld. |
Gebruikers-ID | De gebruikers-ID om de geregistreerde gebruiker te identificeren die aan de boeking is gekoppeld. |
Token | Het unieke token dat aan de boeking is gekoppeld. |
Status | De status van de boeking kan Nieuw, Lounge, Actief en Voltooid zijn. |
Voornaam | De voornaam van de gast. |
Middelste naam | De middelste naam van de gast. |
Achternaam | De achternaam van de gebruiker. |
Mobiel | Het mobiele nummer van de gebruiker. |
Het e-mailadres van de gebruiker. | |
Lijn 1 | De eerste regel om het adres op te slaan. |
Lijn 2 | De tweede regel om het adres op te slaan. |
Stad | De plaats van het adres. |
Provincie | De provincie van het adres. |
Land | Het land van het adres. |
Gemaakt op | Het slaat de datum en tijd op waarop de boeking is gemaakt. |
Bijgewerkt om | Het slaat de datum en tijd op waarop de boeking is bijgewerkt. |
Inhoud | De kolom die wordt gebruikt om de aanvullende details van de boeking op te slaan. |
De boekingstabel met de juiste beperkingen is zoals hieronder weergegeven.
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;
De Reserveringsitemtabel is vereist om de door de gast bestelde artikelen te volgen. Hieronder vindt u de beschrijving van alle kolommen van de boekingsitemtabel.
Id | De unieke id om het boekingsitem te identificeren. |
Boekings-ID | De boekings-ID om de boeking te identificeren die aan het boekingsitem is gekoppeld. |
Artikel-ID | De item-ID om het item te identificeren dat aan het boekingsitem is gekoppeld. |
SKU | De SKU van het artikel tijdens het bestellen. |
Prijs | De verkoopprijs van het artikel tijdens het bestellen. |
Korting | De korting van het artikel tijdens het bestellen. |
Hoeveelheid | De hoeveelheid van het artikel dat door de gebruiker is besteld. Het kan ofwel de vermenigvuldiger van de itemeenheid zijn of een enkele portie. |
Eenheid | De maateenheden tijdens het bestellen van het artikel. |
Status | De status om de voortgang van het item te volgen. Het kan Nieuw, Keuken, Koken, Gekookt, Geserveerd zijn. |
Gemaakt op | Het slaat de datum en tijd op waarop het boekingsitem is gemaakt. |
Bijgewerkt om | Het slaat de datum en tijd op waarop het boekingsitem is bijgewerkt. |
Inhoud | De kolom die wordt gebruikt om de aanvullende details van het boekingsitem op te slaan. |
De tabel met boekingsitems met de juiste beperkingen is zoals hieronder weergegeven.
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;
Besteltabel en bestelitemtabel
Deze sectie bevat de tabellen om de bestellingen te beheren. Een ingelogde gebruiker kan ook aan de bestelling worden gekoppeld. De besteltabel kan worden gebruikt om de voltooide boekingen en leveranciersorders op te slaan. De status van de leveranciersorders kan worden ingesteld op nieuw tijdens het plaatsen van de bestelling en kan worden ingesteld om te worden voltooid nadat de artikelen van de leverancier zijn ontvangen. Ook moet de artikelprijs handmatig worden ingevuld nadat de artikelen van de leverancier zijn ontvangen. Hieronder staat de beschrijving van alle kolommen van de Besteltabel.
Id | Het unieke ID om de bestelling te identificeren. |
Gebruikers-ID | Het gebruikers-ID om de gast te identificeren die aan de bestelling is gekoppeld. |
Verkoper-ID | De leverancier-ID om de leverancier te identificeren die aan de bestelling is gekoppeld. |
Token | Het unieke token dat is gekoppeld aan de bestelling om deze te relateren aan de boeking. Hetzelfde token kan indien nodig ook worden doorgegeven aan de Payment Gateway. |
Status | De status van de bestelling kan Nieuw, Afrekenen, Betaald, Mislukt, Verzonden, Bezorgd, Geretourneerd en Voltooid zijn. De status Verzonden, Geleverd en Geretourneerd kan worden gebruikt voor de leveranciersorders. |
Subtotaal | De totale prijs van de Bestelitems. |
Artikelkorting | De totale korting van de Bestelitems. |
Belasting | De belasting op de bestelitems. |
Verzending | De verzendkosten van de Bestelitems. |
Totaal | De totale prijs van de Bestelling inclusief btw en verzendkosten. Het is exclusief de artikelenkorting. |
Promo | De promotiecode van de Bestelling. |
Korting | De totale korting van de Bestelling op basis van de promotiecode of winkelkorting. |
Totaal totaal | Het totaalbedrag van de bestelling die door de gast aan het restaurant of het restaurant aan de verkoper moet worden betaald. |
Voornaam | De voornaam van de gebruiker. |
Middelste naam | De middelste naam van de gebruiker. |
Achternaam | De achternaam van de gebruiker. |
Mobiel | Het mobiele nummer van de gebruiker. |
Het e-mailadres van de gebruiker. | |
Lijn 1 | De eerste regel om het adres op te slaan. |
Lijn 2 | De tweede regel om het adres op te slaan. |
Stad | De plaats van het adres. |
Provincie | De provincie van het adres. |
Land | Het land van het adres. |
Gemaakt op | Het slaat de datum en tijd op waarop de bestelling is gemaakt. |
Bijgewerkt om | Het slaat de datum en tijd op waarop de bestelling is bijgewerkt. |
Inhoud | De kolom die wordt gebruikt om de aanvullende details van de bestelling op te slaan. |
De besteltabel met de juiste beperkingen is zoals hieronder weergegeven.
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;
Hieronder vindt u de beschrijving van alle kolommen van de Order Item Table.
Id | De unieke id om het bestelde artikel te identificeren. |
Artikel-ID | De product-ID om het artikel te identificeren dat aan het bestelde artikel is gekoppeld. |
Bestel-ID | De bestellings-ID om de bestelling te identificeren die aan het bestelde artikel is gekoppeld. |
SKU | De SKU van het artikel tijdens het bestellen. |
Prijs | De prijs van het artikel tijdens het bestellen. |
Korting | De korting van het artikel tijdens het bestellen. |
Hoeveelheid | De hoeveelheid van het item dat door de gebruiker is geselecteerd. |
Eenheid | De maateenheden tijdens het bestellen van het artikel. |
Gemaakt op | Het slaat de datum en tijd op waarop het bestelde artikel is aangemaakt. |
Bijgewerkt om | Het slaat de datum en tijd op waarop het bestelde artikel is bijgewerkt. |
Inhoud | De kolom die wordt gebruikt om de aanvullende details van het bestelde artikel op te slaan. |
De tabel met bestelitems met de juiste beperkingen is zoals hieronder weergegeven.
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;
Transactietabel
We hebben ook een transactietabel nodig om de bestellingsbetalingen van de gasten aan het restaurant en het restaurant aan de verkopers te volgen voor de boekhouding. We kunnen dezelfde tabel ook gebruiken om de credit-(gasten)- en debet-(verkopers) transacties vast te leggen. Hieronder staat de beschrijving van alle kolommen van de Transactietabel.
Id | Het unieke ID om de transactie te identificeren. |
Gebruikers-ID | Het gebruikers-ID om de gebruiker te identificeren die aan de transactie is gekoppeld. |
Verkoper-ID | De leverancier-ID om de leverancier te identificeren die aan de transactie is gekoppeld. |
Bestel-ID | De bestellings-ID om de bestelling te identificeren die aan de transactie is gekoppeld. |
Code | De betalings-ID verstrekt door de betalingsgateway. |
Type | Het type ordertransactie kan Credit of Debet zijn. |
Modus | De modus van de ordertransactie kan Offline, Rembours, Cheque, Concept, Vast en Online zijn. |
Status | De status van de ordertransactie kan Nieuw, Geannuleerd, Mislukt, In behandeling, Afgewezen, Afgewezen en Geslaagd zijn. |
Gemaakt op | Het slaat de datum en tijd op waarop de ordertransactie is aangemaakt. |
Bijgewerkt om | Het slaat de datum en tijd op waarop de ordertransactie is bijgewerkt. |
Inhoud | De kolom die wordt gebruikt om de aanvullende details van de transactie op te slaan. |
De transactietabel met de juiste beperkingen is zoals hieronder weergegeven.
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.
Samenvatting
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.
U kunt uw opmerkingen indienen om deel te nemen aan de discussie. You may also be interested in designing the database of the Blog, Online Shopping Cart, and Poll &Survey applications. Het volledige databaseschema is ook beschikbaar op GitHub.