sql >> Base de Datos >  >> RDS >> Mysql

Guía para diseñar una base de datos para el sistema de pedidos de restaurantes en MySQL

Este tutorial proporciona pasos completos para diseñar un esquema de base de datos del sistema de pedidos de restaurantes para administrar los usuarios, las reservas de mesas, los menús, el inventario, los pedidos y los pagos. Proporciona el diseño de la base de datos de pedidos de alimentos para administrar los pedidos de alimentos para restaurantes. Se puede usar más para desarrollar aplicaciones de sistemas de pedidos de restaurantes en las instalaciones.

Dichos sistemas de pedidos se implementan para automatizar el procesamiento de pedidos y manejar de manera eficiente los tiempos de mayor demanda, mejorando así la satisfacción del cliente con menos esfuerzo, una situación en la que todos ganan para las empresas de restaurantes.

El Diagrama de Relación de Entidades o el diseño de la base de datos visual se muestra a continuación.

Sistema de pedidos de restaurantes

Notas :Se puede utilizar para la reserva online de las mesas y preordenar antes de llegar al restaurante. La seguridad también se puede manejar siguiendo la base de datos RBAC en MySQL.

También puede visitar los tutoriales populares que incluyen Cómo instalar MySQL 8 en Ubuntu, Cómo instalar MySQL 8 en Windows, Cómo instalar MySQL 8 con Workbench en Windows 10, Base de datos RBAC en MySql, Base de datos de blogs en MySql, Base de datos de cuestionarios en MySQL, Base de datos de encuestas y sondeos en MySQL, base de datos de carrito de compras en línea y aprenda consultas SQL básicas en MySQL.

Base de datos de restaurantes

El primer paso es crear la base de datos del restaurante. Se puede crear usando la consulta como se muestra a continuación.

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

He usado el conjunto de caracteres utf8mb4 para admitir una amplia gama de caracteres.

Tabla de usuarios

En esta sección, diseñaremos la Tabla de usuarios para almacenar información del usuario. La misma tabla se puede usar para administrar diferentes tipos de usuarios, incluidos administradores, chefs, agentes y clientes. Se puede utilizar para relacionar a los usuarios con Menús, Ítems, Reservas de Mesas y Pedidos. Los usuarios pueden realizar un seguimiento de sus propias mesas y pedidos. A continuación se menciona la descripción de todas las columnas de la tabla de usuarios.

Id La identificación única para identificar al usuario.
Nombre El nombre del usuario.
Segundo Nombre El segundo nombre del usuario.
Apellido El apellido del usuario.
Móvil El número de móvil del usuario. Se puede utilizar con fines de inicio de sesión y registro.
Correo electrónico El correo electrónico del usuario. Se puede utilizar con fines de inicio de sesión y registro.
Hash de contraseña El hash de contraseña generado por el algoritmo apropiado. Debemos evitar almacenar contraseñas simples o encriptadas.
Administrador La bandera para identificar si el usuario es un administrador. No es necesario si las tablas RBAC se crean siguiendo el diseño de la base de datos RBAC.
Vendedor La marca para identificar si el usuario puede recibir pedidos de inventario. No es necesario si las tablas RBAC se crean siguiendo el diseño de la base de datos RBAC.
Cocinero La bandera para identificar si el usuario puede cocinar los artículos. No es necesario si las tablas RBAC se crean siguiendo el diseño de la base de datos RBAC.
Agente La bandera para identificar si el usuario puede hospedar una tabla. No es necesario si las tablas RBAC se crean siguiendo el diseño de la base de datos RBAC.
Registrado en Esta columna se puede utilizar para calcular la vida del usuario con la aplicación.
Último inicio de sesión Se puede utilizar para identificar el último inicio de sesión del usuario.
Introducción La breve introducción del usuario proveedor que se mostrará en la página del producto.
Perfil Los detalles del proveedor que se mostrarán en la página del producto.

La tabla de usuarios con las restricciones adecuadas se muestra a continuación.

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

Tablas de ingredientes, artículos, recetas y menús

En esta sección, diseñaremos las tablas de ingredientes, artículos, recetas y menús. para almacenar los datos de menús y artículos.

A continuación se menciona la descripción de todas las columnas de la Tabla de Ingredientes . La tabla de ingredientes también se mapea para identificar al proveedor que puede suministrar el ingrediente para volver a llenar el inventario. En un escenario más avanzado, puede haber una tabla separada para almacenar la relación entre el ingrediente y el proveedor para admitir múltiples proveedores para el mismo ingrediente.

