Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Guia para projetar banco de dados para sistema de pedidos de restaurante no MySQL


Este tutorial fornece etapas completas para projetar um esquema de banco de dados do sistema de pedidos de restaurante para gerenciar os usuários, reservas de mesa, menus, estoque, pedidos e pagamentos. Ele fornece o design do banco de dados de pedidos de alimentos para gerenciar os pedidos de alimentos para restaurantes. Ele também pode ser usado para desenvolver aplicativos de sistema de pedidos de restaurantes no local.



Esses sistemas de pedidos são implementados para automatizar o processamento de pedidos e lidar eficientemente com horários de pico de pedidos, melhorando assim a satisfação do cliente com menos esforços – uma situação vantajosa para as empresas de restaurantes.



O diagrama de relacionamento de entidade ou design de banco de dados visual é mostrado abaixo.



Sistema de pedidos de restaurante



Observações :pode ser usado para reserva online das mesas e pré-encomenda antes de chegar ao restaurante. A segurança também pode ser tratada seguindo o banco de dados RBAC no MySQL.



Você também pode visitar os tutoriais populares, incluindo Como instalar o MySQL 8 no Ubuntu, Como instalar o MySQL 8 no Windows, Como instalar o MySQL 8 com o Workbench no Windows 10, Banco de dados RBAC no MySql, Banco de dados do blog no MySql, Banco de dados do questionário no MySQL, Banco de dados de pesquisa e pesquisa no MySQL, banco de dados de carrinho de compras on-line e aprenda consultas SQL básicas no MySQL.


Banco de dados de restaurantes




O primeiro passo é criar o banco de dados do restaurante. Ele pode ser criado usando a consulta conforme mostrado abaixo.


CREATE SCHEMA `restaurant` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;



Eu usei o conjunto de caracteres utf8mb4 para suportar uma ampla gama de caracteres.


Tabela de usuário




Nesta seção, projetaremos a Tabela do usuário para armazenar informações do usuário. A mesma tabela pode ser usada para gerenciar diferentes tipos de usuários, incluindo administradores, chefs, agentes e clientes. Pode ser usado para relacionar os usuários com Menus, Itens, Reservas de Mesa e Pedidos. Os usuários podem acompanhar suas próprias mesas e pedidos. Abaixo está a descrição de todas as colunas da Tabela de Usuários.


ID O ID exclusivo para identificar o usuário.
Nome O primeiro nome do usuário.
Nome do meio O nome do meio do usuário.
Sobrenome O sobrenome do usuário.
Celular O número de celular do usuário. Ele pode ser usado para fins de login e registro.
E-mail O e-mail do usuário. Ele pode ser usado para fins de login e registro.
Hash de senha O hash de senha gerado pelo algoritmo apropriado. Devemos evitar armazenar senhas simples ou criptografadas.
Administrador O sinalizador para identificar se o usuário é um administrador. Não é necessário se as tabelas RBAC forem criadas seguindo o design do banco de dados RBAC.
Fornecedor O sinalizador para identificar se o usuário pode receber pedidos de estoque. Não é necessário se as tabelas RBAC forem criadas seguindo o design do banco de dados RBAC.
Chef O sinalizador para identificar se o usuário pode cozinhar os itens. Não é necessário se as tabelas RBAC forem criadas seguindo o design do banco de dados RBAC.
Agente O sinalizador para identificar se o usuário pode hospedar uma tabela. Não é necessário se as tabelas RBAC forem criadas seguindo o design do banco de dados RBAC.
Registrado em Esta coluna pode ser usada para calcular a vida útil do usuário com o aplicativo.
Último login Pode ser usado para identificar o último login do usuário.
Introdução A breve introdução do Usuário Fornecedor a ser exibida na Página do Produto.
Perfil Os detalhes do fornecedor a serem exibidos na página do produto.



A Tabela de Usuários com as restrições apropriadas é mostrada abaixo.


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) );


Ingrediente, Item, Receita e Tabelas de Menu




Nesta seção, projetaremos as Ingrediente, Item, Receita e Tabelas de Menu para armazenar os dados dos menus e itens.



Abaixo está a descrição de todas as colunas da Tabela de Ingredientes . A Tabela de Ingredientes também é mapeada para identificar o fornecedor que pode fornecer o ingrediente para reabastecer o estoque. Em um cenário mais avançado, pode haver uma tabela separada para armazenar o relacionamento de ingrediente e fornecedor para dar suporte a vários fornecedores para o mesmo ingrediente.


