Tento výukový program poskytuje kompletní kroky k návrhu schématu databáze objednávkového systému restaurace pro správu uživatelů, rezervací stolů, menu, inventáře, objednávek a plateb. Poskytuje návrh databáze objednávek jídel pro správu objednávek jídel pro restaurace. Lze jej dále použít k vývoji aplikací systému objednávek místních restaurací.
Tyto objednávkové systémy jsou implementovány tak, aby zautomatizovaly zpracování objednávek a efektivně se vypořádaly s dobou objednání ve špičce, čímž se zlepší spokojenost zákazníků s menším úsilím – situace, která je pro restaurace oboustranně výhodná.
Diagram vztahů entit nebo návrh vizuální databáze je uveden níže.
Objednávkový systém restaurace
Poznámky :Lze jej použít pro online rezervaci stolů a předobjednávku před příjezdem do restaurace. Zabezpečení lze také vyřešit sledováním databáze RBAC v MySQL.
Můžete také navštívit oblíbené výukové programy včetně Jak nainstalovat MySQL 8 na Ubuntu, Jak nainstalovat MySQL 8 na Windows, Jak nainstalovat MySQL 8 pomocí Workbench na Windows 10, Databáze RBAC v MySql, Databáze blogů v MySql, Databáze kvízů v MySQL, Databáze průzkumů a průzkumů v MySQL, databáze nákupních košíků online a naučte se základní SQL dotazy v MySQL.
Databáze restaurací
Úplně prvním krokem je vytvoření databáze restaurací. Lze jej vytvořit pomocí dotazu, jak je uvedeno níže.
CREATE SCHEMA `restaurant` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Použil jsem znakovou sadu utf8mb4 pro podporu široké škály znaků.
Tabulka uživatelů
V této části navrhneme Tabulku uživatelů k ukládání uživatelských informací. Stejnou tabulku lze použít ke správě různých typů uživatelů včetně správců, kuchařů, agentů a zákazníků. Lze jej použít ke spojení uživatelů s nabídkami, položkami, rezervacemi stolů a objednávkami. Uživatelé mohou sledovat své vlastní tabulky a objednávky. Níže je uveden popis všech sloupců tabulky uživatelů.
ID | Jedinečné ID k identifikaci uživatele. |
Křestní jméno | Křestní jméno uživatele. |
Prostřední jméno | Prostřední jméno uživatele. |
Příjmení | Příjmení uživatele. |
Mobil | Číslo mobilního telefonu uživatele. Lze jej použít pro účely přihlášení a registrace. |
E-mailová adresa uživatele. Lze jej použít pro účely přihlášení a registrace. | |
Hašování hesla | Hash hash hesla vygenerovaný příslušným algoritmem. Musíme se vyhnout ukládání jednoduchých nebo šifrovaných hesel. |
Správce | Příznak určující, zda je uživatel správcem. Není to vyžadováno, pokud jsou tabulky RBAC vytvořeny podle návrhu databáze RBAC. |
Dodavatel | Příznak identifikující, zda uživatel může přijímat objednávky zásob. Není to vyžadováno, pokud jsou tabulky RBAC vytvořeny podle návrhu databáze RBAC. |
Šéfkuchař | Příznak určující, zda uživatel může položky vařit. Není to vyžadováno, pokud jsou tabulky RBAC vytvořeny podle návrhu databáze RBAC. |
Agent | Příznak určující, zda uživatel může hostit tabulku. Není to vyžadováno, pokud jsou tabulky RBAC vytvořeny podle návrhu databáze RBAC. |
Registrováno na | Tento sloupec lze použít k výpočtu životnosti uživatele s aplikací. |
Poslední přihlášení | Lze jej použít k identifikaci posledního přihlášení uživatele. |
Úvod | Krátké představení uživatele dodavatele, které se zobrazí na stránce produktu. |
Profil | Podrobnosti o dodavateli, které se mají zobrazit na stránce produktu. |
Tabulka uživatelů s příslušnými omezeními je uvedena níže.
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) );
Tabulky přísad, položek, receptů a menu
V této části navrhneme Tabulky přísad, položek, receptů a menu pro uložení dat nabídek a položek.
Níže je uveden popis všech sloupců Tabulky přísad . Tabulka ingrediencí je také zmapována k identifikaci dodavatele, který může dodat ingredience k opětovnému naplnění zásob. V pokročilejším scénáři může existovat samostatná tabulka pro uložení přísady a vztahu s dodavatelem pro podporu více dodavatelů pro stejnou přísadu.
ID | Jedinečné ID k identifikaci přísady. |
ID uživatele | ID uživatele k identifikaci správce. |
ID dodavatele | ID dodavatele k identifikaci dodavatele. |
Název | Název ingredience, který se zobrazí v receptuře položky. |
Slimák | Jedinečný slimák, který se má použít jako GID složky. |
Shrnutí | Souhrn, ve kterém jsou zmíněny hlavní body. |
Typ | Typ pro rozlišení mezi různými typy přísad. |
SKU | Skladová jednotka pro sledování inventáře přísad. |
Množství | Dostupné množství přísady. |
Jednotka | Měrné jednotky přiřazené přísadě. |
Vytvořeno v | Ukládá datum a čas, kdy je ingredience vytvořena. |
Aktualizováno dne | Ukládá datum a čas, kdy je přísada aktualizována. |
Obsah | Sloupec používaný k uložení dalších podrobností o složce. |
Používá množství a jednotku sloupců ke sledování zásob dostupných v inventáři přísad. Tabulka přísad s příslušnými omezeními je uvedena níže.
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;
Níže je uveden popis všech sloupců Tabulky položek . Tabulka položek je také namapována k identifikaci dodavatele, který může dodat nevařenou položku, aby znovu naplnil zásoby. V pokročilejším scénáři může existovat samostatná tabulka pro uložení položky a vztahu s dodavatelem pro podporu více dodavatelů pro stejnou položku.
Poznámky :Stejný stůl můžeme také použít k uložení ingrediencí a položek, abychom zjednodušili restaurace a objednávky dodavatelů. V takovém případě je k identifikaci složek položky vyžadováno vlastní spojení. Také sloupce vaření a cena nejsou užitečné pro řádky přísad.
ID | Jedinečné ID k identifikaci položky. |
ID uživatele | ID uživatele k identifikaci správce. |
ID dodavatele | ID dodavatele k identifikaci dodavatele. |
Název | Název položky, který se zobrazí v nabídce. |
Slimák | Unikátní slug, který má být použit jako GID položky. |
Shrnutí | Souhrn, ve kterém jsou zmíněny hlavní body. |
Typ | Typ pro rozlišení mezi různými typy položek. |
Vaření | Příznak určující, zda je u položky vyžadováno vaření. |
SKU | Skladová jednotka pro sledování inventáře položek. Je vyžadováno pouze v případě, že položka není spojena s přísadami. |
Cena | Prodejní cena jedné jednotky nebo jedné porce. |
Množství | Dostupné množství položky. Je vyžadováno pouze v případě, že položka není spojena s přísadami. |
Jednotka | Měrné jednotky přiřazené k položce. Je vyžadováno pouze v případě, že položka není spojena s přísadami. |
Recept | Pokyny potřebné k vaření položky. |
Pokyny | Pokyny potřebné k doručení položky. |
Vytvořeno v | Ukládá datum a čas, kdy byla položka vytvořena. |
Aktualizováno dne | Ukládá datum a čas, kdy je položka aktualizována. |
Obsah | Sloupec používaný k uložení dalších podrobností o položce. |
Podobně jako tabulka přísad používá sloupce množství a jednotka ke sledování zásob dostupných v inventáři položek. Tabulka položek s příslušnými omezeními je uvedena níže.
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;
Tabulka receptů lze použít ke sledování množství ingrediencí požadovaných pro položku pro jednu porci. Níže je uveden popis všech sloupců tabulky receptů.
ID | Jedinečné ID pro identifikaci receptury. |
ID položky | ID položky k identifikaci položky. |
ID přísady | ID přísady k identifikaci přísady. |
Množství | Množství přísady potřebné k uvaření položky pro jednu porci. |
Jednotka | Měrné jednotky k identifikaci množství přísady požadované pro danou položku. |
Pokyny | Pokyny pro ingredience potřebné k vaření položky. |
Tabulka receptů s příslušnými omezeními je uvedena níže.
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;
Níže je uveden popis všech sloupců Tabulky nabídky . Tabulku menu lze použít k uložení více menu stejné restaurace.
ID | Jedinečné ID pro identifikaci nabídky. |
ID uživatele | ID uživatele k identifikaci správce. |
Název | Název menu, který se zobrazí na kartě menu. |
Slimák | Unikátní slug, který se má použít jako GID nabídky. |
Shrnutí | Souhrn, ve kterém jsou zmíněny hlavní přednosti karty menu. |
Typ | Typ pro rozlišení mezi různými typy nabídek. |
Vytvořeno v | Ukládá datum a čas, kdy byla položka vytvořena. |
Aktualizováno dne | Ukládá datum a čas, kdy je položka aktualizována. |
Obsah | Sloupec používaný k uložení dalších podrobností nabídky. |
Tabulka nabídky s příslušnými omezeními je uvedena níže.
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);
Tabulka položek nabídky lze použít ke sledování položek dostupných na kartě menu. Níže je uveden popis všech sloupců tabulky položek nabídky.
ID | Jedinečné ID k identifikaci položky nabídky. |
ID nabídky | ID nabídky k identifikaci nabídky. |
ID položky | ID položky k identifikaci položky. |
Aktivní | Příznak pro kontrolu, zda je položka dostupná. |
Tabulka položek nabídky s příslušnými omezeními je uvedena níže.
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;
Tabulka šéfkuchaře položek lze použít k identifikaci šéfkuchaře přiřazeného k vaření položky. Níže je uveden popis všech sloupců tabulky Item Chef Table.
ID | Jedinečné ID k identifikaci položky nabídky. |
ID položky | ID položky k identifikaci položky. |
ID šéfkuchaře | ID šéfkuchaře k identifikaci uživatele. |
Aktivní | Příznak pro kontrolu, zda je kuchař k dispozici pro vaření položky. |
Tabulka Item Chef Table s příslušnými omezeními je uvedena níže.
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;
Tabulky stolu a rezervace
V této sekci navrhneme TableTop a Rezervační stoly k uložení stolů v restauraci a podrobností o jejich rezervaci.
Tabulka TableTop lze použít k uložení detailů stolů v restauraci. Stav tabulky může být Volný, Rezervovaný a Aktivní. Použil jsem TableTop místo Table, abych to odlišil od klíčového slova table MySQL. Níže je uveden popis všech sloupců tabulky TableTop.
ID | Jedinečné ID k identifikaci tabulky. |
Kód | Kód tabulky. |
Stav | Hodnocení recenze. |
Kapacita | Celková kapacita stolu. |
Vytvořeno v | Ukládá datum a čas, kdy je tabulka vytvořena. |
Aktualizováno dne | Ukládá datum a čas, kdy je tabulka aktualizována. |
Obsah | Sloupec používaný k uložení dalších podrobností tabulky. |
Tabulka TableTop s příslušnými omezeními je znázorněna níže.
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`));
Rezervační stůl lze použít k rezervaci stolů v restauraci buď online, nebo on-premise. K Bookingu může být přidružen i přihlášený nebo stávající uživatel. Rovněž předpokládá, že pouze stoly se stavem Volné mohou být rezervovány. Stav stolu lze po potvrzení rezervace změnit na Rezervováno. Stav stolu lze také nastavit na Aktivní, jakmile jej hosté obsadí. Níže je uveden popis všech sloupců Rezervační tabulky.
Poznámky :Rezervační tabulka nezahrnuje platby spojené s rezervací stolu. Lze jej dále aktualizovat přidáním dalších sloupců pro zpracování plateb spojených s rezervací stolu.
ID | Jedinečné ID k identifikaci rezervace. |
ID tabulky | ID tabulky k identifikaci stolu přidruženého k rezervaci. |
ID uživatele | ID uživatele k identifikaci registrovaného uživatele spojeného s rezervací. |
Token | Jedinečný token spojený s rezervací. |
Stav | Stav rezervace může být Nová, Salonek, Aktivní a Dokončeno. |
Křestní jméno | Křestní jméno hosta. |
Prostřední jméno | Druhé jméno hosta. |
Příjmení | Příjmení uživatele. |
Mobil | Číslo mobilního telefonu uživatele. |
E-mail uživatele. | |
Řádek 1 | První řádek pro uložení adresy. |
Řádek 2 | Druhý řádek pro uložení adresy. |
Město | Město adresy. |
Provincie | Provincie adresy. |
Země | Země adresy. |
Vytvořeno v | Ukládá datum a čas vytvoření rezervace. |
Aktualizováno dne | Ukládá datum a čas, kdy je rezervace aktualizována. |
Obsah | Sloupec používaný k uložení dalších podrobností o rezervaci. |
Tabulka rezervace s příslušnými omezeními je uvedena níže.
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;
Tabulka položek rezervace je povinen sledovat položky objednané hostem. Níže je uveden popis všech sloupců v tabulce položek rezervace.
ID | Jedinečné ID k identifikaci položky rezervace. |
ID rezervace | ID rezervace k identifikaci rezervace spojené s položkou rezervace. |
ID položky | ID položky k identifikaci položky spojené s položkou rezervace. |
SKU | SKU položky při objednávání. |
Cena | Prodejní cena položky při objednání. |
Sleva | Sleva na položku při objednání. |
Množství | Množství položky objednané uživatelem. Může to být buď násobitel jednotky položky, nebo jedno zobrazení. |
Jednotka | Měrné jednotky při objednávání položky. |
Stav | Stav pro sledování postupu položky. Může to být Nové, Kuchyně, Vaření, Vařené, Obsluhované. |
Vytvořeno v | Ukládá datum a čas vytvoření položky rezervace. |
Aktualizováno dne | Ukládá datum a čas, kdy je položka rezervace aktualizována. |
Obsah | Sloupec používaný k uložení dalších podrobností o položce rezervace. |
Tabulka položek rezervace s příslušnými omezeními je uvedena níže.
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;
Tabulka objednávek a tabulka položek objednávky
Tato sekce obsahuje tabulky pro správu objednávek. K objednávce může být přidružen i přihlášený uživatel. Tabulku objednávek lze použít k uložení dokončených rezervací a objednávek dodavatelů. Stav objednávky dodavatele lze nastavit na nový při zadávání objednávky a lze jej nastavit na dokončení po obdržení položek od dodavatele. Také cena položky musí být vyplněna ručně po obdržení položek od dodavatele. Níže je uveden popis všech sloupců tabulky objednávek.
ID | Jedinečné ID k identifikaci objednávky. |
ID uživatele | ID uživatele k identifikaci hosta spojeného s objednávkou. |
ID dodavatele | ID dodavatele k identifikaci dodavatele spojeného s objednávkou. |
Token | Jedinečný token spojený s objednávkou, který ji spojí s rezervací. Stejný token lze v případě potřeby předat také platební bráně. |
Stav | Stav objednávky může být Nová, Pokladna, Zaplaceno, Nezdařilo se, Odesláno, Doručeno, Vráceno a Dokončeno. Stav Odesláno, Doručeno a Vráceno lze použít pro objednávky dodavatele. |
Dílčí součet | Celková cena položek objednávky. |
Sleva na položku | Celková sleva položek objednávky. |
Daně | Daň z položek objednávky. |
Doprava | Poplatky za dopravu položek objednávky. |
Celkem | Celková cena objednávky včetně daně a dopravy. Nezahrnuje slevu na položky. |
Propagace | Propagační kód objednávky. |
Sleva | Celková sleva z Objednávky na základě propagačního kódu nebo slevy obchodu. |
Celkový součet | Celkový součet objednávky, kterou má zaplatit host restauraci nebo restaurace prodejci. |
Křestní jméno | Křestní jméno uživatele. |
Prostřední jméno | Prostřední jméno uživatele. |
Příjmení | Příjmení uživatele. |
Mobil | Číslo mobilního telefonu uživatele. |
E-mail uživatele. | |
Řádek 1 | První řádek pro uložení adresy. |
Řádek 2 | Druhý řádek pro uložení adresy. |
Město | Město adresy. |
Provincie | Provincie adresy. |
Země | Země adresy. |
Vytvořeno v | Ukládá datum a čas, kdy byla objednávka vytvořena. |
Aktualizováno dne | Ukládá datum a čas, kdy je objednávka aktualizována. |
Obsah | Sloupec používaný k uložení dalších podrobností objednávky. |
Tabulka objednávek s příslušnými omezeními je uvedena níže.
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;
Níže je uveden popis všech sloupců tabulky položek objednávky.
ID | Jedinečné ID k identifikaci objednané položky. |
ID položky | ID produktu k identifikaci položky spojené s objednanou položkou. |
ID objednávky | ID objednávky k identifikaci objednávky spojené s objednanou položkou. |
SKU | SKU položky při objednávání. |
Cena | Cena položky při objednávání. |
Sleva | Sleva na položku při objednání. |
Množství | Množství položky vybrané uživatelem. |
Jednotka | Měrné jednotky při objednávání položky. |
Vytvořeno v | Ukládá datum a čas, kdy je objednaná položka vytvořena. |
Aktualizováno dne | Ukládá datum a čas, kdy je objednaná položka aktualizována. |
Obsah | Sloupec používaný k uložení dalších podrobností o objednané položce. |
Tabulka položek objednávky s příslušnými omezeními je uvedena níže.
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;
Tabulka transakcí
Potřebujeme také tabulku transakcí, abychom mohli sledovat platby objednávek provedené hosty do restaurace a restaurace prodejcům za účelem vedení účetnictví. Stejnou tabulku můžeme také použít k zaznamenání kreditních (hostů) a debetních (dodavatelských) transakcí. Níže je uveden popis všech sloupců tabulky transakcí.
ID | Jedinečné ID k identifikaci transakce. |
ID uživatele | ID uživatele k identifikaci uživatele spojeného s transakcí. |
ID dodavatele | ID dodavatele k identifikaci dodavatele spojeného s transakcí. |
ID objednávky | ID objednávky k identifikaci objednávky spojené s transakcí. |
Kód | ID platby poskytnuté platební bránou. |
Typ | Typ transakce objednávky může být Kreditní nebo Debetní. |
Režim | Režim transakce objednávky může být offline, na dobírku, šek, směnka, kabelové připojení a online. |
Stav | Stav transakce objednávky může být Nová, Zrušená, Neúspěšná, Nevyřízená, Odmítnutá, Odmítnutá a Úspěšná. |
Vytvořeno v | Ukládá datum a čas, kdy je transakce objednávky vytvořena. |
Aktualizováno dne | Ukládá datum a čas, kdy je transakce objednávky aktualizována. |
Obsah | Sloupec používaný k uložení dalších podrobností o transakci. |
Tabulka transakcí s příslušnými omezeními je uvedena níže.
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;
Tabulka adres
Aby se předešlo nadbytečným sloupcům v tabulce Rezervace a Objednávka v závislosti na skutečné implementaci, lze použít tabulku adres. Lze jej přímo namapovat na tabulku rezervací a tabulku objednávek pomocí příslušných cizích klíčů.
Shrnutí
V tomto tutoriálu jsme diskutovali o návrhu databáze objednávkového systému restaurací nebo systému objednávání jídel pro ukládání uživatelů, rezervování stolů, automatizaci kuchyně a správu inventáře produktů. Stejné schéma databáze lze použít k přijímání online rezervace stolu a předobjednávky. Databázové schéma uvedené v tomto tutoriálu lze považovat za výchozí bod a dále jej optimalizovat nebo aktualizovat na základě skutečných potřeb. Pro implementaci objednávkového systému v restauraci lze použít vývojový diagram on-Premises Restaurant Ordering System.
Do diskuse můžete zasílat své komentáře. Může vás také zajímat návrh databáze aplikací Blog, Online nákupní košík a Ankety a průzkumy. Kompletní schéma databáze je k dispozici také na GitHubu.