Database Management Systems: A Complete Guide Help

Mapeamento de Restrições ER para Relacional

Visão Geral

RestriçõesIntegridadeNegócioEstruturaisEntidadeReferencialDomínioCheckTriggerStored ProcedureUniqueNot NullDefault

Tipos de Restrições

1. Restrições de Chave

PRODUTOstringcodigoPKstringnomeUKstringskuUKdecimalpreco

Implementação

CREATE TABLE Produto ( codigo VARCHAR(20) PRIMARY KEY, nome VARCHAR(100) NOT NULL UNIQUE, sku VARCHAR(50) UNIQUE, preco DECIMAL(10,2), CONSTRAINT check_preco CHECK (preco > 0) );

2. Restrições de Integridade Referencial

PEDIDOstringnumeroPKdatedatadecimaltotalITEM_PEDIDOstringpedido_numFKstringproduto_codFKintquantidadedecimalpreco_unitPRODUTOconteminclui

Implementação

CREATE TABLE Pedido ( numero VARCHAR(20) PRIMARY KEY, data DATE NOT NULL, total DECIMAL(10,2) ); CREATE TABLE Item_Pedido ( pedido_num VARCHAR(20), produto_cod VARCHAR(20), quantidade INTEGER NOT NULL, preco_unit DECIMAL(10,2) NOT NULL, PRIMARY KEY (pedido_num, produto_cod), FOREIGN KEY (pedido_num) REFERENCES Pedido(numero) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (produto_cod) REFERENCES Produto(codigo) ON DELETE RESTRICT ON UPDATE CASCADE );

3. Restrições de Domínio

FUNCIONARIOstringidPKstringnomestringemailstringstatusdecimalsalario

Implementação

CREATE TABLE Funcionario ( id VARCHAR(20) PRIMARY KEY, nome VARCHAR(100) NOT NULL, email VARCHAR(100) CHECK (email LIKE '%@%'), status VARCHAR(20) CHECK (status IN ('ATIVO', 'INATIVO', 'FERIAS')), salario DECIMAL(10,2) CHECK (salario >= 0) );

Restrições de Negócio

1. Validações Complexas

-- Trigger para validar datas CREATE TRIGGER check_datas BEFORE INSERT OR UPDATE ON Pedido FOR EACH ROW BEGIN IF NEW.data_entrega <= NEW.data_pedido THEN RAISE EXCEPTION 'Data de entrega deve ser posterior à data do pedido'; END IF; END; -- Stored Procedure para validação de estoque CREATE PROCEDURE validar_estoque( p_produto_id VARCHAR, p_quantidade INTEGER ) AS $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM Estoque WHERE produto_id = p_produto_id AND quantidade_disponivel >= p_quantidade ) THEN RAISE EXCEPTION 'Estoque insuficiente'; END IF; END; $$ LANGUAGE plpgsql;

2. Restrições Temporais

CREATE TABLE Contrato ( id VARCHAR(20) PRIMARY KEY, data_inicio DATE NOT NULL, data_fim DATE, valor DECIMAL(10,2), CONSTRAINT check_datas CHECK (data_fim IS NULL OR data_fim > data_inicio), CONSTRAINT check_vigencia CHECK (data_fim IS NULL OR data_fim > CURRENT_DATE) );

Mapeamento de Participação

1. Participação Total

DEPARTAMENTOstringcodigoPKstringnomeFUNCIONARIOstringidPKstringdept_codFKNOT NULLstringnomeemprega

Implementação

CREATE TABLE Funcionario ( id VARCHAR(20) PRIMARY KEY, dept_cod VARCHAR(20) NOT NULL, nome VARCHAR(100) NOT NULL, FOREIGN KEY (dept_cod) REFERENCES Departamento(codigo) ON DELETE RESTRICT );

2. Participação Parcial

CLIENTEstringidPKstringnomePEDIDOstringnumeroPKstringcliente_idFKNULL alloweddatedatarealiza

Implementação

CREATE TABLE Pedido ( numero VARCHAR(20) PRIMARY KEY, cliente_id VARCHAR(20), data DATE NOT NULL, FOREIGN KEY (cliente_id) REFERENCES Cliente(id) ON DELETE SET NULL );

Otimizações

1. Índices para Restrições

-- Índices para chaves estrangeiras CREATE INDEX idx_item_pedido_num ON Item_Pedido(pedido_num); CREATE INDEX idx_item_produto_cod ON Item_Pedido(produto_cod); -- Índices para validações frequentes CREATE INDEX idx_funcionario_status ON Funcionario(status); CREATE INDEX idx_contrato_datas ON Contrato(data_inicio, data_fim);

2. Particionamento

-- Particionamento por status CREATE TABLE Pedido ( numero VARCHAR(20), status VARCHAR(20), data DATE, total DECIMAL(10,2) ) PARTITION BY LIST (status); CREATE TABLE pedido_pendente PARTITION OF Pedido FOR VALUES IN ('PENDENTE'); CREATE TABLE pedido_aprovado PARTITION OF Pedido FOR VALUES IN ('APROVADO'); CREATE TABLE pedido_cancelado PARTITION OF Pedido FOR VALUES IN ('CANCELADO');

Boas Práticas

1. Nomenclatura

  • Prefixos consistentes para constraints

  • Nomes descritivos para regras de negócio

  • Padrão para índices e triggers

2. Documentação

COMMENT ON TABLE Produto IS 'Cadastro de produtos comercializados'; COMMENT ON COLUMN Produto.codigo IS 'Código único do produto'; COMMENT ON CONSTRAINT check_preco ON Produto IS 'Garante que o preço seja sempre positivo';

3. Manutenção

  • Monitoramento de violações

  • Logs de alterações

  • Revisão periódica

Considerações de Performance

1. Análise de Impacto

  • Custo de verificações

  • Frequência de validações

  • Complexidade das regras

2. Estratégias de Otimização

  • Uso adequado de índices

  • Particionamento eficiente

  • Cache de validações

Conclusão

O mapeamento eficiente de restrições:

  • Garante integridade dos dados

  • Implementa regras de negócio

  • Otimiza performance

  • Facilita manutenção

25 abril 2025