ID O ID exclusivo para identificar o ingrediente.
ID de usuário O ID do usuário para identificar o administrador.
ID do fornecedor O ID do fornecedor para identificar o fornecedor.
Título O título do ingrediente a ser exibido na receita do item.
Slug O slug exclusivo a ser usado como GID do Ingrediente.
Resumo O resumo para mencionar os principais destaques.
Tipo O tipo para distinguir entre os diferentes tipos de ingredientes.
SKU A Unidade de Manutenção de Estoque para rastrear o inventário de ingredientes.
Quantidade A quantidade disponível do ingrediente.
Unidade As unidades de medida atribuídas ao ingrediente.
Criado em Ele armazena a data e hora em que o ingrediente é criado.
Atualizado em Ele armazena a data e hora em que o ingrediente é atualizado.
Conteúdo A coluna usada para armazenar os detalhes adicionais do ingrediente.



Ele usa as colunas quantidade e unidade para rastrear o estoque disponível no inventário de ingredientes. A Tabela de Ingredientes com as restrições apropriadas é mostrada abaixo.


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;



Abaixo está a descrição de todas as colunas da Tabela de itens . A Tabela de Itens também é mapeada para identificar o fornecedor que pode fornecer o item não culinário para reabastecer o estoque. Em um cenário mais avançado, pode haver uma tabela separada para armazenar o relacionamento de item e fornecedor para oferecer suporte a vários fornecedores para o mesmo item.



Observações :Também podemos usar a mesma mesa para armazenar os ingredientes e itens para simplificar os pedidos do restaurante e do fornecedor. Nesse caso, uma auto-junção é necessária para identificar os ingredientes do item. Além disso, as colunas cozimento e preço não são úteis para as linhas de ingredientes.


ID O ID exclusivo para identificar o item.
ID de usuário O ID do usuário para identificar o administrador.
ID do fornecedor O ID do fornecedor para identificar o fornecedor.
Título O título do item a ser exibido no Menu.
Slug O slug exclusivo a ser usado como GID do item.
Resumo O resumo para mencionar os principais destaques.
Tipo O tipo para distinguir entre os diferentes tipos de itens.
Cozinhar O sinalizador para identificar se o cozimento é necessário para o item.
SKU A Unidade de Manutenção de Estoque para rastrear o estoque de itens. É necessário apenas se o item não estiver associado a ingredientes.
Preço O preço de venda de uma unidade ou de uma única porção.
Quantidade A quantidade disponível do item. É necessário apenas se o item não estiver associado a ingredientes.
Unidade As unidades de medida atribuídas ao item. É necessário apenas se o item não estiver associado a ingredientes.
Receita As instruções necessárias para cozinhar o item.
Instruções As instruções necessárias para veicular o item.
Criado em Ele armazena a data e hora em que o item foi criado.
Atualizado em Ele armazena a data e hora em que o item é atualizado.
Conteúdo A coluna usada para armazenar os detalhes adicionais do item.



Semelhante à Tabela de Ingredientes, ela utiliza as colunas quantidade e unidade para rastrear o estoque disponível no estoque do item. A Tabela de Itens com as restrições apropriadas é mostrada abaixo.


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;



A Tabela de Receitas pode ser usado para rastrear a quantidade dos ingredientes necessários para um item para uma única porção. Abaixo está a descrição de todas as colunas da Tabela de Receitas.


ID O ID exclusivo para identificar a receita.
ID do item O ID do item para identificar o item.
ID do ingrediente O ID do ingrediente para identificar o ingrediente.
Quantidade A quantidade do ingrediente necessária para cozinhar o item para uma única porção.
Unidade As unidades de medida para identificar a quantidade de ingrediente necessária para o item.
Instruções As instruções de ingredientes necessárias para cozinhar o item.



A Tabela de Receitas com as restrições apropriadas é mostrada abaixo.


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;



Abaixo está a descrição de todas as colunas da Tabela de Menu . A Tabela de Menus pode ser usada para armazenar os vários menus de um mesmo restaurante.


ID O ID exclusivo para identificar o menu.
ID de usuário O ID do usuário para identificar o administrador.
Título O título do menu a ser exibido no Card Card.
Slug O slug exclusivo a ser usado como GID do menu.
Resumo O resumo para mencionar os principais destaques do cartão de menu.
Tipo O tipo para distinguir entre os diferentes tipos de menu.
Criado em Ele armazena a data e hora em que o item foi criado.
Atualizado em Ele armazena a data e hora em que o item é atualizado.
Conteúdo A coluna usada para armazenar os detalhes adicionais do menu.



A Tabela de Menu com as restrições apropriadas é mostrada abaixo.


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);



A Tabela de itens de menu pode ser usado para rastrear os itens disponíveis no Card Card. Abaixo está a descrição de todas as colunas da Tabela de Itens do Menu.


