Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Przewodnik po projektowaniu bazy danych dla systemu zamówień restauracji w MySQL

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zrozumienie rozmiarów pamięci masowej dla typów danych MySQL TEXT

  2. Pobierz ostatnio wstawiony identyfikator za pomocą Mysql

  3. Jak uzyskać rekordy między 2 datami w MySQL?

  4. Jak zwrócić kolumny liczb całkowitych i liczbowych z MySQL jako liczby całkowite i numeryczne w PHP?

  5. System resetowania hasła w PHP