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

Guía para diseñar una base de datos para el sistema de gestión de inventario en MySQL

Este tutorial proporciona los pasos completos para diseñar un esquema de base de datos del Sistema de gestión de inventario para administrar los proveedores, los vendedores, los artículos, las existencias de artículos, las órdenes de compra y las órdenes de los clientes.

Notas :Por lo general, las empresas minoristas y manufactureras emplean sistemas de inventario. Entre los casos de uso generalizados en otras industrias, este esquema de base de datos se puede utilizar, por ejemplo, para la gestión de inventario hospitalario para aumentar la eficiencia de las cadenas de suministro de atención médica y reducir el desperdicio de medicamentos.

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

Base de datos de gestión de inventario

También puede visitar los tutoriales populares que incluyen Cómo instalar MySQL 8 en Ubuntu 20.04 LTS, Cómo instalar MySQL 8 en Windows, Cómo instalar MySQL Workbench en Ubuntu, Cómo instalar MySQL 8 con Workbench en Windows 10, Base de datos RBAC en MySql, Blog Database en MySql, Quiz Database en MySQL, Poll &Survey Database en MySQL, Online Shopping Cart Database en MySQL y Learn Basic SQL Queries In MySQL.

Base de datos de inventario

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

CREATE SCHEMA `inventory` 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. Los usuarios pueden administrar sus propios perfiles. Además, los usuarios pueden utilizar la aplicación según los roles que se les asignen. También puede consultar el tutorial Base de datos RBAC en MySql para implementar un sistema RBAC completo para administrar roles y permisos. 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.
Id. de función El rol del usuario. Puede ser administrador, proveedor, vendedor y cliente.
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.
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 Una breve introducción del Usuario.
Perfil Detalles del usuario.

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

CREATE TABLE `inventory`.`user` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`roleId` SMALLINT NOT NULL,
`firstName` VARCHAR(50) NULL DEFAULT NULL,
`middleName` VARCHAR(50) NULL DEFAULT NULL,
`lastName` VARCHAR(50) NULL DEFAULT NULL,
`username` VARCHAR(50) NULL DEFAULT NULL,
`mobile` VARCHAR(15) NULL,
`email` VARCHAR(50) NULL,
`passwordHash` VARCHAR(32) NOT NULL,
`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_username` (`username` ASC),
UNIQUE INDEX `uq_mobile` (`mobile` ASC),
UNIQUE INDEX `uq_email` (`email` ASC) );

Tabla de productos

En esta sección, diseñaremos la Tabla de productos para almacenar los datos del producto. A continuación se menciona la descripción de todas las columnas de la Tabla de productos.

Id La identificación única para identificar el producto.
Título El título del producto que se mostrará en el Inventario.
Resumen El resumen para mencionar los aspectos más destacados.
Tipo El tipo para distinguir entre los diferentes tipos de productos.
Creado en Almacena la fecha y hora en que se crea el producto.
Actualizado en Almacena la fecha y hora en que se actualiza el producto.
Contenido La columna utilizada para almacenar los detalles adicionales del producto.

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

CREATE TABLE `inventory`.`product` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(75) 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`)
);

Meta de producto

La metatabla de productos se puede utilizar para almacenar información adicional sobre productos, incluida la URL del banner del producto, etc. A continuación se menciona la descripción de todas las columnas de la metatabla de productos.

Id La identificación única para identificar el meta del producto.
Identificación del producto La identificación del producto para identificar el producto principal.
Clave La clave que identifica el meta.
Contenido La columna utilizada para almacenar los metadatos del producto.

La metatabla de productos con las restricciones adecuadas se muestra a continuación.

CREATE TABLE `inventory`.`product_meta` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`productId` BIGINT NOT NULL,
`key` VARCHAR(50) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_meta_product` (`productId` ASC),
UNIQUE INDEX `uq_product_meta` (`productId` ASC, `key` ASC),
CONSTRAINT `fk_meta_product`
FOREIGN KEY (`productId`)
REFERENCES `inventory`.`product` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

Tabla de categorías y tabla de categorías de productos

En esta sección, diseñaremos la Tabla de categorías y Tabla de categorías de productos para almacenar las categorías de productos y sus asignaciones. A continuación se menciona la descripción de todas las columnas de la tabla de categorías.

Id La identificación única para identificar la categoría.
Id principal La identificación principal para identificar la categoría principal.
Título El título de la categoría.
Metatítulo El metatítulo que se usará para el título del navegador y SEO.
Babosa El slug de categoría para formar la URL.
Contenido La columna utilizada para almacenar los detalles de la categoría.

La tabla de categorías con las restricciones apropiadas se muestra a continuación.

