Mapeamento ER->Relacional Fernanda Baião UNIRIO Material parcialmente extraído a partir das notas de aula de Maria Luiza M. Campos, Arnaldo Rocha e Maria Cláudia Cavalcanti Mapeamento do ER para Relacional Metodologia 1. 2. 3. 4. Eliminação dos identificadores externos; Eliminação de atributos compostos e multivalorados; Tradução de cada entidade em uma relação; Tradução de cada relacionamento : a. relacionamentos 1:n, 1:1 podem ser modelados pela adição de atributos às relações já existentes. b. relacionamentos n:m requerem uma relação separada 5. Tradução de Generalização/Especialização Eliminação de Identificadores Externos Transformá-los em identificadores internos no modelo relacional Universidade Código_Universidade Nome Cidade Universidade Código_Universidade Nome Cidade Código_Universidade Estudante Matrícula Estudante Número_Estudante Nome_Estudante Idade Número_Estudante Nome_Estudante Idade A chave da entidade externa foi importada para ESTUDANTE Eliminação de Atributos Compostos Pessoa Nome Idade Endereço Pessoa Pessoa Rua CEP Estado Nome Idade Rua CEP Estado Nome Idade Endereço Eliminação do nível intermediário Detalhes são deixados para a aplicação Eliminação de Atributos Multivalorados - Entidades Produto Produto Código_Produto Códigos_de_Materiais (1,n) Descrição Preço Código_Produto Descrição Preço Introdução de nova entidade. Uma para cada atributo multi-valorado. + Produto__Material Código_Produto Código_de_Material Eliminação de Atributos Multivalorados - Relacionamentos Instrutor Código_Instrutor Departamento Telefone Instrutor (0,m) (0,m) Oferece Oferece Código_Instrutor Departamento Telefone Número_Max_Estudantes Número_Max_Estudantes Trimestre (1,n) (1,m) Curso (1,n) Número_Curso Número_Curso Curso + Oferta_de_Cursos Código_Instrutor Número_Curso Trimestre Tradução de Entidade CPF Nome Salário Empregado Empregado (CPF, Nome, Salário) Tradução de Relacionamentos 1:1 (1,1) Cliente (1,1) tem Nome Código_Cliente Carregamento Endereço Código_Cliente Agrupando numa mesma relação CLIENTE_CARREGAMENTO (Código_Cliente, Nome, Endereço) Ambas as entidades têm o mesmo identificador E se as entidades tiverem diferentes identificadores? Tradução de Relacionamentos 1:1 (0,1) CLIENTE POSSUI (1,1) LIMITE_CRÉDITO CARTÃO_DE_ NÚMERO_CARTÃO CRÉDITO TIPO_CARTÃO NOME CÓDIGO_CLIENTE Agrupando em relações distintas *Uma das entidades tem participação parcial CLIENTE (CÓDIGO_CLIENTE, NOME) CARTÃO_DE_CRÉDITO (TIPO_CARTÃO, NÚMERO_CARTÃO, LIMITE) POSSUI (TIPO_CARTÃO, NÚMERO_CARTÃO, CÓDIGO_CLIENTE) As entidades têm identificadores diferentes (Qual seria ainda outra alternativa neste caso?) Tradução de Relacionamentos 1:1 DATA DURAÇÃO (0,1) HOMEM HOM_CPF CASAMENTO (0,1) MLH_CPF MULHER NOME NOME * Ambas as entidades têm participação parcial HOMEM (HOM_CPF, NOME) MULHER (MLH_CPF, NOME) CASAMENTO (HOM_CPF, MLH_CPF, DATA, DURAÇÃO) Tradução de Relacionamentos 1:n NOME_CIDADE CIDADE POPULAÇÃO (1,1) Ambas entidades têm participação total LOCALIZAÇÃO (1,n) ESTADO NOME_ESTADO GOVERNADOR POPULAÇÃO CIDADE (NOME_CIDADE, NOME_ESTADO, POPULAÇÃO) ESTADO (NOME_ESTADO, GOVERNADOR, POPULAÇÃO) Tradução de Relacionamentos 1:n VENDEDOR NOME TELEFONE (1,n) DESCONTO PREENCHE participação parcial (“pedidos pela internet”) (0,1) PEDIDO NÚMERO_PEDIDO DATA VENDEDOR (NOME_VEND, TELEFONE) PEDIDO (NÚMERO_PEDIDO, DATA) PREENCHE (NÚMERO_PEDIDO, NOME_VEND, DESCONTO) Tradução de Relacionamentos NÚMERO_ESTUDANTE n:m ESTUDANTE NOME_ESTUDANTE (1,n) Independe SEMESTRE MATRÍCULA das ! cardinalidades GRAU (1,m) CURSO NÚMERO_CURSO NOME_CURSO ESTUDANTE (NÚMERO_ESTUDANTE, NOME_ESTUDANTE) CURSO (NÚMERO_CURSO, NOME_CURSO) MATRÍCULA (NÚMERO_ESTUDANTE, NÚMERO_CURSO, SEMESTRE, GRAU) Tradução de Relacionamentos n-ários COD_PEÇA PEÇA DESCRIÇÃO (1,n) COD_FORN NOME ENDEREÇO TELEFONE PROJETO FORNECEDOR (1,n) (1,n) COD_PROJETO NOME DATA_ABERT QTDE PEÇA (COD_PEÇA, DESCRIÇÃO) FORNECEDOR (COD_FORN, NOME, ENDEREÇO, TELEFONE) PROJETO (COD_PROJETO, NOME, DATA_ABERT) FORNECIMENTO (COD_PEÇA, COD_FORNECEDOR, COD_PROJETO, QTDE) Tradução de Auto Relacionamentos REG_EMP NOME DATA_NASC EMPREGADO (1,n) É_COORDENADO (1,n) É_COORDENADOR COORDENA EMPREGADO (REG_EMP, NOME, DATA_NASC) COORDENA (REG_SUB, REG_COORDENADOR) E se o relacionamento for 1:n? Tradução de Hierarquias Há duas alternativas Fundir todas as entidades em uma única relação Uma tabela para cada entidade específica Fusão Chave primária fica sendo a da entidade mais genérica Incluir uma coluna tipo Passar todos os atributos das entidades especializadas para entidade genérica Fazer o mesmo para os relacionamentos Aplicar as regras já conhecidas Traduzindo Hierarquias LOTACAO (1,1) (0,n) Código Descrição nome DEPTO Codigo nome EMPREGADO CREA (0,n) ENGENHEIRO MOTORISTA SECRETARIA (1,n) DOMINIO (0,n) Habilitacao PERTENCE (0,n) (1,1) Código Descrição nome SW PARTICIPACAO RAMO ENGENH (0,n) Código Descrição nome PROJETO Traduzindo Hierarquias fusão (1,1) LOTACAO CREA Habilitacao DEPTO Código Descrição nome Codigo nome tipo (0,n) EMPREGADO (0,n) (1,n) (0,n) DOMINIO PERTENCE (0,n) SW PARTICIPACAO (1,1) Código Descrição nome RAMO ENGENH (0,n) Código Descrição nome PROJETO Código Descrição nome Código Descrição nome Traduzindo Hierarquias – fusão EMPREGADO(codEmp, nome, tipo, crea, habilitacao, codRamo, codDepto) DEPTO (codDepto, nome, desc) SW (codSW, nome, desc) RAMOENG(codRamo, nome,desc) PROJETO (codProj, nome, desc) DOMINIO(codSW, codEmp) PARTICIPACAO (codEmp, codProj) Traduzindo Hierarquias EMPREGADO(codEmp, nome, tipo, codDepto) MOTORISTA(codEmp, habilitacao) ENGENHEIRO (codEmp, CREA, codRamo) SECRETARIA (codEmp) Note que codEmp é chave primária em cada relação especializada e chave estrangeira para EMPREGADO Traduzindo Hierarquias Tabela única Todos os dados em uma única tabela... Não há necessidade de navegação por outras tabelas para se obter todos os dados a respeito de um empregado Economia de espaço por um lado pois a chave primária não é duplicada, mas há desperdício por outro lado com os nulos que os campos das tabelas especificas trazem Várias tabelas Conceitos explicitos em relações próprias Redução de nulos Há uma terceira alternativa? Cada caso é um caso! Nomes Nomes simples e reduzidos Ex data de nascimento ---> dataNasc nao usar o nome da tabela a não ser em campos parte de chaves primárias Ex:codigo ----> codEmp Há controvérsias... ☺ Exercício nome dealer 12 entidades 13 relacionamentos (1,N) nome (1,1) projetista (1,1) (1,N) (1,N) (1,1) (1,M) (1,N) (1,N) (1,1) (1,1) (1,N) franchise (1,1) (1,N) entrega mes côr côr nome (1,N) (1,1) modelo (1,N) competidor (1,1) v_max configuração (1,1) (1,N) carro (1,1) (1,N) carroceria mercado (1,1) (1,1) preço título (1,N) (1,N) num motor capacidade nome estilo Exercício nome dealer (1,N) nome (1,1) projetista franchise (1,1) (1,N) (1,1) (1,N) (1,N) (1,1) (1,M) (1,N) (1,N) (1,1) entrega mes côr côr (1,N) (1,1) modelo (1,N) nome competidor (1,1) v_max (1,1) configuração carro (1,N) (1,1) carroceria (1,1) (1,1) preço título (1,N) motor mercado (1,N) (1,1) num (1,N) (1,N) capacidade nome estilo Exercício nomedealer mes franchise mes entrega nomemodelo nomemodelo nome (M,N) nomeprojetista nomemodelo preço nummotor num motor côr carro competidor nomemodelo nomemodelo v_max configuração modelo Nome estilo nummotor carroceria título mercado nomeestilo mercado título capacidade Exercício ESQUEMA FINAL: ENTREGA ( mes, modelo ) FRANCHISE ( dealer, mes, modelo ) MODELO ( modelo, projetista ) MODELO-CÔR ( modelo, cor ) CONFIGURAÇÃO ( modelo, motor, v_max ) CARROCERIA ( modelo, estilo, mercado ) MERCADO ( mercado, competidor ) MOTOR ( motor, capacidade ) CARRO ( modelo, estilo, motor, preço ) Referências e Reflexões Mapeamento de outros modelos para Relacional? De OO para relacional? De XML para Relacional? Site que fala sobre mapeamento objeto para relacional: http://www.servicearchitecture.com/object-relationalmapping/articles/