Id La identificación única para identificar el ingrediente.
ID de usuario La identificación de usuario para identificar al administrador.
Id. del proveedor La identificación del proveedor para identificar al proveedor.
Título El título del ingrediente que se mostrará en la receta del artículo.
Babosa El slug único que se usará como GID del Ingrediente.
Resumen El resumen para mencionar los aspectos más destacados.
Tipo El tipo para distinguir entre los diferentes tipos de ingredientes.
SKU La Unidad de mantenimiento de existencias para realizar un seguimiento del inventario de ingredientes.
Cantidad La cantidad disponible del ingrediente.
Unidad Las Unidades de Medida asignadas al ingrediente.
Creado en Almacena la fecha y hora en que se crea el ingrediente.
Actualizado en Almacena la fecha y hora en que se actualiza el ingrediente.
Contenido La columna utilizada para almacenar los detalles adicionales del ingrediente.

Utiliza las columnas cantidad y unidad para realizar un seguimiento del stock disponible en el inventario de ingredientes. La tabla de ingredientes con las restricciones apropiadas se muestra a continuación.

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;

A continuación se menciona la descripción de todas las columnas de la Tabla de artículos . La Tabla de artículos también se mapea para identificar al proveedor que puede suministrar el artículo que no se cocina para volver a llenar el inventario. En un escenario más avanzado, puede haber una tabla separada para almacenar la relación entre el artículo y el proveedor para admitir múltiples proveedores para el mismo artículo.

Notas :También podemos usar la misma mesa para almacenar los ingredientes y artículos para simplificar los pedidos de restaurantes y proveedores. En tal caso, se requiere una autounión para identificar los ingredientes del artículo. Además, las columnas cocina y precio no son útiles para las filas de ingredientes.

Id La identificación única para identificar el artículo.
ID de usuario La identificación de usuario para identificar al administrador.
Id. del proveedor La identificación del proveedor para identificar al proveedor.
Título El título del elemento que se mostrará en el menú.
Babosa El slug único que se utilizará como GID del elemento.
Resumen El resumen para mencionar los aspectos más destacados.
Tipo El tipo para distinguir entre los diferentes tipos de elementos.
Cocina La bandera para identificar si se requiere cocinar para el artículo.
SKU La unidad de mantenimiento de existencias para realizar un seguimiento del inventario de artículos. Solo es obligatorio si el artículo no está asociado con ingredientes.
Precio El precio de venta de una unidad o de una sola porción.
Cantidad La cantidad disponible del artículo. Solo es obligatorio si el artículo no está asociado con ingredientes.
Unidad Las unidades de medida asignadas al artículo. Solo es obligatorio si el artículo no está asociado con ingredientes.
Receta Las instrucciones requeridas para cocinar el artículo.
Instrucciones Las instrucciones requeridas para entregar el artículo.
Creado en Almacena la fecha y hora en que se crea el elemento.
Actualizado en Almacena la fecha y hora en que se actualiza el ítem.
Contenido La columna utilizada para almacenar los detalles adicionales del artículo.

Similar a la Tabla de ingredientes, utiliza las columnas cantidad y unidad para rastrear el stock disponible en el inventario de artículos. La tabla de artículos con las restricciones apropiadas se muestra a continuación.

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;

La tabla de recetas se puede usar para rastrear la cantidad de ingredientes necesarios para un artículo para una sola porción. A continuación se menciona la descripción de todas las columnas de la tabla de recetas.

Id La identificación única para identificar la receta.
Id. del artículo El id del artículo para identificar el artículo.
Id. de ingrediente La identificación del ingrediente para identificar el ingrediente.
Cantidad La cantidad del ingrediente requerido para cocinar el artículo para una sola porción.
Unidad Las Unidades de Medida para identificar la cantidad de ingrediente necesaria para el artículo.
Instrucciones Las instrucciones de los ingredientes necesarios para cocinar el artículo.

La tabla de recetas con las restricciones apropiadas se muestra a continuación.

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;

A continuación se menciona la descripción de todas las columnas de la tabla de menú . La tabla de menús se puede utilizar para almacenar los múltiples menús de un mismo restaurante.

Id La identificación única para identificar el menú.
ID de usuario La identificación de usuario para identificar al administrador.
Título El título del menú que se mostrará en la tarjeta de menú.
Babosa El slug único que se usará como GID del menú.
Resumen El resumen para mencionar los aspectos más destacados de la carta del menú.
Tipo El tipo para distinguir entre los diferentes tipos de menú.
Creado en Almacena la fecha y hora en que se crea el elemento.
Actualizado en Almacena la fecha y hora en que se actualiza el ítem.
Contenido La columna utilizada para almacenar los detalles adicionales del menú.

La tabla de menú con las restricciones apropiadas se muestra a continuación.

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

La tabla de elementos del menú se puede utilizar para realizar un seguimiento de los elementos disponibles en la tarjeta de menú. A continuación se menciona la descripción de todas las columnas de la tabla de elementos del menú.

Id La identificación única para identificar el elemento del menú.
Id. de menú La identificación del menú para identificar el menú.
Id. del artículo El id del artículo para identificar el artículo.
Activo La bandera para verificar si el artículo está disponible.

