Skip to content

GitLab

  • Menu
Projects Groups Snippets
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in
  • Wiki Wiki
  • Project information
    • Project information
    • Activity
    • Labels
    • Planning hierarchy
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 52
    • Issues 52
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Monitor
    • Monitor
    • Incidents
  • Packages & Registries
    • Packages & Registries
    • Package Registry
    • Infrastructure Registry
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • CP - Planta
  • WikiWiki
  • Wiki
  • banco_dados

Last edited by André Sacilotto Santos Dec 01, 2024
Page history

banco_dados

Home Escopo Processo Design/Mockups Gerência Estudos Arquitetura Contratos BD Qualidade Configuração Instalação Instruções Utilização Analytics Infraestrutura Dicas

Banco de Dados

Descrição

Nesta seção, detalhamos os processos de modelagem, organização e implementação do banco de dados, utilizando o PostgreSQL como sistema gerenciador. Serão apresentados os esquemas conceitual e lógico, além das práticas adotadas para garantir a integridade e eficiência da estrutura de dados. A documentação oferece uma visão clara das tabelas, relações, regras de negócio e as decisões de implementação que sustentam os requisitos da aplicação.

Sumário

  • Modelagem
    • Esquema Conceitual
    • Esquema Lógico
    • Implementação

Observação: Consulte a seção Persistência no menu Qualidade para mais detalhes sobre design patterns.

Modelagem

Esquema Conceitual

O esquema conceitual apresentado define as principais entidades do sistema e suas inter-relações, oferecendo uma visão abstrata e fundamental para a modelagem do banco de dados. Neste esquema, destacam-se as seguintes entidades e relacionamentos:

Categoria e Matéria-Prima: Uma categoria pode conter várias matérias-primas, formando uma relação de um para muitos, que ajuda na organização das matérias-primas conforme suas características.

Matéria-Prima, Lote e Local: Uma matéria-prima está associada a lotes que representam quantidades específicas dessa matéria, com informações como número, quantidade inicial, quantidade atual, data de entrada e fornecedor. Cada lote é armazenado em um local específico, o que facilita o controle logístico e o armazenamento.

Composição e Receita: Uma matéria-prima pode ser utilizada em várias composições que, por sua vez, fazem parte das receitas para a produção de produtos finais. Uma receita define as etapas necessárias para a produção, sendo composta por múltiplas etapas.

Produto Final e Receita: Cada produto final possui uma receita que define os componentes e processos necessários para sua produção. A receita é composta por etapas específicas, e cada etapa detalha o processo, incluindo a máquina a ser utilizada.

Ordem de Produção: A entidade Ordem representa a solicitação de produção de um produto, com atributos como status, número, data da ordem e quantidade esperada. As ordens são usadas para coordenar a produção de produtos finais de acordo com as receitas definidas.

Etapas e Execução: Cada etapa da receita é executada por uma ordem de produção, garantindo que as etapas sejam realizadas na sequência correta para fabricar o produto final. Durante a execução, ocorrem Ocorrências, que registram eventos específicos, como desvios ou problemas, com descrições detalhadas e datas.

Produto Produzido: A entidade Produto Produzido representa o resultado da execução das ordens, armazenando informações sobre o número e a quantidade dos produtos fabricados.

Este esquema conceitual não apenas define claramente as entidades envolvidas na produção, mas também as relações entre elas, como a composição dos produtos, a organização das matérias-primas, e o controle das etapas de fabricação. Isso proporciona diretrizes fundamentais para a implementação do banco de dados, garantindo que todas as fases do processo produtivo sejam bem representadas e que os dados possam ser gerenciados de maneira eficiente.

BD_CONCEITUAL

Esquema Lógico

O esquema lógico traduz o modelo conceitual em uma estrutura mais próxima da implementação no PostgreSQL. Ele detalha as tabelas, colunas, tipos de dados, e define as chaves primárias e estrangeiras. Também são especificadas as convenções de nomeação das foreign keys e a adição de colunas automáticas como createdAt e updatedAt, que auxiliam no controle de versões dos registros.

Essas definições são essenciais para garantir a integridade referencial e proporcionar flexibilidade na manipulação de dados. O esquema lógico assegura que o mapeamento das entidades conceituais para o modelo relacional respeite todas as relações e restrições no nível físico do banco de dados.

ERD

Implementação

