Mapeamento ER para Relacional

// Do Conceitual ao Relacional

O mapeamento transforma o modelo ER (nível conceitual, ANSI/SPARC) em tabelas relacionais (nível interno), definindo tabelas, colunas, chaves primárias e estrangeiras (C.J. Date).

Objetivo: Criar um esquema relacional que respeite as regras de integridade (entidade e referencial).

db_design@postgres:~#
-- Exemplo: Entidade forte mapeada
CREATE TABLE projetos (
  jid VARCHAR(10) PRIMARY KEY,
  jname VARCHAR(100) NOT NULL
);
      

Como Identificar uma Entidade Forte

Em um sistema de gestão de projetos, uma entidade forte tem existência própria e não depende de outra para existir. Para encontrá-la:

  • Olhe para o domínio principal: são objetos centrais do negócio (ex.: Projeto, Funcionário).
  • Verifique se admite PK simples: a entidade forte terá sua própria chave primária (ex.: ProjetoID).
  • Não apareça dentro de relacionamentos apenas: ao contrário de entidades fracas, não existe somente como parte de uma associação.

Exemplo: Projeto é entidade forte pois:

  • Existe independentemente de qualquer outra (não precisa de outra tabela para sua identidade).
  • Possui ProjetoID como chave primária única.
Atividade Prática: Identifique uma entidade forte no sistema de gestão de projetos.

Mapeamento de Entidades

// Fortes e Fracas

Entidades Fortes

Viram tabelas com chaves primárias próprias (Regra de Integridade da Entidade).

Entidades Fracas

Viram tabelas com chave primária composta (chave do pai + identificador próprio).

Regra de Ouro: Toda entidade fraca deve:
  • Ter participação total no relacionamento com o pai
  • Sua PK deve incluir a PK da entidade forte
db_design@postgres:~#
-- Entidade Forte: Projetos
CREATE TABLE projetos (
  jid VARCHAR(10) PRIMARY KEY,
  jname VARCHAR(100)
);
-- Entidade Fraca: Tarefas
CREATE TABLE tarefas (
  tid VARCHAR(10),
  jid VARCHAR(10) REFERENCES projetos,
  tname VARCHAR(100),
  PRIMARY KEY (tid, jid)
);
      
Atividade Prática: Escreva o DDL para uma entidade fraca no sistema de gestão de projetos.

Mapeamento de Relacionamentos

// 1:1, 1:N, N:M

Tipos de Relacionamentos

  • 1:1: Chave primária de uma tabela vira chave estrangeira na outra.
  • 1:N: Chave primária do lado "1" é chave estrangeira no lado "N".
  • N:M: Nova tabela associativa com chaves estrangeiras.
db_design@postgres:~#
-- 1:1: Equipe-Líder (cada equipe tem exatamente 1 líder)
CREATE TABLE equipes (
  eid SERIAL PRIMARY KEY,
  nome VARCHAR(100),
  lider_id INT UNIQUE NOT NULL,
  FOREIGN KEY (lider_id) REFERENCES funcionarios(fid)
);
-- 1:N: Projetos-Tarefas
CREATE TABLE tarefas (
  tid VARCHAR(10) PRIMARY KEY,
  tname VARCHAR(100),
  jid VARCHAR(10) REFERENCES projetos NOT NULL
);
-- N:M: Funcionários-Equipes
CREATE TABLE equipe_funcionarios (
  eid VARCHAR(10) REFERENCES equipes,
  fid VARCHAR(10) REFERENCES funcionarios,
  PRIMARY KEY (eid, fid)
);
      
Atividade Prática: Escreva o DDL para um relacionamento N:M entre Projetos e Funcionários.

Atributos Multivalorados e Compostos

// Normalização de Atributos - Transformando em Tabelas Separadas

Atributos Multivalorados

Viram tabelas separadas com a chave primária da entidade original.

Atributos Compostos

São divididos em atributos simples (atomicidade, C.J. Date).