CREATE TABLE `inventory`.`category` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`parentId` BIGINT NULL DEFAULT NULL,
`title` VARCHAR(75) NOT NULL,
`metaTitle` VARCHAR(100) NULL DEFAULT NULL,
`slug` VARCHAR(100) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`));

ALTER TABLE `inventory`.`category`
ADD INDEX `idx_category_parent` (`parentId` ASC);
ALTER TABLE `inventory`.`category`
ADD CONSTRAINT `fk_category_parent`
FOREIGN KEY (`parentId`)
REFERENCES `inventory`.`category` (`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 categorías de productos.

Id. de producto La identificación del producto para identificar el producto.
ID de categoría El ID de categoría para identificar la categoría.

La tabla de categorías de productos con las restricciones correspondientes se muestra a continuación.

CREATE TABLE `inventory`.`product_category` (
`productId` BIGINT NOT NULL,
`categoryId` BIGINT NOT NULL,
PRIMARY KEY (`productId`, `categoryId`),
INDEX `idx_pc_category` (`categoryId` ASC),
INDEX `idx_pc_product` (`productId` ASC),
CONSTRAINT `fk_pc_product`
FOREIGN KEY (`productId`)
REFERENCES `inventory`.`product` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_pc_category`
FOREIGN KEY (`categoryId`)
REFERENCES `inventory`.`category` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

Tabla de marcas

En esta sección diseñaremos la Tabla de Marcas para almacenar los datos de la marca. A continuación se menciona la descripción de todas las columnas de la tabla de marcas.

Id La identificación única para identificar la marca.
Título El título de la marca que se mostrará en el Inventario.
Resumen El resumen menciona los aspectos más destacados.
Creado en Almacena la fecha y hora en que se crea el producto.
Actualizado en Almacena la fecha y hora en que se actualiza el producto.
Contenido La columna utilizada para almacenar los detalles adicionales de la marca.

A continuación se muestra la tabla de marcas con las restricciones correspondientes.

CREATE TABLE `inventory`.`brand` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(75) NOT NULL,
`summary` TINYTEXT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`)
);

Tabla de pedidos Tabla

Esta sección proporciona la tabla para administrar las órdenes de inventario. El pedido se puede asociar con el Proveedor o el Cliente. 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 Proveedor o Cliente asociado al pedido.
Tipo El tipo de orden para distinguir entre Orden de Compra u Orden de Cliente.
Estado El estado del pedido puede ser Nuevo, Finalizado, Pagado, Fallido, Enviado, Entregado, Devuelto y Completo.
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 a pagar por el comprador.
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 `inventory`.`order` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`type` SMALLINT(6) NOT NULL DEFAULT 0,
`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,
`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 `inventory`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

Tabla de direcciones

En esta sección se proporciona la tabla para gestionar la dirección del usuario o del pedido. La dirección de usuario se puede utilizar para almacenar la dirección asociada con el usuario. La dirección del pedido se puede utilizar para almacenar la dirección de entrega de los pedidos de entrega a domicilio. A continuación se menciona la descripción de todas las columnas de la tabla de direcciones.

Id La identificación única para identificar la dirección.
ID de usuario El ID de usuario para identificar al usuario asociado con la dirección.
Id. de pedido El ID del pedido para identificar el pedido asociado con la dirección.
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.

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

CREATE TABLE `inventory`.`address` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NULL DEFAULT NULL,
`orderId` BIGINT NULL DEFAULT NULL,
`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,
PRIMARY KEY (`id`),
INDEX `idx_address_user` (`userId` ASC),
CONSTRAINT `fk_address_user`
FOREIGN KEY (`userId`)
REFERENCES `inventory`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

ALTER TABLE `inventory`.`address`
ADD INDEX `idx_address_order` (`orderId` ASC);
ALTER TABLE `inventory`.`address`
ADD CONSTRAINT `fk_address_order`
FOREIGN KEY (`orderId`)
REFERENCES `inventory`.`order` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Tabla de elementos

En esta sección, diseñaremos el Artículo Mesa para almacenar los detalles del artículo. El artículo representa los artículos almacenados en el inventario y comprados a los proveedores. A continuación se menciona la descripción de todas las columnas de la tabla de artículos.

Id La identificación única para identificar el artículo.
Identificación del producto La identificación del producto para identificar el producto asociado con el artículo del inventario.
Id. de marca La identificación de la marca para identificar la marca asociada con el artículo del inventario.
Id del proveedor La identificación del proveedor para identificar al proveedor asociado con el artículo del inventario.
Id. de pedido La identificación del pedido para identificar el pedido asociado con el artículo del inventario.
Creado por La identificación de usuario para identificar al usuario que agregó el elemento de inventario.
Actualizado por La identificación de usuario para identificar al usuario que actualizó el elemento del inventario.
Unidad de mantenimiento de existencias El id para identificar el artículo en stock.
Precio de venta máximo El precio impreso del producto asociado con el artículo.
Descuento El descuento lo da el proveedor.
Precio El precio al que se compró el producto.
Cantidad La cantidad total recibida en el inventario.
Vendido La cantidad total vendida a los clientes.
Disponible La cantidad que está disponible en stock.
Defectuoso El total de artículos defectuosos recibidos en el inventario o devueltos por los clientes.
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.

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

CREATE TABLE `inventory`.`item` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`productId` BIGINT NOT NULL,
`brandId` BIGINT NOT NULL,
`supplierId` BIGINT NOT NULL,
`orderId` BIGINT NOT NULL,
`sku` VARCHAR(100) NOT NULL,
`mrp` FLOAT NOT NULL DEFAULT 0,
`discount` FLOAT NOT NULL DEFAULT 0,
`price` FLOAT NOT NULL DEFAULT 0,
`quantity` SMALLINT(6) NOT NULL DEFAULT 0,
`sold` SMALLINT(6) NOT NULL DEFAULT 0,
`available` SMALLINT(6) NOT NULL DEFAULT 0,
`defective` SMALLINT(6) NOT NULL DEFAULT 0,
`createdBy` BIGINT NOT NULL,
`updatedBy` BIGINT DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_item_product` (`productId` ASC),
CONSTRAINT `fk_item_product`
FOREIGN KEY (`productId`)
REFERENCES `inventory`.`product` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

