sql >> Databáze >  >> RDS >> Mysql

Průvodce návrhem databáze pro systém objednávek restaurací v MySQL

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-mail 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 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 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.


  1. Omezení propojeného serveru na jediné místní přihlášení (příklad T-SQL)

  2. Potřebujete pomoc s výpočtem pomocí dvou sad dat pomocí Expression SSRS

  3. Instalace Oracle Instant Client

  4. Use string obsahuje funkci v dotazu Oracle SQL