|
|
|
| [Home](home) | [**Escopo**](escopo) | [Processo](processo) | [Design/Mockups](design_mockups) | [Gerência](gerencia) | [Estudos](estudos) | [Arquitetura](arquitetura) | [Contratos](contratos) | [BD](banco_dados) | [Qualidade](qualidade) | [Configuração](configuracao) | [Instalação](instalacao) | [Instruções](instrucoes) | [Utilização](utilizacao) | [Analytics](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
|
|
|
|
|
|
|
|
- [Modelagem](#modelagem)
|
|
|
|
- [Esquema Conceitual](#esquema-conceitual)
|
|
|
|
- [Esquema Lógico](#esquema-lógico)
|
|
|
|
- [Implementação](#implementação)
|
|
|
|
|
|
|
|
> **Observação:** Consulte a seção *Persistência* no menu [Qualidade](qualidade#persistência-de-dados) 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.
|
|
|
|
|
|
|
|
![BD_CONCEITUAL](resources/images/bd/modelo_conceitual.png)
|
|
|
|
|
|
|
|
### 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](resources/images/bd/ERD.svg)
|
|
|
|
|
|
|
|
### 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:
|
|
|
|
|
|
|
|
```sql
|
|
|
|
-- 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**](#banco-de-dados) |
|
|
|
\ No newline at end of file |