ALTER TABLE `inventory`.`item`
ADD INDEX `idx_item_brand` (`brandId` ASC);
ALTER TABLE `inventory`.`item`
ADD CONSTRAINT `fk_item_brand`
FOREIGN KEY (`brandId`)
REFERENCES `inventory`.`brand` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

ALTER TABLE `inventory`.`item`
ADD INDEX `idx_item_user` (`supplierId` ASC);
ALTER TABLE `inventory`.`item`
ADD CONSTRAINT `fk_item_user`
FOREIGN KEY (`supplierId`)
REFERENCES `inventory`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

ALTER TABLE `inventory`.`item`
ADD INDEX `idx_item_order` (`orderId` ASC);
ALTER TABLE `inventory`.`item`
ADD CONSTRAINT `fk_item_order`
FOREIGN KEY (`orderId`)
REFERENCES `inventory`.`order` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Tabla de artículos de pedido

Esta sección proporciona la tabla para administrar los artículos de pedido comprados por los clientes. 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.
Identificación del producto La identificación del producto para identificar el producto asociado con el artículo pedido.
Id. del artículo El id del artículo 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 producto al comprarlo.
Precio El precio del producto al comprarlo.
Descuento El descuento del producto al comprarlo.
Cantidad La cantidad del producto seleccionado por el usuario.
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 `inventory`.`order_item` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`productId` BIGINT NOT NULL,
`itemId` BIGINT NOT NULL,
`orderId` BIGINT NOT NULL,
`sku` VARCHAR(100) NOT NULL,
`price` FLOAT NOT NULL DEFAULT 0,
`discount` FLOAT NOT NULL DEFAULT 0,
`quantity` 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_product` (`productId` ASC),
CONSTRAINT `fk_order_item_product`
FOREIGN KEY (`productId`)
REFERENCES `inventory`.`product` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

ALTER TABLE `inventory`.`order_item`
ADD INDEX `idx_order_item_item` (`itemId` ASC);
ALTER TABLE `inventory`.`order_item`
ADD CONSTRAINT `fk_order_item_item`
FOREIGN KEY (`itemId`)
REFERENCES `inventory`.`item` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

ALTER TABLE `inventory`.`order_item`
ADD INDEX `idx_order_item_order` (`orderId` ASC);
ALTER TABLE `inventory`.`order_item`
ADD CONSTRAINT `fk_order_item_order`
FOREIGN KEY (`orderId`)
REFERENCES `inventory`.`order` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Tabla de transacciones

También necesitamos una tabla de transacciones para realizar un seguimiento de los pagos de pedidos realizados por el comprador y para la contabilidad. También podemos utilizar la misma tabla para registrar la devolución parcial o total del pedido. 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. 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 `inventory`.`transaction` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` 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 `inventory`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

ALTER TABLE `inventory`.`transaction`
ADD INDEX `idx_transaction_order` (`orderId` ASC);
ALTER TABLE `inventory`.`transaction`
ADD CONSTRAINT `fk_transaction_order`
FOREIGN KEY (`orderId`)
REFERENCES `inventory`.`order` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Resumen

En este tutorial, hemos discutido el diseño de la base de datos de un Sistema de gestión de inventario para almacenar los usuarios y administrar el inventario de productos. También proporcionó el diseño de la base de datos para gestionar las órdenes de compra y los pedidos de los clientes.

Puede enviar sus comentarios para unirse a la discusión. También te puede interesar diseñar la base de datos de las aplicaciones Blog y Poll &Survey. El esquema completo de la base de datos también está disponible en GitHub.