Home | Escopo | Processo | Design/Mockups | Gerência | Estudos | Arquitetura | Contratos | BD | Qualidade | Configuração | Instalação | Instruções | Utilização | Analytics |
---|
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
Observação: Consulte a seção Persistência no menu Qualidade para mais detalhes sobre design patterns.
Modelagem
Esquema Conceitual
O esquema conceitual serve como base para identificar as principais entidades do sistema e as relações entre elas, oferecendo uma visão abstrata do banco de dados. Um exemplo claro dessa modelagem é a relação entre as entidades Course e Degree, onde um curso pode estar associado a um ou mais diplomas, definindo um relacionamento crucial para as regras de negócio.
Outro aspecto relevante é a relação entre estudantes e professores, que mostra que um estudante pode estar associado a vários professores, ou mesmo a nenhum. O conceito do h_index, exclusivo aos professores, é refletido nesse modelo, justificando a especialização da entidade User em Student e Professor, respeitando as particularidades de cada tipo de usuário.
O esquema conceitual não apenas define as entidades e suas relações, mas também orienta a implementação futura, oferecendo diretrizes claras para o desenvolvimento e organização do banco de dados.
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.
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;