La tabla de elementos del menú con las restricciones adecuadas se muestra a continuación.

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;

La mesa de Item Chef se puede usar para identificar al chef asignado para cocinar el artículo. A continuación se menciona la descripción de todas las columnas de la tabla Item Chef.

Id La identificación única para identificar el elemento del menú.
Id. del artículo El id del artículo para identificar el artículo.
Identificación del chef El id del chef para identificar al usuario.
Activo La bandera para verificar si el chef está disponible para cocinar el artículo.

La tabla Item Chef con las restricciones apropiadas se muestra a continuación.

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 y Mesas de Reserva

En esta sección diseñaremos el TableTop y Mesas de Reserva para almacenar las mesas del restaurante y sus detalles de reserva.

La Mesa TableTop se puede utilizar para almacenar los detalles de las mesas en el restaurante. El estado de la tabla puede ser Libre, Reservado y Activo. He usado TableTop en lugar de Table para distinguirlo de la palabra clave table de MySQL. A continuación se menciona la descripción de todas las columnas de TableTop Table.

Id La identificación única para identificar la tabla.
Código El código de la tabla.
Estado La calificación de revisión.
Capacidad La capacidad total de asientos de la Mesa.
Creado en Almacena la fecha y hora en que se crea la tabla.
Actualizado en Almacena la fecha y hora en que se actualiza la tabla.
Contenido La columna utilizada para almacenar los detalles adicionales de la tabla.

La mesa TableTop con las restricciones apropiadas se muestra a continuación.

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

Mesa de reserva se puede utilizar para reservar las mesas del restaurante ya sea en línea o en las instalaciones. Un usuario registrado o existente también se puede asociar con Booking. También asume que solo las mesas que tienen estado Libre pueden ser Reservadas. El estado de la mesa se puede cambiar a Reservado después de confirmar la reserva. Además, el estado de la mesa se puede configurar como Activo tan pronto como los invitados la ocupen. A continuación se menciona la descripción de todas las columnas de la tabla de reservas.

Notas :La Mesa de Reserva no cubre los pagos involucrados en la reserva de la mesa. Se puede actualizar aún más agregando columnas adicionales para manejar los pagos involucrados en la reserva de la mesa.

Id La identificación única para identificar la reserva.
Id. de tabla El id de la mesa para identificar la mesa asociada con la reserva.
ID de usuario El id de usuario para identificar al usuario registrado asociado a la reserva.
Símbolo El token único asociado con la reserva.
Estado El estado de la reserva puede ser Nuevo, Salón, Activo y Completo.
Nombre El nombre del huésped.
Segundo Nombre El segundo nombre del invitado.
Apellido El apellido del usuario.
Móvil El número de móvil del usuario.
Correo electrónico El correo electrónico del usuario.
Línea 1 La primera línea para almacenar la dirección.
Línea 2 La segunda línea para almacenar la dirección.
Ciudad La ciudad de la dirección.
Provincia La provincia de la dirección.
País El país de la dirección.
Creado en Almacena la fecha y hora en que se crea la reserva.
Actualizado en Almacena la fecha y hora en que se actualiza la reserva.
Contenido La columna utilizada para almacenar los detalles adicionales de la reserva.

La tabla de reservas con las restricciones apropiadas se muestra a continuación.

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;

La tabla de elementos de reserva es necesario para realizar un seguimiento de los artículos pedidos por el huésped. A continuación se menciona la descripción de todas las columnas de la tabla de elementos de reserva.

Id La identificación única para identificar el elemento de la reserva.
ID de reserva La identificación de la reserva para identificar la reserva asociada con el elemento de la reserva.
Id. del artículo El id del artículo para identificar el artículo asociado con el artículo de la reserva.
SKU El SKU del artículo al realizar el pedido.
Precio El precio de venta del artículo al realizar el pedido.
Descuento El descuento del artículo al realizar el pedido.
Cantidad La cantidad del artículo pedido por el usuario. Puede ser el multiplicador de la unidad del artículo o una sola porción.
Unidad Las Unidades de Medida al ordenar el Artículo.
Estado El estado para realizar un seguimiento del progreso del elemento. Puede ser Nuevo, Cocina, Cocinando, Cocido, Servido.
Creado en Almacena la fecha y hora en que se crea el elemento de reserva.
Actualizado en Almacena la fecha y hora en que se actualiza el artículo de la reserva.
Contenido La columna utilizada para almacenar los detalles adicionales del elemento de reserva.

La tabla de elementos de reserva con las restricciones adecuadas se muestra a continuación.

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;

Tabla de pedidos y tabla de artículos de pedido

