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

Guia para projetar banco de dados para sistema de gerenciamento de estoque no MySQL


Este tutorial fornece as etapas completas para projetar um esquema de banco de dados do Sistema de Gerenciamento de Estoque para gerenciar os fornecedores, vendedores, itens, estoque de itens, pedidos de compra e pedidos de clientes.



Observações :Comumente, as empresas de varejo e manufatura empregam sistemas de estoque. Entre os casos de uso generalizados em outros setores, esse esquema de banco de dados pode ser usado, por exemplo, para gerenciamento de inventário hospitalar para aumentar a eficiência das cadeias de suprimentos de saúde e reduzir o desperdício de medicamentos.



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



Banco de dados de gerenciamento de estoque



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


Banco de dados de inventário




O primeiro passo é criar o Banco de Dados de Inventário. Ele pode ser criado usando a consulta conforme mostrado abaixo.


CREATE SCHEMA `inventory` 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. Os usuários podem gerenciar seus próprios perfis. Além disso, os usuários podem usar o aplicativo de acordo com as funções atribuídas a eles. Você também pode consultar o tutorial RBAC Database no MySql para implementar um sistema RBAC completo para gerenciar funções e permissões. Abaixo está a descrição de todas as colunas da Tabela de Usuários.


ID O ID exclusivo para identificar o usuário.
ID da função A função do usuário. Pode ser Administrador, Fornecedor, Vendedor e Cliente.
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.
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 Uma breve introdução do usuário.
Perfil Detalhes do usuário.



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


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


Tabela de produtos




Nesta seção, projetaremos a Tabela de produtos para armazenar os dados do produto. Abaixo está a descrição de todas as colunas da Tabela de Produtos.


ID O ID exclusivo para identificar o produto.
Título O título do produto a ser exibido no inventário.
Resumo O resumo para mencionar os principais destaques.
Tipo O tipo para distinguir entre os diferentes tipos de produtos.
Criado em Ele armazena a data e hora em que o produto foi criado.
Atualizado em Ele armazena a data e hora em que o produto é atualizado.
Conteúdo A coluna usada para armazenar os detalhes adicionais do produto.



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


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 do Produto




A Meta Tabela do Produto pode ser usada para armazenar informações adicionais sobre os produtos, incluindo o URL do banner do produto, etc. Abaixo está a descrição de todas as colunas da Meta Tabela do Produto.


ID O ID exclusivo para identificar a meta do produto.
ID do produto O ID do produto para identificar o produto pai.
Chave A chave que identifica o meta.
Conteúdo A coluna usada para armazenar os metadados do produto.



A Tabela Meta do Produto com as restrições apropriadas é mostrada abaixo.


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;


Tabela de categorias e Tabela de categorias de produtos




Nesta seção, projetaremos a Tabela de categorias e Tabela de categorias de produtos para armazenar as categorias de produtos e seus mapeamentos. Abaixo está a descrição de todas as colunas da Tabela de Categorias.


ID O ID exclusivo para identificar a categoria.
ID pai O ID pai para identificar a categoria pai.
Título O título da categoria.
Metatítulo O meta-título a ser usado para o título do navegador e SEO.
Slug O slug de categoria para formar o URL.
Conteúdo A coluna usada para armazenar os detalhes da categoria.



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


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;



Abaixo está a descrição de todas as colunas da Tabela de Categoria de Produto.


ID do produto O ID do produto para identificar o produto.
ID da categoria O ID da categoria para identificar a categoria.



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


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




Tabela de marcas




Nesta seção, projetaremos a Tabela de marcas para armazenar os dados da marca. Abaixo está a descrição de todas as colunas da Tabela de Marcas.


ID O ID exclusivo para identificar a marca.
Título O título da marca a ser exibido no inventário.
Resumo O resumo menciona os principais destaques.
Criado em Ele armazena a data e hora em que o produto foi criado.
Atualizado em Ele armazena a data e hora em que o produto é atualizado.
Conteúdo A coluna usada para armazenar os detalhes adicionais da marca.



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


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


Tabela da tabela de pedidos




Esta seção fornece a tabela para gerenciar os pedidos de estoque. O pedido pode ser associado ao Fornecedor ou ao Cliente. 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 Fornecedor ou Cliente associado ao pedido.
Tipo O tipo de pedido para distinguir entre Pedido de Compra ou Pedido do Cliente.
Estado O status do pedido pode ser Novo, Finalizado, Pago, Reprovado, Enviado, Entregue, Devolvido e Concluído.
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 comprador.
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 `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);


Tabela de endereços




Esta seção fornece a tabela para gerenciar o endereço do usuário ou do pedido. O endereço do usuário pode ser usado para armazenar o endereço associado ao usuário. O endereço do pedido pode ser usado para armazenar o endereço de entrega dos pedidos de entrega em domicílio. Abaixo está a descrição de todas as colunas da Tabela de Endereços.


ID O ID exclusivo para identificar o endereço.
ID de usuário O ID do usuário para identificar o usuário associado ao endereço.
ID do pedido O ID do pedido para identificar o pedido associado ao endereço.
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.



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


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;


Tabela de itens




Nesta seção, projetaremos o Item Tabela para armazenar os detalhes do item. O Item representa os itens estocados no estoque e adquiridos dos fornecedores. Abaixo está a descrição de todas as colunas da Tabela de Itens.


ID O ID exclusivo para identificar o item.
ID do produto O ID do produto para identificar o produto associado ao item de inventário.
ID da marca O ID da marca para identificar a marca associada ao item de inventário.
ID do fornecedor O ID do fornecedor para identificar o fornecedor associado ao item de inventário.
ID do pedido O ID do pedido para identificar o pedido associado ao item de inventário.
Criado por O ID do usuário para identificar o usuário que adicionou o item de inventário.
Atualizado por O ID do usuário para identificar o usuário que atualizou o item de inventário.
Unidade de manutenção de estoque O id para identificar o item em estoque.
Preço Máximo de Varejo O preço impresso do produto associado ao item.
Desconto O desconto é dado pelo fornecedor.
Preço O preço pelo qual o produto foi comprado.
Quantidade A quantidade total recebida no inventário.
Vendido A quantidade total vendida aos clientes.
Disponível A quantidade disponível no estoque.
Defeito O total de itens defeituosos recebidos no estoque ou devolvidos pelos clientes.
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.



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


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;


Tabela de itens do pedido




Esta seção fornece a tabela para gerenciar os itens do pedido adquiridos pelos clientes. 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 produto O ID do produto para identificar o produto associado ao item solicitado.
ID do item O ID do item para identificar o item associado ao item solicitado.
ID do pedido O ID do pedido para identificar o pedido associado ao item solicitado.
SKU O SKU do produto ao comprá-lo.
Preço O preço do produto ao comprá-lo.
Desconto O desconto do produto ao comprá-lo.
Quantidade A quantidade do produto selecionada pelo usuário.
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 `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;


Tabela de transações




Também precisamos de uma tabela de transações para acompanhar os pagamentos de pedidos feitos pelo comprador e para escrituração. Também podemos usar a mesma tabela para registrar o reembolso parcial ou total do pedido. 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 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 `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;


Resumo




Neste tutorial, discutimos o design do banco de dados de um Sistema de Gerenciamento de Inventário para armazenar os usuários e gerenciar o inventário de produtos. Também forneceu o design do banco de dados para gerenciar os pedidos de compra e os pedidos dos clientes.



Você pode enviar seus comentários para participar da discussão. Você também pode estar interessado em projetar o banco de dados dos aplicativos Blog e Poll &Survey. O esquema completo do banco de dados também está disponível no GitHub.