ID O ID exclusivo para identificar o item de menu.
ID do menu O ID do menu para identificar o menu.
ID do item O ID do item para identificar o item.
Ativo O sinalizador para verificar se o item está disponível.



A Tabela de itens de menu com as restrições apropriadas é mostrada abaixo.


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;



A mesa do Chef de itens pode ser usado para identificar o Chef designado para cozinhar o item. Abaixo está a descrição de todas as colunas da Tabela do Item Chef.


ID O ID exclusivo para identificar o item de menu.
ID do item O ID do item para identificar o item.
ID do Chef O ID do chef para identificar o usuário.
Ativo O sinalizador para verificar se o chef está disponível para cozinhar o item.



A Tabela do Item Chef com as restrições apropriadas é mostrada abaixo.


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;


Mesa e mesas de reserva




Nesta seção, projetaremos o Mesa e as Tabelas de reserva para guardar as mesas do restaurante e os seus dados de reserva.



A Tabela de Mesa pode ser usado para armazenar os detalhes das mesas no restaurante. O status da tabela pode ser Livre, Reservado e Ativo. Eu usei TableTop em vez de Table para distingui-lo da palavra-chave table do MySQL. Abaixo mencionada é a descrição de todas as colunas da Tabela TableTop.


ID O ID exclusivo para identificar a tabela.
Código O código da tabela.
Estado A classificação do comentário.
Capacidade A capacidade total de assentos da Mesa.
Criado em Ele armazena a data e hora em que a tabela foi criada.
Atualizado em Ele armazena a data e hora em que a tabela é atualizada.
Conteúdo A coluna usada para armazenar os detalhes adicionais da tabela.



A Tabela TableTop com as restrições apropriadas é mostrada abaixo.


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 de reservas pode ser usado para reservar as mesas do restaurante online ou no local. Um usuário logado ou existente também pode ser associado ao Booking. Também assume que somente as mesas com status Livre podem ser Reservadas. O status da mesa pode ser alterado para Reservado após a confirmação da reserva. Além disso, o status da mesa pode ser definido como Ativo assim que os convidados a ocuparem. Abaixo está a descrição de todas as colunas da Tabela de Reservas.



Observações :A Mesa de Reserva não cobre os pagamentos envolvidos na reserva da mesa. Ele pode ser atualizado adicionando colunas adicionais para lidar com os pagamentos envolvidos na reserva da mesa.


ID O ID exclusivo para identificar a reserva.
ID da tabela O ID da tabela para identificar a tabela associada à reserva.
ID de usuário O ID do usuário para identificar o usuário registrado associado à reserva.
Token O token exclusivo associado à reserva.
Estado O status da reserva pode ser Novo, Lounge, Ativo e Concluído.
Nome O primeiro nome do convidado.
Nome do meio O nome do meio do convidado.
Sobrenome O sobrenome do usuário.
Celular O número de celular do usuário.
E-mail O e-mail do usuário.
Linha 1 A primeira linha para armazenar o endereço.
Linha 2 A segunda linha para armazenar o endereço.
Cidade A cidade do endereço.
Província A província do endereço.
País O país do endereço.
Criado em Ele armazena a data e hora em que a reserva foi criada.
Atualizado em Ele armazena a data e hora em que a reserva é atualizada.
Conteúdo A coluna usada para armazenar os detalhes adicionais da reserva.



A Tabela de Reservas com as restrições apropriadas é mostrada abaixo.


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;



A Tabela de itens de reserva é necessário para rastrear os itens encomendados pelo hóspede. Abaixo está a descrição de todas as colunas da Tabela de Itens de Reserva.


ID O ID exclusivo para identificar o item de reserva.
ID de reserva O ID da reserva para identificar a reserva associada ao item de reserva.
ID do item O ID do item para identificar o item associado ao item de reserva.
SKU O SKU do item durante o pedido.
Preço O preço de venda do item durante o pedido.
Desconto O desconto do item ao fazer o pedido.
Quantidade A quantidade do item solicitado pelo usuário. Pode ser o multiplicador da unidade do item ou a porção única.
Unidade As unidades de medida ao fazer o pedido do item.
Estado O status para acompanhar o progresso do item. Pode ser Novo, Cozinha, Cozinhar, Cozido, Servido.
Criado em Ele armazena a data e hora em que o item de reserva é criado.
Atualizado em Ele armazena a data e hora em que o item de reserva é atualizado.
Conteúdo A coluna usada para armazenar os detalhes adicionais do item de reserva.



A Tabela de Itens de Reserva com as restrições apropriadas é mostrada abaixo.


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 de pedidos e tabela de itens de pedidos




