Този урок предоставя пълни стъпки за проектиране на схема на база данни на системата за поръчки в ресторант за управление на потребителите, резервации на маси, менюта, инвентар, поръчки и плащания. Той осигурява дизайна на базата данни за поръчки на храна за управление на поръчките за храна за ресторанти. Може да се използва допълнително за разработване на локални приложения за система за поръчки в ресторант.
Такива системи за поръчки са внедрени за автоматизиране на обработката на поръчките и ефективно справяне с пиковите времена за поръчки, като по този начин подобряват удовлетвореността на клиентите с по-малко усилия – печеливша ситуация за ресторантьорските фирми.
Диаграмата на взаимоотношенията на обектите или визуалният дизайн на базата данни е показан по-долу.
Система за поръчки в ресторант
Бележки :Може да се използва за онлайн резервация на масите и предварителна заявка, преди да стигнете до ресторанта. Сигурността може да се управлява и чрез следване на базата данни RBAC в MySQL.
Можете също да посетите популярните уроци, включително Как да инсталирате MySQL 8 на Ubuntu, Как да инсталирате MySQL 8 на Windows, Как да инсталирате MySQL 8 с Workbench на Windows 10, RBAC база данни в MySql, Блог база данни в MySql, Quiz Database в MySQL, База данни за анкети и анкети в MySQL, онлайн база данни за пазарска количка и научете основни SQL заявки в MySQL.
База данни за ресторанти
Първата стъпка е да създадете база данни за ресторанти. Може да се създаде с помощта на заявката, както е показано по-долу.
CREATE SCHEMA `restaurant` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Използвал съм набора от знаци utf8mb4 за поддръжка на широк спектър от знаци.
Таблица с потребители
В този раздел ще проектираме Таблица на потребителите за съхраняване на потребителска информация. Същата таблица може да се използва за управление на различни типове потребители, включително администратори, готвачи, агенти и клиенти. Може да се използва за свързване на потребителите с менюта, артикули, резервации на маси и поръчки. Потребителите могат да проследяват собствените си маси и поръчки. По-долу е посочено описанието на всички колони на потребителската таблица.
Id | Уникалният идентификатор за идентифициране на потребителя. |
Име | Първото име на потребителя. |
Биринно име | Биринното име на потребителя. |
Фамилия | Фамилията на потребителя. |
Мобилни | Мобилният номер на потребителя. Може да се използва за влизане и регистрация. |
Имейл | Имейлът на потребителя. Може да се използва за влизане и регистрация. |
Хеш на парола | Хешът на паролата, генериран от подходящия алгоритъм. Трябва да избягваме съхраняването на обикновени или криптирани пароли. |
Администратор | Флагът за идентифициране дали потребителят е администратор. Не е задължително, ако RBAC таблиците са създадени, като се следва дизайнът на базата данни RBAC. |
Продавач | Флагът за идентифициране дали потребителят може да получава поръчки за инвентаризация. Не е задължително, ако RBAC таблиците са създадени, като се следва дизайнът на базата данни RBAC. |
Готвач | Флагът за идентифициране дали потребителят може да готви артикулите. Не е задължително, ако RBAC таблиците са създадени, като се следва дизайнът на базата данни RBAC. |
Агент | Флагът за идентифициране дали потребителят може да хоства таблица. Не е задължително, ако RBAC таблиците са създадени, като се следва дизайнът на базата данни RBAC. |
Регистриран в | Тази колона може да се използва за изчисляване на живота на потребителя с приложението. |
Последно влизане | Може да се използва за идентифициране на последното влизане на потребителя. |
Въведение | Краткото представяне на потребителя на доставчика, което ще бъде показано на продуктовата страница. |
Профил | Данните за доставчика, които да се показват на продуктовата страница. |
Потребителската таблица със съответните ограничения е както е показано по-долу.
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) );
Таблици със съставки, артикули, рецепти и менюта
В този раздел ще проектираме таблиците за съставки, артикули, рецепти и менюта за да съхранявате менютата и данните за елементите.
По-долу е посочено описанието на всички колони на Таблицата на съставките . Таблицата на съставките също е картографирана, за да идентифицира доставчика, който може да достави съставката за повторно попълване на инвентара. При по-напреднал сценарий може да има отделна таблица за съхраняване на връзката между съставката и доставчика, за да се поддържат множество доставчици за една и съща съставка.
Id | Уникалният идентификатор за идентифициране на съставката. |
Потребителски идентификатор | Потребителският идентификатор за идентифициране на администратора. |
Идентификатор на доставчик | Идент. № на доставчика за идентифициране на доставчика. |
Заглавие | Заглавието на съставката, което да се показва в рецептата за артикул. |
Плюс | Уникалната част, която ще се използва като GID на съставката. |
Резюме | Резюме за споменаване на ключови акценти. |
Тип | Типът за разграничаване на различните типове съставки. |
SKU | Звеното за поддържане на запаси за проследяване на инвентара на съставките. |
Количество | Наличното количество от съставката. |
Единица | Мерни единици, присвоени на съставката. |
Създаден в | Той съхранява датата и часа, в които съставката е създадена. |
Актуализирано в | Той съхранява датата и часа, в които съставката се актуализира. |
Съдържание | Колоната, използвана за съхраняване на допълнителните подробности за съставката. |
Той използва количеството и единицата в колоните, за да проследи наличните запаси в инвентара на съставките. Таблицата на съставките със съответните ограничения е както е показано по-долу.
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;
По-долу е посочено описанието на всички колони на Таблицата с артикули . Таблицата с артикули също е картографирана, за да идентифицира доставчика, който може да достави артикула без готвене, за да попълни отново инвентара. В по-разширен сценарий може да има отделна таблица за съхраняване на артикула и връзката с доставчика, за да се поддържат множество доставчици за един и същи артикул.
Бележки :Можем също да използваме същата таблица за съхраняване на съставките и артикулите, за да опростим поръчките в ресторанта и доставчиците. В такъв случай е необходимо самостоятелно присъединяване, за да се идентифицират съставките на артикула. Освен това колоните готвене и цена не са полезни за редове със съставки.
Id | Уникалният идентификатор за идентифициране на артикула. |
Потребителски идентификатор | Потребителският идентификатор за идентифициране на администратора. |
Идентификатор на доставчик | Идент. № на доставчика за идентифициране на доставчика. |
Заглавие | Заглавието на елемента, което да се показва в менюто. |
Плюс | Уникалната част, която да се използва като GID на артикула. |
Резюме | Резюме за споменаване на ключови акценти. |
Тип | Типът за разграничаване на различните типове елементи. |
Готвене | Флагът за идентифициране дали се изисква готвене за артикула. |
SKU | Единицата за съхранение на запаси за проследяване на инвентара на артикулите. Изисква се само ако артикулът не е свързан със съставки. |
Цена | Продажната цена на една единица или на единична порция. |
Количество | Наличното количество на артикула. Изисква се само ако артикулът не е свързан със съставки. |
Единица | Мерните единици, присвоени на артикула. Изисква се само ако артикулът не е свързан със съставки. |
Рецепта | Инструкциите, необходими за приготвяне на артикула. |
Инструкции | Инструкциите, необходими за обслужване на артикула. |
Създаден в | Той съхранява датата и часа, в които е създаден елементът. |
Актуализирано в | Той съхранява датата и часа, в които елементът е актуализиран. |
Съдържание | Колоната, използвана за съхраняване на допълнителните подробности за елемента. |
Подобно на таблицата на съставките, тя използва количеството и единицата в колоните, за да проследи наличните запаси в инвентара на артикули. Таблицата на елементите със съответните ограничения е както е показано по-долу.
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;
Таблица с рецепти може да се използва за проследяване на количеството съставки, необходими за един артикул за една порция. По-долу е споменато описанието на всички колони в таблицата с рецепти.
Id | Уникалният идентификатор за идентифициране на рецептата. |
Идентификатор на елемент | Идентификаторът на елемента за идентифициране на артикула. |
Идентификатор на съставката | Идентификаторът на съставката за идентифициране на съставката. |
Количество | Количеството на съставката, необходимо за приготвяне на артикула за една порция. |
Единица | Мерни единици за идентифициране на количеството съставка, необходимо за артикула. |
Инструкции | Инструкциите за съставките, необходими за готвене на артикула. |
Таблицата с рецепти със съответните ограничения е както е показано по-долу.
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;
По-долу е посочено описанието на всички колони на Таблица с менюта . Таблицата с менюта може да се използва за съхраняване на множество менюта на един и същи ресторант.
Id | Уникалният идентификатор за идентифициране на менюто. |
Потребителски идентификатор | Потребителският идентификатор за идентифициране на администратора. |
Заглавие | Заглавието на менюто, което да се показва на картата с менюта. |
Плюс | Уникалното поле, което да се използва като GID на менюто. |
Резюме | Резюме за споменаване на основните акценти на картата с менюто. |
Тип | Типът за разграничаване на различните типове менюта. |
Създаден в | Той съхранява датата и часа, в които е създаден елементът. |
Актуализирано в | Той съхранява датата и часа, в които елементът е актуализиран. |
Съдържание | Колоната, използвана за съхраняване на допълнителните подробности за менюто. |
Таблицата с менюта със съответните ограничения е както е показано по-долу.
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);
Таблица с елементи от менюто може да се използва за проследяване на наличните елементи в картата с менюта. По-долу е споменато описанието на всички колони на таблицата с елементи от менюто.
Id | Уникалният идентификатор за идентифициране на елемента от менюто. |
Идентификатор на менюто | Идентификаторът на менюто за идентифициране на менюто. |
Идентификатор на елемент | Идентификаторът на елемента за идентифициране на артикула. |
Активно | Флаг за проверка дали артикулът е наличен. |
Таблицата с елементи от менюто със съответните ограничения е както е показано по-долу.
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;
Таблица за готвач на артикули може да се използва за идентифициране на главния готвач, назначен да приготви артикула. По-долу е посочено описанието на всички колони на таблицата за готвач на артикули.
Id | Уникалният идентификатор за идентифициране на елемента от менюто. |
Идентификатор на елемент | Идентификаторът на елемента за идентифициране на артикула. |
Идент. № на главния готвач | Идентификаторът на главния готвач за идентифициране на потребителя. |
Активно | Флагът, за да проверите дали главният готвач е на разположение да приготви артикула. |
Таблицата за готвач на артикули със съответните ограничения е както е показано по-долу.
CREATE TABLE `restaurant`.`item_chef` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`itemId` BIGINT NOT NULL,
`chefId` BIGINT NOT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 1,
PRIMARY KEY (`id`),
INDEX `idx_item_chef_item` (`itemId` ASC),
UNIQUE INDEX `uq_item_chef` (`itemId` ASC, `chefId` ASC),
CONSTRAINT `fk_item_chef_item`
FOREIGN KEY (`itemId`)
REFERENCES `restaurant`.`item` (`id`)
ON DELETE CASCADE
ON UPDATE NO ACTION)
ENGINE = InnoDB;
ALTER TABLE `restaurant`.`item_chef`
ADD INDEX `idx_item_chef_chef` (`chefId` ASC);
ALTER TABLE `restaurant`.`item_chef`
ADD CONSTRAINT `fk_item_chef_chef`
FOREIGN KEY (`chefId`)
REFERENCES `restaurant`.`user` (`id`)
ON DELETE CASCADE
ON UPDATE NO ACTION;
Настолни маси и маси за резервации
В този раздел ще проектираме Настолни маси и маси за резервации за съхраняване на масите в ресторанта и данните за тяхната резервация.
Настолната маса може да се използва за съхраняване на детайлите на масите в ресторанта. Състоянието на таблицата може да бъде Свободно, Резервирано и Активно. Използвах TableTop вместо Table, за да го разгранича от ключовата дума table на MySQL. По-долу е споменато описанието на всички колони на TableTop Table.
Id | Уникалният идентификатор за идентифициране на таблицата. |
Код | Кодът на таблицата. |
Състояние | Оценката на прегледа. |
Капацитет | Общият капацитет за сядане на масата. |
Създаден в | Той съхранява датата и часа, в които е създадена таблицата. |
Актуализирано в | Той съхранява датата и часа, в които таблицата се актуализира. |
Съдържание | Колоната, използвана за съхраняване на допълнителните подробности за таблицата. |
Таблицата TableTop със съответните ограничения е както е показано по-долу.
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`));
Маса за резервации може да се използва за резервиране на масите в ресторанта онлайн или на място. Влезлият или съществуващ потребител също може да бъде свързан с Booking. Той също така предполага, че само масите със статут Безплатни могат да бъдат резервирани. Състоянието на масата може да бъде променено на Резервирана след потвърждаване на резервацията. Също така, състоянието на масата може да бъде настроено на Активно веднага щом гостите я заемат. По-долу е посочено описанието на всички колони на таблицата за резервации.
Бележки :Таблицата за резервации не покрива плащанията, свързани с резервацията на масата. Тя може да бъде допълнително актуализирана чрез добавяне на допълнителни колони за обработка на плащанията, свързани с резервирането на масата.
Id | Уникалният идентификатор за идентифициране на резервацията. |
Идентификатор на таблицата | Идентификаторът на таблицата за идентифициране на таблицата, свързана с резервацията. |
Потребителски идентификатор | Потребителският идентификатор за идентифициране на регистрирания потребител, свързан с резервацията. |
Токен | Уникалният токен, свързан с резервацията. |
Състояние | Състоянието на резервацията може да бъде Нова, Зала, Активна и Завършена. |
Име | Първото име на госта. |
Биринно име | Билото на госта. |
Фамилия | Фамилията на потребителя. |
Мобилни | Мобилният номер на потребителя. |
Имейл | Имейлът на потребителя. |
Ред 1 | Първият ред за съхраняване на адреса. |
Ред 2 | Вторият ред за съхраняване на адрес. |
Град | Градът на адреса. |
Провинция | Провинцията на адреса. |
Държава | Държавата на адреса. |
Създаден в | Той съхранява датата и часа, в които е създадена резервацията. |
Актуализирано в | Той съхранява датата и часа, в които резервацията е актуализирана. |
Съдържание | Колоната, използвана за съхраняване на допълнителните подробности за резервацията. |
Таблицата за резервации със съответните ограничения е както е показано по-долу.
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;
Таблица с артикули за резервация се изисква за проследяване на поръчаните от госта артикули. По-долу е посочено описанието на всички колони на таблицата с артикули за резервация.
Id | Уникалният идентификатор за идентифициране на артикула за резервация. |
Идентификатор на резервацията | Идентификаторът на резервацията за идентифициране на резервацията, свързана с елемента за резервация. |
Идентификатор на елемент | Идентификаторът на артикула за идентифициране на артикула, свързан с артикула за резервация. |
SKU | Кодът на артикула, докато го поръчвате. |
Цена | Продажната цена на артикула при поръчката му. |
Отстъпка | Отстъпката на артикула при поръчка. |
Количество | Количеството на артикула, поръчан от потребителя. Може да бъде или множител на единицата артикул, или единична порция. |
Единица | Мерни единици при поръчка на артикула. |
Състояние | Състоянието за проследяване на напредъка на артикула. Може да бъде Нова, Кухня, Готвене, Готвена, Сервирана. |
Създаден в | Той съхранява датата и часа, в които е създаден резервираният елемент. |
Актуализирано в | Той съхранява датата и часа, в които резервираният елемент е актуализиран. |
Съдържание | Колоната, използвана за съхраняване на допълнителните подробности за артикула за резервация. |
Таблицата с артикули за резервация със съответните ограничения е както е показано по-долу.
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;
Таблица за поръчки и таблица с артикули за поръчки
Този раздел предоставя таблиците за управление на поръчките. Влезлият потребител също може да бъде свързан с поръчката. Таблицата за поръчки може да се използва за съхраняване на завършените резервации и поръчки на доставчици. Състоянието на поръчките на доставчика може да бъде настроено на ново, докато правите поръчката и може да бъде настроено да завърши след получаване на артикулите от продавача. Също така цената на артикула трябва да се попълни ръчно след получаване на артикулите от продавача. По-долу е посочено описанието на всички колони на таблицата с поръчки.
Id | Уникалният идентификатор за идентифициране на поръчката. |
Потребителски идентификатор | Потребителският идентификатор за идентифициране на госта, свързан с поръчката. |
Идентификатор на доставчик | Идентификаторът на доставчика за идентифициране на доставчика, свързан с поръчката. |
Токен | Уникалният токен, свързан с поръчката, за да го свърже с резервацията. Същият токен може да бъде прехвърлен и към Payment Gateway, ако е необходимо. |
Състояние | Състоянието на поръчката може да бъде Нова, Плащане, Платено, Неуспешно, Изпратено, Доставено, Върнато и Завършено. Състоянието Изпратено, Доставено и Върнато може да се използва за поръчките на доставчика. |
Под общо | Общата цена на артикулите на поръчката. |
Отстъпка за артикули | Общата отстъпка на артикулите на поръчката. |
Данък | Данъкът върху артикулите на поръчката. |
Доставка | Таксите за доставка на артикулите на поръчката. |
Общо | Общата цена на поръчката, включително данък и доставка. Това изключва отстъпката за артикули. |
Промоция | Промоционалният код на поръчката. |
Отстъпка | Общата отстъпка на поръчката въз основа на промоционалния код или отстъпката в магазина. |
Обща сума | Общата сума на поръчката, която гостът трябва да заплати на ресторанта или ресторантът на продавача. |
Име | Първото име на потребителя. |
Биринно име | Биринното име на потребителя. |
Фамилия | Фамилията на потребителя. |
Мобилни | Мобилният номер на потребителя. |
Имейл | Имейлът на потребителя. |
Ред 1 | Първият ред за съхраняване на адреса. |
Ред 2 | Вторият ред за съхраняване на адрес. |
Град | Градът на адреса. |
Провинция | Провинцията на адреса. |
Държава | Държавата на адреса. |
Създаден в | Той съхранява датата и часа, в които поръчката е създадена. |
Актуализирано в | Той съхранява датата и часа, в които поръчката е актуализирана. |
Съдържание | Колоната, използвана за съхраняване на допълнителните подробности за поръчката. |
Таблицата на поръчките със съответните ограничения е както е показано по-долу.
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;
По-долу е посочено описанието на всички колони на таблицата с артикули за поръчка.
Id | Уникалният идентификатор за идентифициране на поръчания артикул. |
Идентификатор на елемент | Идентификаторът на продукта за идентифициране на артикула, свързан с поръчания артикул. |
Идентификатор на поръчката | Идентификаторът на поръчката за идентифициране на поръчката, свързана с поръчания артикул. |
SKU | Кодът на артикула, докато го поръчвате. |
Цена | Цената на артикула при поръчка. |
Отстъпка | Отстъпката на артикула при поръчка. |
Количество | Количеството на избрания от потребителя артикул. |
Единица | Мерни единици при поръчка на артикула. |
Създаден в | Той съхранява датата и часа, в които е създаден поръчания артикул. |
Актуализирано в | Той съхранява датата и часа, в които поръчаният артикул се актуализира. |
Съдържание | Колоната, използвана за съхраняване на допълнителните подробности за поръчания артикул. |
Таблицата с артикули за поръчка със съответните ограничения е както е показано по-долу.
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;
Таблица на транзакциите
Необходима ни е и таблица за транзакции, за да проследяваме плащанията, направени от гостите към ресторанта и ресторанта към продавачите за счетоводство. Можем също да използваме същата таблица за записване на кредитни (гости) и дебитни (доставчици) транзакции. По-долу е споменато описанието на всички колони на таблицата с транзакции.
Id | Уникалният идентификатор за идентифициране на транзакцията. |
Потребителски идентификатор | Потребителският идентификатор за идентифициране на потребителя, свързан с транзакцията. |
Идентификатор на доставчик | Идентификаторът на доставчика за идентифициране на доставчика, свързан с транзакцията. |
Идентификатор на поръчката | Идентификаторът на поръчката за идентифициране на поръчката, свързана с транзакцията. |
Код | Идентификационният номер на плащането, предоставен от шлюза за плащане. |
Тип | Типът транзакция на поръчката може да бъде кредитна или дебитна. |
Режим | Режимът на транзакцията на поръчката може да бъде офлайн, наложен платеж, чек, чернова, кабелна и онлайн. |
Състояние | Състоянието на транзакцията на поръчката може да бъде Нова, Отменена, Неуспешна, Изчакваща, Отхвърлена, Отхвърлена и Успешна. |
Създаден в | Той съхранява датата и часа, в които е създадена транзакцията за поръчка. |
Актуализирано в | Той съхранява датата и часа, в които транзакцията на поръчката е актуализирана. |
Съдържание | Колоната, използвана за съхраняване на допълнителните подробности за транзакцията. |
Таблицата на транзакциите със съответните ограничения е както е показано по-долу.
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;
Таблица с адреси
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.
Резюме
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.
Можете да изпратите вашите коментари, за да се присъедините към дискусията. You may also be interested in designing the database of the Blog, Online Shopping Cart, and Poll &Survey applications. Пълната схема на базата данни е достъпна и на GitHub.