db_design@postgres:~#
-- Atributo Multivalorado: Habilidades de Funcionários
CREATE TABLE funcionario_habilidades (
  fid VARCHAR(10) REFERENCES funcionarios,
  habilidade VARCHAR(50),
  PRIMARY KEY (fid, habilidade)
);
-- Atributo Composto: Endereço de Projetos
CREATE TABLE projetos (
  jid VARCHAR(10) PRIMARY KEY,
  jname VARCHAR(100),
  endereco_rua VARCHAR(100),
  endereco_cidade VARCHAR(50)
);
      

Atributos multivalorados (ex.: várias habilidades por funcionário) violam a atomicidade (C.J. Date). Eles são mapeados para uma tabela separada, com a chave primária da entidade original e o atributo multivalorado como colunas.

Resumo do Mapeamento

Elemento Mapeamento
Atributo Multivalorado Nova tabela com PK da entidade + atributo.
Chave Primária Composta (PK da entidade + atributo).
Exemplo Habilidades de Funcionários → Tabela `funcionario_habilidades`.

Normalização em Atributos Multivalorados

Quando uma tabela possui um atributo multivalorado (vários valores em uma única célula), ela viola a 1ª Forma Normal (1FN). Para normalizar:

  1. Criar uma nova tabela apenas para o atributo multivalorado;
  2. Manter na nova tabela a chave primária original como campo estrangeiro junto com o atributo multivalorado;
  3. Definir uma chave primária composta unindo a PK original e o atributo multivalorado.

Dessa forma, cada valor passa a ter sua própria linha, respeitando a atomicidade exigida pela 1FN.

Mapeamento de Atributo Multivalorado - Modelo ER para Relacional Modelo Entidade-Relacionamento Modelo Relacional Funcionário ID (PK) Nome Telefones Legenda ER Entidade Atributo Simples Atributo PK Atributo Multivalorado Processo de Normalização (1FN) Atributo multivalorado → Tabela separada Funcionário ID (PK) Nome Funcionário_Telefone ID_Func (FK) Telefone PK Composta: (ID_Func, Telefone) Legenda Relacional PK FK Regra: multivalorados → tabela separada com referência à entidade
Atividade Prática: Mapeie um atributo multivalorado (ex.: Telefones de Funcionários) para uma tabela.

Generalização/Especialização

// Estratégias de Mapeamento

Generalização/Especialização: É um mecanismo de modelagem conceitual que agrupa entidades compartilhando características comuns em uma superclasse (generalização) e cria subclasses mais específicas para representar atributos ou comportamentos adicionais. Por exemplo, uma entidade Pessoa pode ser generalizada, enquanto Cliente e Fornecedor são subclasses especializadas, herdando os atributos de Pessoa (como nome, CPF) e acrescentando próprios (como limiteCredito para Cliente ou prazoEntrega para Fornecedor). Essa abordagem melhora a clareza do modelo, evita redundância e facilita a implementação de herança conceitual ao mapear para tabelas relacionais.

Estratégias

Estratégia Descrição
Única Tabela Todos os atributos em uma tabela, com tipo discriminador.
Tabelas por Subclasse Tabelas separadas para cada subclasse com chaves estrangeiras.
Tabelas por Superclasse/Subclasse Uma tabela para superclasse, tabelas para subclasses com FK.
db_design@postgres:~#
-- Única Tabela: Funcionários (Gerentes/Analistas)
CREATE TABLE funcionarios (
  fid VARCHAR(10) PRIMARY KEY,
  fname VARCHAR(100),
  tipo VARCHAR(20),
  bonus_gerente DECIMAL,
  especialidade_analista VARCHAR(50)
);
      
Atividade Prática: Mapeie uma generalização (Funcionários: Gerentes, Analistas) usando tabelas por subclasse.

Projeto: Mapeamento do Sistema de Gestão

// MER para Tabelas Relacionais

Regras de Mapeamento

