Ten samouczek zawiera kompletne kroki, aby zaprojektować schemat bazy danych systemu zamawiania restauracji w celu zarządzania użytkownikami, rezerwacjami stolików, menu, zapasami, zamówieniami i płatnościami. Zapewnia projekt bazy danych zamówień żywności do zarządzania zamówieniami żywności dla restauracji. Może być dalej wykorzystywany do opracowywania lokalnych aplikacji systemu zamówień restauracji.
Takie systemy zamawiania są wdrażane w celu zautomatyzowania przetwarzania zamówień i skutecznego radzenia sobie ze szczytowymi czasami zamówień, poprawiając w ten sposób zadowolenie klientów przy mniejszym wysiłku – sytuacja korzystna dla firm restauracyjnych.
Diagram relacji encji lub wizualny projekt bazy danych pokazano poniżej.
System zamawiania restauracji
Notatki :Można go wykorzystać do rezerwacji stolików online i przedsprzedaży przed dotarciem do restauracji. Bezpieczeństwo można również obsługiwać, korzystając z bazy danych RBAC w MySQL.
Możesz także odwiedzić popularne samouczki, w tym Jak zainstalować MySQL 8 w systemie Ubuntu, Jak zainstalować MySQL 8 w systemie Windows, Jak zainstalować MySQL 8 z Workbench w systemie Windows 10, Baza danych RBAC w MySql, Baza danych blogów w MySql, Baza danych quizu w MySQL, Baza danych ankiet i ankiet w MySQL, baza danych koszyka zakupów online i nauka podstawowych zapytań SQL w MySQL.
Baza danych restauracji
Pierwszym krokiem jest stworzenie Bazy Restauracji. Można go utworzyć za pomocą zapytania, jak pokazano poniżej.
CREATE SCHEMA `restaurant` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Użyłem zestawu znaków utf8mb4 do obsługi szerokiej gamy znaków.
Tabela użytkowników
W tej sekcji zaprojektujemy Tabelę użytkowników do przechowywania informacji o użytkowniku. Ta sama tabela może służyć do zarządzania różnymi typami użytkowników, w tym administratorami, szefami kuchni, agentami i klientami. Może być używany do powiązania użytkowników z menu, pozycjami, rezerwacjami stolików i zamówieniami. Użytkownicy mogą śledzić własne tabele i zamówienia. Poniżej znajduje się opis wszystkich kolumn tabeli użytkowników.
Identyfikator | Unikalny identyfikator do identyfikacji użytkownika. |
Imię | Imię użytkownika. |
Drugie imię | Drugie imię użytkownika. |
Nazwisko | Nazwisko użytkownika. |
Komórka | Numer telefonu komórkowego użytkownika. Może być używany do celów logowania i rejestracji. |
Poczta e-mail | E-mail użytkownika. Może być używany do celów logowania i rejestracji. |
Hash hasła | Skrót hasła wygenerowany przez odpowiedni algorytm. Musimy unikać przechowywania zwykłych lub zaszyfrowanych haseł. |
Administrator | Flaga określająca, czy użytkownik jest administratorem. Nie jest to wymagane, jeśli tabele RBAC są tworzone zgodnie z projektem bazy danych RBAC. |
Dostawca | Flaga określająca, czy użytkownik może otrzymywać zamówienia magazynowe. Nie jest to wymagane, jeśli tabele RBAC są tworzone zgodnie z projektem bazy danych RBAC. |
Kucharz | Flaga określająca, czy użytkownik może ugotować produkty. Nie jest to wymagane, jeśli tabele RBAC są tworzone zgodnie z projektem bazy danych RBAC. |
Agent | Flaga określająca, czy użytkownik może hostować tabelę. Nie jest to wymagane, jeśli tabele RBAC są tworzone zgodnie z projektem bazy danych RBAC. |
Zarejestrowano w | Ta kolumna może być użyta do obliczenia życia użytkownika z aplikacją. |
Ostatnie logowanie | Może być używany do identyfikacji ostatniego logowania użytkownika. |
Wprowadzenie | Krótkie wprowadzenie użytkownika dostawcy, który ma być wyświetlany na stronie produktu. |
Profil | Szczegóły dostawcy, które mają być wyświetlane na stronie produktu. |
Tabela użytkownika z odpowiednimi ograniczeniami jest pokazana poniżej.
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) );
Tabele składników, pozycji, przepisów i menu
W tej sekcji zaprojektujemy tabele składników, produktów, przepisów i menu do przechowywania danych menu i pozycji.
Poniżej wymieniono opis wszystkich kolumn Tabeli składników . Tabela składników jest również mapowana, aby zidentyfikować dostawcę, który może dostarczyć składnik w celu ponownego uzupełnienia zapasów. W bardziej zaawansowanym scenariuszu może istnieć osobna tabela do przechowywania relacji składnika i dostawcy w celu obsługi wielu dostawców tego samego składnika.
Identyfikator | Unikalny identyfikator do identyfikacji składnika. |
Identyfikator użytkownika | Identyfikator użytkownika do identyfikacji administratora. |
Identyfikator dostawcy | Identyfikator dostawcy do identyfikacji dostawcy. |
Tytuł | Tytuł składnika, który ma być wyświetlany w recepturze przedmiotu. |
Ślimak | Unikalny ślimak używany jako GID składnika. |
Podsumowanie | Podsumowanie zawierające najważniejsze informacje. |
Wpisz | Typ do rozróżniania różnych typów składników. |
SKU | Jednostka przechowywania zapasów do śledzenia zapasów składników. |
Ilość | Dostępna ilość składnika. |
Jednostka | Jednostki miary przypisane do składnika. |
Utworzono w | Przechowuje datę i godzinę utworzenia składnika. |
Aktualizacja o | Przechowuje datę i godzinę aktualizacji składnika. |
Treść | Kolumna używana do przechowywania dodatkowych szczegółów składnika. |
Wykorzystuje kolumny ilość i jednostka do śledzenia zapasów dostępnych w magazynie składników. Tabela składników z odpowiednimi ograniczeniami jest pokazana poniżej.
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;
Poniżej wymieniono opis wszystkich kolumn Tabeli elementów . Tabela Pozycji jest również zmapowana, aby zidentyfikować dostawcę, który może dostarczyć artykuł nie do gotowania w celu ponownego napełnienia zapasów. W bardziej zaawansowanym scenariuszu może istnieć oddzielna tabela do przechowywania relacji z towarem i dostawcą w celu obsługi wielu dostawców tego samego towaru.
Notatki :Możemy również użyć tej samej tabeli do przechowywania składników i przedmiotów, aby uprościć zamówienia restauracji i dostawców. W takim przypadku do identyfikacji składników przedmiotu wymagane jest samosprzężenie. Ponadto kolumny gotowania i ceny nie są przydatne w przypadku wierszy składników.
Identyfikator | Unikalny identyfikator do identyfikacji przedmiotu. |
Identyfikator użytkownika | Identyfikator użytkownika do identyfikacji administratora. |
Identyfikator dostawcy | Identyfikator dostawcy do identyfikacji dostawcy. |
Tytuł | Tytuł pozycji, który ma być wyświetlany w menu. |
Ślimak | Unikalny slug do użycia jako GID elementu. |
Podsumowanie | Podsumowanie zawierające najważniejsze informacje. |
Wpisz | Typ rozróżniający różne typy elementów. |
Gotowanie | Flaga określająca, czy dany przedmiot wymaga gotowania. |
SKU | Jednostka przechowywania zapasów do śledzenia zapasów przedmiotów. Jest to wymagane tylko wtedy, gdy przedmiot nie jest powiązany ze składnikami. |
Cena | Cena sprzedaży jednej jednostki lub jednej porcji. |
Ilość | Dostępna ilość towaru. Jest to wymagane tylko wtedy, gdy przedmiot nie jest powiązany ze składnikami. |
Jednostka | Jednostki miary przypisane do pozycji. Jest to wymagane tylko wtedy, gdy przedmiot nie jest powiązany ze składnikami. |
Przepis | Instrukcje wymagane do ugotowania przedmiotu. |
Instrukcje | Instrukcje wymagane do obsługi przedmiotu. |
Utworzono w | Przechowuje datę i godzinę utworzenia elementu. |
Aktualizacja o | Przechowuje datę i godzinę aktualizacji elementu. |
Treść | Kolumna używana do przechowywania dodatkowych szczegółów przedmiotu. |
Podobnie jak w przypadku tabeli składników, wykorzystuje kolumny ilość i jednostkę do śledzenia zapasów dostępnych w zasobach magazynowych. Tabela elementów z odpowiednimi ograniczeniami jest pokazana poniżej.
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;
Tabela przepisów może służyć do śledzenia ilości składników wymaganych do produktu na jedną porcję. Poniżej znajduje się opis wszystkich kolumn Tabeli Receptur.
Identyfikator | Unikalny identyfikator do identyfikacji przepisu. |
Identyfikator elementu | Identyfikator przedmiotu do identyfikacji przedmiotu. |
Identyfikator składnika | Identyfikator składnika do identyfikacji składnika. |
Ilość | Ilość składnika wymagana do ugotowania produktu na jedną porcję. |
Jednostka | Jednostki miary identyfikujące ilość składników wymaganą dla produktu. |
Instrukcje | Instrukcje dotyczące składników wymagane do ugotowania produktu. |
Tabela przepisów z odpowiednimi ograniczeniami jest pokazana poniżej.
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;
Poniżej wymieniono opis wszystkich kolumn Tabeli menu . Tabeli menu można używać do przechowywania wielu menu tej samej restauracji.
Identyfikator | Unikalny identyfikator do identyfikacji menu. |
Identyfikator użytkownika | Identyfikator użytkownika do identyfikacji administratora. |
Tytuł | Tytuł menu, który ma być wyświetlany na karcie menu. |
Ślimak | Unikalny slug używany jako GID menu. |
Podsumowanie | Podsumowanie wspominające o najważniejszych punktach karty menu. |
Wpisz | Typ do rozróżniania różnych typów menu. |
Utworzono w | Przechowuje datę i godzinę utworzenia elementu. |
Aktualizacja o | Przechowuje datę i godzinę aktualizacji elementu. |
Treść | Kolumna używana do przechowywania dodatkowych szczegółów menu. |
Tabela menu z odpowiednimi ograniczeniami jest pokazana poniżej.
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);
Tabela pozycji menu może służyć do śledzenia pozycji dostępnych w Karcie Menu. Poniżej znajduje się opis wszystkich kolumn tabeli pozycji menu.
Identyfikator | Unikalny identyfikator do identyfikacji pozycji menu. |
Identyfikator menu | Identyfikator menu do identyfikacji menu. |
Identyfikator elementu | Identyfikator przedmiotu do identyfikacji przedmiotu. |
Aktywny | Flaga sprawdzająca, czy pozycja jest dostępna. |
Tabela pozycji menu z odpowiednimi ograniczeniami jest pokazana poniżej.
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;
Stół szefa kuchni może służyć do identyfikacji Szefa Kuchni przydzielonego do gotowania danej pozycji. Poniżej znajduje się opis wszystkich kolumn tabeli szefa kuchni.
Identyfikator | Unikalny identyfikator do identyfikacji pozycji menu. |
Identyfikator elementu | Identyfikator przedmiotu do identyfikacji przedmiotu. |
Identyfikator szefa kuchni | Identyfikator szefa kuchni do identyfikacji użytkownika. |
Aktywny | Flaga sprawdzająca, czy szef kuchni jest dostępny do przyrządzania danej pozycji. |
Tabela szefa kuchni z odpowiednimi ograniczeniami jest pokazana poniżej.
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;
Stoły nablatowe i rezerwacyjne
W tej sekcji zaprojektujemy stoły stołowe i stoliki do rezerwacji do przechowywania stołów restauracyjnych i ich szczegółów rezerwacji.
Stół stołowy może służyć do przechowywania detali stołów w restauracji. Status tabeli może być Wolny, Zarezerwowany i Aktywny. Użyłem TableTop zamiast Table, aby odróżnić go od słowa kluczowego table MySQL. Poniżej znajduje się opis wszystkich kolumn tabeli TableTop.
Identyfikator | Unikalny identyfikator do identyfikacji tabeli. |
Kod | Kod tabeli. |
Stan | Ocena recenzji. |
Pojemność | Całkowita pojemność stołu. |
Utworzono w | Przechowuje datę i godzinę utworzenia tabeli. |
Aktualizacja o | Przechowuje datę i godzinę aktualizacji tabeli. |
Treść | Kolumna używana do przechowywania dodatkowych szczegółów tabeli. |
Tabela TableTop z odpowiednimi ograniczeniami jest pokazana poniżej.
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`));
Tabela rezerwacji można wykorzystać do rezerwacji stolików w restauracji online lub na miejscu. Zalogowanego lub istniejącego użytkownika można również powiązać z Rezerwacją. Zakłada również, że tylko stoły o statusie Wolne mogą być zarezerwowane. Status stolika można zmienić na Zarezerwowany po potwierdzeniu rezerwacji. Ponadto stan stołu można ustawić na Aktywny, gdy tylko goście go zajmą. Poniżej znajduje się opis wszystkich kolumn tabeli rezerwacji.
Notatki :Rezerwacja stolika nie obejmuje płatności związanych z rezerwacją stolika. Można go dalej aktualizować, dodając dodatkowe kolumny do obsługi płatności związanych z rezerwacją stolika.
Identyfikator | Unikalny identyfikator do identyfikacji rezerwacji. |
Identyfikator tabeli | Identyfikator stołu identyfikujący stół powiązany z rezerwacją. |
Identyfikator użytkownika | Identyfikator użytkownika do identyfikacji zarejestrowanego użytkownika powiązanego z rezerwacją. |
Token | Unikalny token powiązany z rezerwacją. |
Stan | Statusem rezerwacji może być Nowa, Poczekalnia, Aktywna i Zakończona. |
Imię | Imię gościa. |
Drugie imię | Drugie imię gościa. |
Nazwisko | Nazwisko użytkownika. |
Komórka | Numer telefonu komórkowego użytkownika. |
Poczta e-mail | E-mail użytkownika. |
Wiersz 1 | Pierwszy wiersz do przechowywania adresu. |
Wiersz 2 | Druga linia do przechowywania adresu. |
Miasto | Miasto adresu. |
Prowincja | Prowincja adresu. |
Kraj | Kraj adresu. |
Utworzono w | Przechowuje datę i godzinę utworzenia rezerwacji. |
Aktualizacja o | Przechowuje datę i godzinę aktualizacji rezerwacji. |
Treść | Kolumna używana do przechowywania dodatkowych szczegółów rezerwacji. |
Tabela rezerwacji z odpowiednimi ograniczeniami jest pokazana poniżej.
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;
Tabela pozycji rezerwacji jest zobowiązany do śledzenia rzeczy zamówionych przez gościa. Poniżej wymieniono opis wszystkich kolumn tabeli pozycji rezerwacji.
Identyfikator | Unikalny identyfikator identyfikujący pozycję rezerwacji. |
Identyfikator rezerwacji | Identyfikator rezerwacji identyfikujący rezerwację powiązaną z pozycją rezerwacji. |
Identyfikator elementu | Identyfikator przedmiotu identyfikujący przedmiot powiązany z elementem rezerwacji. |
SKU | SKU przedmiotu podczas zamawiania. |
Cena | Cena sprzedaży przedmiotu podczas zamawiania. |
Rabat | Zniżka produktu podczas zamawiania. |
Ilość | Ilość towaru zamówionego przez użytkownika. Może to być mnożnik jednostki produktu lub pojedyncza porcja. |
Jednostka | Jednostki miary podczas zamawiania pozycji. |
Stan | Status śledzenia postępu przedmiotu. Może być Nowy, Kuchnia, Gotowanie, Gotowane, Serwowane. |
Utworzono w | Przechowuje datę i godzinę utworzenia pozycji rezerwacji. |
Aktualizacja o | Przechowuje datę i godzinę aktualizacji pozycji rezerwacji. |
Treść | Kolumna używana do przechowywania dodatkowych szczegółów pozycji rezerwacji. |
Tabela pozycji rezerwacji z odpowiednimi ograniczeniami jest pokazana poniżej.
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;
Tabela zamówień i tabela pozycji zamówienia
Ta sekcja zawiera tabele do zarządzania zamówieniami. Z zamówieniem można również powiązać zalogowanego użytkownika. Tabela zamówień może służyć do przechowywania zakończonych rezerwacji i zamówień dostawców. Status zamówień dostawcy można ustawić na nowy podczas składania zamówienia i można go ustawić na zakończenie po otrzymaniu towaru od dostawcy. Również cena towaru musi być wypełniona ręcznie po otrzymaniu towaru od dostawcy. Poniżej znajduje się opis wszystkich kolumn tabeli zamówień.
Identyfikator | Unikalny identyfikator do identyfikacji zamówienia. |
Identyfikator użytkownika | Identyfikator użytkownika do identyfikacji gościa powiązanego z zamówieniem. |
Identyfikator dostawcy | Identyfikator dostawcy do identyfikacji dostawcy powiązanego z zamówieniem. |
Token | Unikalny token powiązany z zamówieniem i powiązany z rezerwacją. Ten sam token można również przekazać do bramki płatności, jeśli jest to wymagane. |
Stan | Status zamówienia może być:Nowe, Do kasy, Zapłacone, Nieudane, Wysłane, Dostarczone, Zwrócone i Ukończone. Status Wysłano, Dostarczono i Zwrócono może być używany dla zamówień od dostawców. |
Suma częściowa | Całkowita cena pozycji zamówienia. |
Zniżka na przedmiot | Całkowity rabat na pozycje zamówienia. |
Podatek | Podatek od pozycji zamówienia. |
Wysyłka | Opłaty za wysyłkę pozycji zamówienia. |
Łącznie | Całkowita cena Zamówienia wraz z podatkiem i kosztami wysyłki. Nie obejmuje zniżek na przedmioty. |
Promocja | Kod promocyjny Zamówienia. |
Rabat | Całkowity rabat Zamówienia na podstawie kodu promocyjnego lub rabatu w sklepie. |
Całkowita suma | Całkowita suma zamówienia, którą gość ma zapłacić restauracji lub restauracji sprzedawcy. |
Imię | Imię użytkownika. |
Drugie imię | Drugie imię użytkownika. |
Nazwisko | Nazwisko użytkownika. |
Komórka | Numer telefonu komórkowego użytkownika. |
Poczta e-mail | E-mail użytkownika. |
Wiersz 1 | Pierwszy wiersz do przechowywania adresu. |
Wiersz 2 | Druga linia do przechowywania adresu. |
Miasto | Miasto adresu. |
Prowincja | Prowincja adresu. |
Kraj | Kraj adresu. |
Utworzono w | Przechowuje datę i godzinę utworzenia zamówienia. |
Aktualizacja o | Przechowuje datę i godzinę aktualizacji zamówienia. |
Treść | Kolumna używana do przechowywania dodatkowych szczegółów zamówienia. |
Tabela kolejności z odpowiednimi ograniczeniami jest pokazana poniżej.
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;
Poniżej wymieniono opis wszystkich kolumn tabeli pozycji zamówienia.
Identyfikator | Unikalny identyfikator do identyfikacji zamówionego produktu. |
Identyfikator elementu | Identyfikator produktu identyfikujący przedmiot powiązany z zamówionym produktem. |
Identyfikator zamówienia | Identyfikator zamówienia identyfikujący zamówienie powiązane z zamówionym produktem. |
SKU | SKU przedmiotu podczas zamawiania. |
Cena | Cena produktu podczas zamawiania. |
Rabat | Zniżka produktu podczas zamawiania. |
Ilość | Ilość elementu wybranego przez użytkownika. |
Jednostka | Jednostki miary podczas zamawiania pozycji. |
Utworzono w | Przechowuje datę i godzinę utworzenia zamówionego elementu. |
Aktualizacja o | Przechowuje datę i godzinę aktualizacji zamówionego elementu. |
Treść | Kolumna używana do przechowywania dodatkowych szczegółów zamówionego przedmiotu. |
Tabela pozycji zamówienia z odpowiednimi ograniczeniami jest pokazana poniżej.
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;
Tabela transakcji
Potrzebujemy również tabeli transakcji do śledzenia płatności zamówień składanych przez gości do restauracji i restauracji do sprzedawców w celu prowadzenia księgowości. Możemy również użyć tej samej tabeli do rejestrowania transakcji kredytowych (gości) i debetowych (dostawcy). Poniżej wymieniono opis wszystkich kolumn tabeli transakcji.
Identyfikator | Unikalny identyfikator do identyfikacji transakcji. |
Identyfikator użytkownika | Identyfikator użytkownika do identyfikacji użytkownika powiązanego z transakcją. |
Identyfikator dostawcy | Identyfikator dostawcy do identyfikacji dostawcy powiązanego z transakcją. |
Identyfikator zamówienia | Identyfikator zamówienia identyfikujący zamówienie związane z transakcją. |
Kod | Identyfikator płatności dostarczony przez bramkę płatności. |
Wpisz | Typem transakcji zamówienia może być kredyt lub debet. |
Tryb | Trybem realizacji zamówienia może być Offline, Płatność przy odbiorze, Czek, Draft, Przewodowy i Online. |
Stan | Statusem transakcji zamówienia może być Nowa, Anulowana, Nieudana, Oczekująca, Odrzucona, Odrzucona i Powodzenie. |
Utworzono w | Przechowuje datę i godzinę utworzenia transakcji zamówienia. |
Aktualizacja o | Przechowuje datę i godzinę aktualizacji transakcji zamówienia. |
Treść | Kolumna używana do przechowywania dodatkowych szczegółów transakcji. |
Tabela transakcji z odpowiednimi ograniczeniami jest pokazana poniżej.
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;
Tabela adresowa
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.
Podsumowanie
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.
Możesz przesłać swoje uwagi, aby dołączyć do dyskusji. You may also be interested in designing the database of the Blog, Online Shopping Cart, and Poll &Survey applications. Pełny schemat bazy danych jest również dostępny na GitHub.