Esta seção fornece as tabelas para gerenciar os pedidos. Um usuário logado também pode ser associado ao pedido. A tabela de pedidos pode ser usada para armazenar as reservas concluídas e os pedidos de fornecedores. O status dos pedidos do fornecedor pode ser definido como novo ao fazer o pedido e pode ser definido como concluído após o recebimento dos itens do fornecedor. Além disso, o preço do item deve ser preenchido manualmente após o recebimento dos itens do fornecedor. Abaixo está a descrição de todas as colunas da Tabela de Pedidos.


ID O ID exclusivo para identificar o pedido.
ID de usuário O ID do usuário para identificar o convidado associado ao pedido.
ID do fornecedor O ID do fornecedor para identificar o fornecedor associado ao pedido.
Token O token exclusivo associado ao pedido para relacioná-lo com a reserva. O mesmo token também pode ser passado para o gateway de pagamento, se necessário.
Estado O status do pedido pode ser Novo, Finalizado, Pago, Reprovado, Enviado, Entregue, Devolvido e Concluído. O status Enviado, Entregue e Devolvido pode ser usado para os pedidos do fornecedor.
Subtotal O preço total dos itens do pedido.
Desconto de item O desconto total dos itens do pedido.
Imposto O imposto sobre os itens do pedido.
Envio As taxas de envio dos itens do pedido.
Total O preço total do pedido, incluindo impostos e frete. Exclui o desconto de itens.
Promoção O código promocional do pedido.
Desconto O desconto total do pedido com base no código promocional ou desconto da loja.
Total geral O total geral do pedido a ser pago pelo hóspede ao restaurante ou o restaurante ao fornecedor.
Nome O primeiro nome do usuário.
Nome do meio O nome do meio do usuário.
Sobrenome O sobrenome do usuário.
Celular O número de celular do usuário.
E-mail O e-mail do usuário.
Linha 1 A primeira linha para armazenar o endereço.
Linha 2 A segunda linha para armazenar o endereço.
Cidade A cidade do endereço.
Província A província do endereço.
País O país do endereço.
Criado em Ele armazena a data e hora em que o pedido foi criado.
Atualizado em Ele armazena a data e hora em que o pedido é atualizado.
Conteúdo A coluna usada para armazenar os detalhes adicionais do pedido.



A Tabela de Pedidos com as restrições apropriadas é mostrada abaixo.


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;



Abaixo está a descrição de todas as colunas da Tabela de Item de Pedido.


ID O ID exclusivo para identificar o item pedido.
ID do item O ID do produto para identificar o item associado ao item pedido.
ID do pedido O ID do pedido para identificar o pedido associado ao item solicitado.
SKU O SKU do item durante o pedido.
Preço O preço do item ao fazer o pedido.
Desconto O desconto do item ao fazer o pedido.
Quantidade A quantidade do item selecionado pelo usuário.
Unidade As unidades de medida ao fazer o pedido do item.
Criado em Ele armazena a data e a hora em que o item solicitado é criado.
Atualizado em Ele armazena a data e hora em que o item solicitado é atualizado.
Conteúdo A coluna usada para armazenar os detalhes adicionais do item solicitado.



A Tabela de itens do pedido com as restrições apropriadas é mostrada abaixo.


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 de transações




Também precisamos de uma tabela de transações para rastrear os pagamentos de pedidos feitos pelos hóspedes ao restaurante e do restaurante aos fornecedores para escrituração. Também podemos usar a mesma tabela para registrar as transações de crédito (convidados) e débito (fornecedores). Abaixo está a descrição de todas as colunas da Tabela de Transações.


ID O ID exclusivo para identificar a transação.
ID de usuário O ID do usuário para identificar o usuário associado à transação.
ID do fornecedor O ID do fornecedor para identificar o fornecedor associado à transação.
ID do pedido O ID do pedido para identificar o pedido associado à transação.
Código O ID de pagamento fornecido pelo gateway de pagamento.
Tipo O tipo de transação do pedido pode ser Crédito ou Débito.
Modo O modo de transação do pedido pode ser Offline, Cash On Delivery, Cheque, Draft, Wired e Online.
Estado O status da transação do pedido pode ser Novo, Cancelado, Reprovado, Pendente, Recusado, Rejeitado e Êxito.
Criado em Ele armazena a data e hora em que a transação do pedido é criada.
Atualizado em Ele armazena a data e hora em que a transação do pedido é atualizada.
Conteúdo A coluna usada para armazenar os detalhes adicionais da transação.



A Tabela de Transações com as restrições apropriadas é mostrada abaixo.


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;


Address Table




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.


Resumo




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.



Você pode enviar seus comentários para participar da discussão. You may also be interested in designing the database of the Blog, Online Shopping Cart, and Poll &Survey applications. O esquema completo do banco de dados também está disponível no GitHub.