A implementação do banco de dados no PostgreSQL segue as diretrizes definidas pelos esquemas conceitual e lógico, assegurando que a estrutura planejada seja fielmente refletida no ambiente de execução. As instruções SQL para criação de tabelas, chaves primárias, estrangeiras e índices são elaboradas para otimizar o desempenho e garantir a escalabilidade do banco de dados.

Abaixo segue um exemplo de implementação da criação de tabelas utilizando PostgreSQL:

-- CreateEnum
CREATE TYPE "Production_Status" AS ENUM ('CREATED', 'SCHEDULED', 'OPEN', 'IN_PROGRESS', 'FINISHED', 'STOPPED', 'CANCELED');

-- CreateEnum
CREATE TYPE "Stock_Moviment" AS ENUM ('INPUT', 'TRANSIT', 'OUTPUT');

-- CreateEnum
CREATE TYPE "Price_Type" AS ENUM ('COST', 'SALE');

-- CreateEnum
CREATE TYPE "Origin" AS ENUM ('RAW_MATERIAL', 'MADE');

-- CreateEnum
CREATE TYPE "Unit_Measure" AS ENUM ('UN', 'KG', 'L', 'GR', 'ML', 'PC');

-- CreateEnum
CREATE TYPE "Gender" AS ENUM ('MALE', 'FEMALE', 'OTHER');

-- CreateEnum
CREATE TYPE "UserType" AS ENUM ('ERP', 'PUBLIC', 'API', 'SYSTEM', 'ANONYMOUS', 'ROOT', 'ADMIN');

-- CreateEnum
CREATE TYPE "PersonType" AS ENUM ('CUSTOMER', 'SUPPLIER');

-----------------------------------------------------
-- Table production
-----------------------------------------------------
CREATE TABLE "production" (
    "id" SERIAL NOT NULL,
    "description" VARCHAR(255) NOT NULL,
    "prodution_quantity_estimated" DOUBLE PRECISION NOT NULL,
    "production_quantity_real" DOUBLE PRECISION NOT NULL,
    "lote" TEXT,
    "expiration" TIMESTAMP(3),
    "created_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updated_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "Production_Status" "Production_Status" NOT NULL DEFAULT 'CREATED',
    "final_product" INTEGER NOT NULL,

    CONSTRAINT "production_pkey" PRIMARY KEY ("id")
);

-----------------------------------------------------
-- Table Production Work
-----------------------------------------------------
CREATE TABLE "production_work" (
    "id" SERIAL NOT NULL,
    "production_id" INTEGER NOT NULL,
    "step_id" INTEGER NOT NULL,
    "raw_product_id" INTEGER NOT NULL,
    "sequence" INTEGER NOT NULL,
    "start_time" TIMESTAMP(3) NOT NULL,
    "end_time" TIMESTAMP(3) NOT NULL,
    "total_time" DOUBLE PRECISION NOT NULL,
    "initial_weight" DOUBLE PRECISION NOT NULL,
    "final_weight" DOUBLE PRECISION NOT NULL,
    "weight_loss" DOUBLE PRECISION NOT NULL,
    "machine" TEXT,
    "photos" BYTEA[],
    "observation" TEXT,
    "ocurrences" JSON,
    "created_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updated_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT "production_work_pkey" PRIMARY KEY ("id")
);

-----------------------------------------------------
-- Table Production Steps
-----------------------------------------------------
CREATE TABLE "production_steps" (
    "id" SERIAL NOT NULL,
    "description" VARCHAR(255) NOT NULL,
    "created_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updated_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT "production_steps_pkey" PRIMARY KEY ("id")
);

-----------------------------------------------------
-- Table Ocurrences
-----------------------------------------------------
CREATE TABLE "ocurrences" (
    "id" SERIAL NOT NULL,
    "description" VARCHAR(255) NOT NULL,
    "created_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updated_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT "ocurrences_pkey" PRIMARY KEY ("id")
);

-----------------------------------------------------
-- Table Stock
-----------------------------------------------------
CREATE TABLE "stock" (
    "id" SERIAL NOT NULL,
    "document_number" VARCHAR(255) NOT NULL,
    "document_date" TIMESTAMP(6) NOT NULL,
    "stock_moviment" "Stock_Moviment" NOT NULL,
    "created_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updated_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT "stock_pkey" PRIMARY KEY ("id")
);