Elemento Mapeamento
Entidade Forte Tabela com chave primária (ex.: SERIAL).
Entidade Fraca Tabela com PK composta (FK + identificador).
Relacionamento 1:1 FK com UNIQUE em uma tabela.
Relacionamento 1:N FK na tabela do lado "N".
Relacionamento N:M Tabela associativa com FKs compostas.
Atributo Multivalorado Nova tabela com PK da entidade + atributo.
Atributo Composto Divisão em colunas simples (atômicas).
Generalização/Especialização Tabela única ou tabelas por subclasse (opcional).

Exemplo: Sistema de Gestão de Projetos

db_design@postgres:~#

-- Diagrama ER (Crow’s Foot)
[Projetos]--1:N--[Tarefas]
  JID (PK)   ||    TID (PK)
  JNAME      ||    TNAME
             ||    JID (FK)
[Funcionários]--N:M--[Equipes]
  FID (PK)          EID (PK)
  FNAME            ENAME
[Equipe]--1:1--[Líder]
  EID (PK)        FID (PK)
-- DDL Resultante
CREATE TABLE projetos (
  jid SERIAL PRIMARY KEY,
  jname VARCHAR(100),
  datainicio DATE
);
CREATE TABLE tarefas (
  tid SERIAL,
  jid INT,
  tname TEXT,
  PRIMARY KEY (tid, jid),
  FOREIGN KEY (jid) REFERENCES projetos(jid)
);
CREATE TABLE funcionarios (
  fid SERIAL PRIMARY KEY,
  fname VARCHAR(100)
);
CREATE TABLE equipes (
  eid SERIAL PRIMARY KEY,
  ename VARCHAR(100),
  liderid INT UNIQUE,
  FOREIGN KEY (liderid) REFERENCES funcionarios(fid)
);
CREATE TABLE equipe_funcionarios (
  eid INT REFERENCES equipes(eid),
  fid INT REFERENCES funcionarios(fid),
  PRIMARY KEY (eid, fid)
);
      
Projeto em Grupo:
Converta o diagrama ER do sistema de gestão de projetos (Aula 4/5) em tabelas relacionais. Siga os passos:
  1. Liste as tabelas resultantes.
  2. Defina chaves primárias e estrangeiras.
  3. Escolha tipos de dados (ex.: SERIAL, VARCHAR, DATE).
  4. Escreva comandos CREATE TABLE e ALTER TABLE.
Prepare o diagrama ER inicial e o DDL SQL para apresentar.

Quiz Interativo

// Teste suas habilidades de mapeamento

Teste de Conhecimento

Responda às perguntas para consolidar o aprendizado sobre mapeamento ER para relacional.

1. Como uma entidade forte é mapeada?

a) Tabela com chave primária
b) Tabela associativa
c) Atributo multivalorado
d) Chave estrangeira
Resposta Correta: a) Tabela com chave primária. Entidades fortes tornam-se tabelas com suas próprias chaves primárias.

2. O que caracteriza a chave primária de uma entidade fraca?

a) Atributo único
b) Chave composta com FK
c) Atributo derivado
d) Valor nulo
Resposta Correta: b) Chave composta com FK. Inclui a chave do pai e um identificador próprio.

3. Como mapear um relacionamento N:M?

a) Chave primária única
b) Tabela associativa
c) Atributo composto
d) Tabela única
Resposta Correta: b) Tabela associativa. Contém chaves estrangeiras das entidades participantes.

4. Como tratar atributos multivalorados?

a) Dividir em colunas
b) Nova tabela
c) Atributo derivado
d) Manter como está
Resposta Correta: b) Nova tabela. Atributos multivalorados são mapeados para tabelas separadas.

5. Qual estratégia de generalização usa uma tabela única?

a) Tabelas por subclasse
b) Tabela única com tipo
c) Tabelas por superclasse
d) Tabelas separadas
Resposta Correta: b) Tabela única com tipo. Inclui todos os atributos com um discriminador.
db_quiz_results:~#
RUN mapping_quiz_check;
-- Quiz finalizado. Parabéns pelo mapeamento!