En esta sección se proporcionan las tablas para gestionar los pedidos. Un usuario registrado también se puede asociar con el pedido. La tabla de pedidos se puede utilizar para almacenar las reservas completadas y los pedidos de proveedores. El estado de los pedidos del proveedor se puede configurar como nuevo al realizar el pedido y se puede configurar para que se complete después de recibir los artículos del proveedor. Además, el precio del artículo debe completarse manualmente después de recibir los artículos del proveedor. A continuación se menciona la descripción de todas las columnas de la tabla de pedidos.

Id La identificación única para identificar el pedido.
ID de usuario El ID de usuario para identificar al invitado asociado con el pedido.
Id. del proveedor La identificación del proveedor para identificar al proveedor asociado con el pedido.
Símbolo El token único asociado al pedido para relacionarlo con la reserva. El mismo token también se puede pasar a la pasarela de pago si es necesario.
Estado El estado del pedido puede ser Nuevo, Pago, Pagado, Fallido, Enviado, Entregado, Devuelto y Completo. El estado Enviado, Entregado y Devuelto se puede utilizar para los pedidos de proveedores.
Subtotal El precio total de los Artículos del Pedido.
Descuento de artículo El descuento total de los Artículos del Pedido.
Impuestos El impuesto sobre los Artículos del Pedido.
Envío Los gastos de envío de los Artículos del Pedido.
Total El precio total del Pedido, incluidos impuestos y gastos de envío. Excluye el descuento de artículos.
Promoción El código de promoción del Pedido.
Descuento El descuento total del Pedido basado en el código de promoción o descuento de la tienda.
Total general El total general del pedido que debe pagar el huésped al restaurante o el restaurante al proveedor.
Nombre El nombre del usuario.
Segundo Nombre El segundo nombre del usuario.
Apellido El apellido del usuario.
Móvil El número de móvil del usuario.
Correo electrónico El correo electrónico del usuario.
Línea 1 La primera línea para almacenar la dirección.
Línea 2 La segunda línea para almacenar la dirección.
Ciudad La ciudad de la dirección.
Provincia La provincia de la dirección.
País El país de la dirección.
Creado en Almacena la fecha y hora en que se crea el pedido.
Actualizado en Almacena la fecha y hora en que se actualiza el pedido.
Contenido La columna utilizada para almacenar los detalles adicionales del pedido.

La tabla de pedidos con las restricciones apropiadas se muestra a continuación.

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;

A continuación se menciona la descripción de todas las columnas de la tabla de artículos de pedido.

Id La identificación única para identificar el artículo pedido.
Id. del artículo La identificación del producto para identificar el artículo asociado con el artículo pedido.
Id. de pedido La identificación del pedido para identificar el pedido asociado con el artículo pedido.
SKU El SKU del artículo al realizar el pedido.
Precio El precio del artículo al realizar el pedido.
Descuento El descuento del artículo al realizar el pedido.
Cantidad La cantidad del artículo seleccionado por el usuario.
Unidad Las Unidades de Medida al ordenar el Artículo.
Creado en Almacena la fecha y hora en que se crea el artículo pedido.
Actualizado en Almacena la fecha y hora en que se actualiza el artículo pedido.
Contenido La columna utilizada para almacenar los detalles adicionales del artículo pedido.

La tabla de artículos de pedido con las restricciones adecuadas se muestra a continuación.

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;

Tabla de transacciones

También necesitamos una tabla de transacciones para rastrear los pagos de pedidos realizados por los invitados al restaurante y el restaurante a los proveedores para la contabilidad. También podemos usar la misma tabla para registrar las transacciones de crédito (invitados) y débito (proveedores). A continuación se menciona la descripción de todas las columnas de la tabla de transacciones.

Id La identificación única para identificar la transacción.
ID de usuario El ID de usuario para identificar al usuario asociado con la transacción.
Id. del proveedor La identificación del proveedor para identificar al proveedor asociado con la transacción.
Id. de pedido La identificación del pedido para identificar el pedido asociado con la transacción.
Código La identificación de pago proporcionada por la pasarela de pago.
Tipo El tipo de transacción del pedido puede ser Crédito o Débito.
Modo El modo de transacción del pedido puede ser Fuera de línea, Contra reembolso, Cheque, Borrador, Alámbrico y En línea.
Estado El estado de la transacción del pedido puede ser Nuevo, Cancelado, Fallido, Pendiente, Rechazado, Rechazado y Correcto.
Creado en Almacena la fecha y hora en que se crea la transacción del pedido.
Actualizado en Almacena la fecha y hora en que se actualiza la transacción del pedido.
Contenido La columna utilizada para almacenar los detalles adicionales de la transacción.

La tabla de transacciones con las restricciones apropiadas se muestra a continuación.

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.

Resumen

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.

Puede enviar sus comentarios para unirse a la discusión. You may also be interested in designing the database of the Blog, Online Shopping Cart, and Poll &Survey applications. El esquema completo de la base de datos también está disponible en GitHub.