-----------------------------------------------------
-- Table Stock Items
-----------------------------------------------------
CREATE TABLE "stock_items" (
    "id" SERIAL NOT NULL,
    "stock_id" INTEGER NOT NULL,
    "sequence" INTEGER NOT NULL,
    "product_id" INTEGER NOT NULL,
    "quantity" DOUBLE PRECISION NOT NULL,
    "unit_price" DOUBLE PRECISION NOT NULL,
    "total_price" DOUBLE PRECISION NOT NULL,
    "lote" TEXT,
    "expiration" TIMESTAMP(3),
    "suppliers" INTEGER,
    "costumers" INTEGER,
    "stock_location_id" INTEGER NOT NULL,
    "observation" TEXT,
    "created_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updated_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT "stock_items_pkey" PRIMARY KEY ("id")
);

-----------------------------------------------------
-- Table Stock Location
-----------------------------------------------------
CREATE TABLE "stock_location" (
    "id" SERIAL NOT NULL,
    "description" VARCHAR(255) NOT NULL,
    "active" BOOLEAN NOT NULL DEFAULT true,
    "created_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updated_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT "stock_location_pkey" PRIMARY KEY ("id")
);

-----------------------------------------------------
-- Table Products
-----------------------------------------------------
CREATE TABLE "products" (
    "id" SERIAL NOT NULL,
    "description" VARCHAR(255) NOT NULL,
    "code" VARCHAR(255) NOT NULL,
    "sku" VARCHAR(255) NOT NULL,
    "origin" "Origin" NOT NULL DEFAULT 'RAW_MATERIAL',
    "unit_measure" "Unit_Measure" NOT NULL DEFAULT 'UN',
    "category_id" INTEGER NOT NULL,
    "group_id" INTEGER NOT NULL,
    "supplier_id" INTEGER,
    "nutritional_info" TEXT,
    "active" BOOLEAN NOT NULL DEFAULT true,
    "created_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updated_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT "products_pkey" PRIMARY KEY ("id")
);

-----------------------------------------------------
-- Table Compositions
-----------------------------------------------------
CREATE TABLE "compositions" (
    "id" SERIAL NOT NULL,
    "product_id" INTEGER NOT NULL,
    "description" VARCHAR(255) NOT NULL,
    "created_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updated_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "production_steps" JSON,

    CONSTRAINT "compositions_pkey" PRIMARY KEY ("id")
);

-----------------------------------------------------
-- Table Composition Items
-----------------------------------------------------
CREATE TABLE "composition_items" (
    "id" SERIAL NOT NULL,
    "composition_id" INTEGER NOT NULL,
    "sequence" INTEGER NOT NULL,
    "product_id" INTEGER NOT NULL,
    "quantity" DOUBLE PRECISION NOT NULL,
    "created_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updated_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT "composition_items_pkey" PRIMARY KEY ("id")
);

-----------------------------------------------------
-- Table Prices
-----------------------------------------------------
CREATE TABLE "prices" (
    "id" SERIAL NOT NULL,
    "product_id" INTEGER NOT NULL,
    "price" DOUBLE PRECISION NOT NULL,
    "type" "Price_Type" NOT NULL,
    "is_current" BOOLEAN NOT NULL DEFAULT true,
    "created_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updated_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT "prices_pkey" PRIMARY KEY ("id")
);

-----------------------------------------------------
-- Table Persons
-----------------------------------------------------
CREATE TABLE "persons" (
    "id" SERIAL NOT NULL,
    "name" VARCHAR(255) NOT NULL,
    "type" "PersonType" NOT NULL,
    "created_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updated_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT "suppliers_pkey" PRIMARY KEY ("id")
);

-----------------------------------------------------
-- Table Groups
-----------------------------------------------------
CREATE TABLE "groups" (
    "id" SERIAL NOT NULL,
    "description" VARCHAR(255) NOT NULL,
    "father_id" INTEGER,
    "created_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updated_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT "groups_pkey" PRIMARY KEY ("id")
);

-----------------------------------------------------
-- Table Categories
-----------------------------------------------------
CREATE TABLE "categories" (
    "id" SERIAL NOT NULL,
    "description" VARCHAR(255) NOT NULL,
    "active" BOOLEAN NOT NULL DEFAULT true,
    "created_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updated_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT "categories_pkey" PRIMARY KEY ("id")
);

-----------------------------------------------------
-- Table Users
-----------------------------------------------------
CREATE TABLE "users" (
    "id" SERIAL NOT NULL,
    "username" VARCHAR(255) NOT NULL,
    "email" VARCHAR(255) NOT NULL,
    "password" VARCHAR(255) NOT NULL,
    "first_name" VARCHAR(255),
    "last_name" VARCHAR(255),
    "user_type" "UserType" NOT NULL DEFAULT 'PUBLIC',
    "gender" "Gender" NOT NULL,
    "active" BOOLEAN NOT NULL DEFAULT true,
    "created_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updated_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT "users_pkey" PRIMARY KEY ("id")
);

-- CreateIndex
CREATE UNIQUE INDEX "products_code_key" ON "products"("code");

-- CreateIndex
CREATE UNIQUE INDEX "products_sku_key" ON "products"("sku");

-- CreateIndex
CREATE UNIQUE INDEX "categories_description_key" ON "categories"("description");

-- CreateIndex
CREATE UNIQUE INDEX "users_username_key" ON "users"("username");

-- CreateIndex
CREATE UNIQUE INDEX "users_email_key" ON "users"("email");

-- CreateIndex
CREATE UNIQUE INDEX "_production_item_AB_unique" ON "_production_item"("A", "B");

-- CreateIndex
CREATE INDEX "_production_item_B_index" ON "_production_item"("B");

-- AddForeignKey
ALTER TABLE "production" ADD CONSTRAINT "final_product_fkey" FOREIGN KEY ("final_product") REFERENCES "products"("id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "production_work" ADD CONSTRAINT "production_work_production_id_fkey" FOREIGN KEY ("production_id") REFERENCES "production"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "production_work" ADD CONSTRAINT "production_work_raw_product_id_fkey" FOREIGN KEY ("raw_product_id") REFERENCES "products"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "production_work" ADD CONSTRAINT "production_work_step_id_fkey" FOREIGN KEY ("step_id") REFERENCES "production_steps"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "stock_items" ADD CONSTRAINT "stock_items_costumers_fkey" FOREIGN KEY ("costumers") REFERENCES "customers"("id") ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "stock_items" ADD CONSTRAINT "stock_items_product_id_fkey" FOREIGN KEY ("product_id") REFERENCES "products"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "stock_items" ADD CONSTRAINT "stock_items_stock_id_fkey" FOREIGN KEY ("stock_id") REFERENCES "stock"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "stock_items" ADD CONSTRAINT "stock_items_stock_location_id_fkey" FOREIGN KEY ("stock_location_id") REFERENCES "stock_location"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "stock_items" ADD CONSTRAINT "stock_items_suppliers_fkey" FOREIGN KEY ("suppliers") REFERENCES "suppliers"("id") ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "products" ADD CONSTRAINT "products_category_id_fkey" FOREIGN KEY ("category_id") REFERENCES "categories"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "products" ADD CONSTRAINT "products_group_id_fkey" FOREIGN KEY ("group_id") REFERENCES "groups"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "products" ADD CONSTRAINT "products_supplier_id_fkey" FOREIGN KEY ("supplier_id") REFERENCES "suppliers"("id") ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "compositions" ADD CONSTRAINT "compositions_product_id_fkey" FOREIGN KEY ("product_id") REFERENCES "products"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "composition_items" ADD CONSTRAINT "composition_items_composition_id_fkey" FOREIGN KEY ("composition_id") REFERENCES "compositions"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "composition_items" ADD CONSTRAINT "composition_items_product_id_fkey" FOREIGN KEY ("product_id") REFERENCES "products"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "prices" ADD CONSTRAINT "prices_product_id_fkey" FOREIGN KEY ("product_id") REFERENCES "products"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "groups" ADD CONSTRAINT "groups_father_id_fkey" FOREIGN KEY ("father_id") REFERENCES "groups"("id") ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "_production_item" ADD CONSTRAINT "_production_item_A_fkey" FOREIGN KEY ("A") REFERENCES "production"("id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "_production_item" ADD CONSTRAINT "_production_item_B_fkey" FOREIGN KEY ("B") REFERENCES "products"("id") ON DELETE CASCADE ON UPDATE CASCADE;

                                                                                                         Topo

Clone repository
  • Infraestrutura
  • Utilizando a wiki
    • adicionando imagens
    • escrevendo em markdown
    • wiki no editor de texto
  • analytics
  • arquitetura
  • backend_categories
  • backend_inicio
  • backend_persons
  • backend_production_order
  • backend_products
  • backend_qualidade
  • backend_settings
  • backend_stock
  • backend_stock_locations
View All Pages