Transformação ODMG Relacional Implementação Relacional de BDs OO • Transformação Esquema Objeto Esquema Relacional • Transformação Esquema Objeto Esquema Objeto-Relacional • Camada OO no Topo de um SGBDR • Integração de uma LPOO com um SGBDR • Interoperabilidade de SGBDOO e SGBDR Transformação Esquema Objeto Esquema Relacional • Classe de Objetos Tabela Relacional – OID Chave Primária, “Surrogate Key” – Os métodos são implementados como “stored procedures”, ou “SQL-functions” ou “SQLtriggers” • Herança com União – Alternativa 1: a superclasse e cada uma das subclasses são transformadas em tabelas relacionais; uma chave compartilhada ID é usada para preservar a identidade dos objetos através das tabelas Transformação Esquema Objeto Esquema Relacional • Herança com União – Alternativa 1: • Usando o exemplo Pessoa-Estudante- Funcionário – Pessoa(ID, Nome, Endereço) – Estudante(ID, Curso, Ano-admissão) – Funcionário(ID, Depto, Sala) » Regra de Integridade Se ID = v em Pessoa então (ID = v em Estudante) (ID = v em Funcionário) (ID = v em Est e Func) Transformação Esquema Objeto Esquema Relacional • Herança com União – Alternativa 2: tudo em uma tabela; um atributo `Tipo´ não-nulo é incluído, para indicar o tipo do objeto/registro; os demais atributos, salvo ID, podem ser nulos Transformação Esquema Objeto Esquema Relacional • Herança com União – Alternativa 2: • Usando o exemplo Pessoa-Estudante- Funcionário – Pessoa(ID, Tipo, Nome, Endereço, Curso, Ano- admissão, Depto, Sala) » Regras de Integridade Tipo {t | t = `Estudante´ t = `Funcionário´ t= `Estudante-Funcionário´} Se t = `Estudante´ então Depto NULL, Sala NULL Se t = `Funcionário´ então Curso NULL, Ano-admissão NULL Transformação Esquema Objeto Esquema Relacional • Herança com Exclusão Mútua – Alternativa 1: Um novo atributo `Subtipo´, podendo ser NULL, é acrescentado na tabela-superclasse; este atributo deve garantir que todo registro em uma tabela-subclasse é disjunto Transformação Esquema Objeto Esquema Relacional • Herança com Exclusão Mútua • Usando o exemplo Empregado-Gerente-Trabalhador – Empregado(ID, Subtipo, Nome, Endereço, Salário) – Gerente(ID, Gratificação) – Trabalhador(ID, HorasExtras) » Regras de Integridade Subtipo {t | t = `Gerente´ t = `Trabalhador´ t IS NULL} ID em Empregado com t = `Gerente´ então ID em Gerente e ID em Trabalhador ID em Empregado com t = `Trabalhador´ então ID em Trabalhador e ID em Gerente ID em Empregado com t IS NULL então ID em Gerente e ID em Trabalhador Transformação Esquema Objeto Esquema Relacional • Herança com Exclusão Mútua – Alternativa 2: tudo em uma tabela; um atributo `Tipo´, podendo ser NULL, é incluído, para indicar o tipo do objeto/registro; os demais atributos, salvo ID, podem ser nulos Transformação Esquema Objeto Esquema Relacional • Herança com Exclusão Mútua • Usando o exemplo Empregado-Gerente- Trabalhador – Empregado(ID, Tipo, Nome, Endereço, Salário, Gratificação, HorasExtras) » Regras de Integridade Tipo {t | t = `Gerente´ t = `Trabalhador´ t IS NULL} Se t = `Gerente´ então HorasExtras NULL Se t = `Trabalhador´ então Gratificação NULL Se t IS NULL então HorasExtras NULL, Gratificação NULL Transformação Esquema Objeto Esquema Relacional • Herança com Exclusão Mútua – Alternativa 3: sem o atributo Subtipo na superclasse; • Usando o exemplo Empregado-Gerente- Trabalhador – Empregado(ID, Nome, Endereço, Salário) – Gerente(ID, Gratificação) – Trabalhador(ID, HorasExtras) Transformação Esquema Objeto Esquema Relacional • Herança com Exclusão Mútua » Regras de Integridade Se ID = v em Empregado então ((ID = v em Gerente) (ID = v em Trabalhador)) ((ID = v em Trabalhador) (ID = v em Gerente)) ( (ID = v em Gerente) (ID = v em Trabalhador)) Transformação Esquema Objeto Esquema Relacional • Herança com Fragmentação – Alternativa 1: Um novo atributo `Subtipo´, não podendo ser NULL, é acrescentado na tabela-superclasse; este atributo deve garantir que todo registro em uma tabela-subclasse é disjunto Transformação Esquema Objeto Esquema Relacional • Herança com Fragmentação – Alternativa 1: • Usando o exemplo Empregado-Gerente- Trabalhador-Horista – Empregado(ID, Subtipo, Nome, Endereço, Salário) – Gerente(ID, Gratificação) – Trabalhador(ID, HorasExtras) – Horista(ID, Período, Horas) Transformação Esquema Objeto Esquema Relacional • Herança com Fragmentação – Alternativa 1: » Regras de Integridade Subtipo {t | t = `Gerente´ t = `Trabalhador´ t = `Horista´ } ID em Empregado com t = `Gerente´ então ID em Gerente e ID em Trabalhador e ID em Horista ID em Empregado com t = `Trabalhador´ então ID em Trabalhador e ID em Gerente e ID em Horista ID em Empregado com t = `Horista´ então ID em Horista e ID em Gerente e ID em Trabalhador Transformação Esquema Objeto Esquema Relacional • Herança com Fragmentação – Alternativa 2: tudo em uma tabela; um atributo `Tipo´ não-nulo é incluído, para indicar o tipo do objeto/registro; os demais atributos, salvo ID, podem ser nulos • Usando o exemplo Empregado-Gerente-Trabalhador- Horista – Empregado(ID, Tipo, Nome, Endereço, Salário, Gratificação, HorasExtras, Período, Horas) Transformação Esquema Objeto Esquema Relacional • Herança com Fragmentação – Alternativa 2: » Regras de Integridade Tipo {t | t = `Gerente´ t = `Trabalhador´ t =`Horista´} Se t = `Gerente´ então HorasExtras NULL, Período NULL, Horas NULL Se t = `Trabalhador´ então Gratificação NULL, Período NULL, Horas NULL Se t = `Horista´ então HorasExtras NULL, Gratificação NULL Transformação Esquema Objeto Esquema Relacional • Herança com Fragmentação – Alternativa 3: sem o atributo Subtipo na superclasse; • Usando o exemplo Empregado-Gerente-Trabalhador- Horista – – – – Empregado(ID, Nome, Endereço, Salário) Gerente(ID, Gratificação) Trabalhador(ID, HorasExtras) Horista(ID, Período, Horas) Transformação Esquema Objeto Esquema Relacional • Herança com Fragmentação – Alternativa 3: sem o atributo Subtipo na superclasse; » Regras de Integridade Se ID = v em Empregado então ((ID = v em Gerente) (ID = v em Trabalhador) (ID = v em Horista)) ((ID = v em Trabalhador) (ID = v em Gerente) (ID = v em Horista)) ((ID = v em Horista) (ID = v em Gerente) (ID = v em Trabalhador)) Transformação Esquema Objeto Esquema Relacional • Para Cada Tipo de Herança, Qual é a Melhor Implementação Relacional? – Prova-se que, para consultas em superclasse e em subclasse, a Alternativa 1 é pelo menos tão boa quanto as outras, em todos os casos – A prova é baseada em um Modelo de Custos e em Categorias de Consulta • O Modelo de Custos leva em conta o tamanho dos registros de uma tabela e o seu número de registros • Consultas sobre estruturas de herança podem ser assim categorizadas – Consultas em Superclasse: acessam atributos em superclasse – Consultas em Subclasse: acessam atributos em subclasse – Consultas Mistas: acessam atributos ao longo de estruturas de herança Transformação Esquema Objeto Esquema Relacional • Consultas em Superclasse – Usando o exemplo Empregado-Gerente- Trabalhador-Horista (Fragmentação), Alternativa 1 – Empregado(ID, Subtipo, Nome, Endereço, Salário) – Gerente(ID, Gratificação) – Trabalhador(ID, HorasExtras) – Horista(ID, Período, Horas) Transformação Esquema Objeto Esquema Relacional • Consultas em Superclasse – Nomes e endereços de todos os empregados horistas • SELECT Nome, Endereço FROM Empregado WHERE Subtipo = `Horista´ (C1) Transformação Esquema Objeto Esquema Relacional • Consultas em Superclasse – Usando o exemplo Empregado-Gerente- Trabalhador-Horista (Fragmentação), Alternativa 2 – Empregado(ID, Tipo, Nome, Endereço, Salário, Gratificação, HorasExtras, Período, Horas) » SELECT Nome, Endereço FROM Empregado WHERE Tipo = `Horista´ (C2) As consultas são idênticas, porém C1 é melhor que C2 (Empregado na Alternativa 1 é pequena se comparada com Empregado na Alternativa 2) Transformação Esquema Objeto Esquema Relacional • Consultas em Superclasse – Usando o exemplo Empregado-GerenteTrabalhador-Horista (Fragmentação), Alternativa 3 – – – – Empregado(ID, Nome, Endereço, Salário) Gerente(ID, Gratificação) Trabalhador(ID, HorasExtras) Horista(ID, Período, Horas) Transformação Esquema Objeto Esquema Relacional • Consultas em Superclasse – SELECT Empregado.Nome, Empregado.Endereço FROM Empregado, Horista WHERE Empregado.ID = Horista.ID (C3) C1 (sem junção) é melhor que C3 (com junção) Transformação Esquema Objeto Esquema Relacional • Consultas em Subclasse – Listar as horas extras de todos os trabalhadores • SQL1 = SQL3 SELECT HorasExtras FROM Trabalhador • SQL2 SELECT HorasExtras FROM Empregado WHERE Tipo = `Trabalhador´ SQL1 e SQL3 são melhores que SQL2 Transformação Esquema Objeto Esquema Relacional • Consultas Mistas – Usando o exemplo Empregado-Gerente-TrabalhadorHorista (Fragmentação) Listar os detalhes de todos os gerentes • SQL1 = SQL3 SELECT Nome, Endereço, Salário, Gratificação FROM Empregado, Gerente WHERE Empregado.ID = Gerente.ID • SQL2 SELECT Nome, Endereço, Salário, Gratificação FROM Empregado SQL2 é WHERE Tipo = `Gerente´ melhor Transformação Esquema Objeto Esquema Relacional Super classe Sub classe Mista Subtipo* Única Tabela Sem subtipo* * - Semanticamente próximas do esquema de objetos Transformação Esquema Objeto Esquema Relacional • Associação – 1:1 Classe A Chave primária 1 1 Classe B Chave estrangeira – Tabela_B(ID, IDA, ...) Tabela_A(ID, ...) – Tabela_A(ID, IDB, ...) Tabela_B(ID, ...) – Tabela_AB(ID, ...) Qual é a melhor transformação? Transformação Esquema Objeto Esquema Relacional • Associação – 1:N Classe A 1 N Classe B • Tabela_B(ID, IDA, ...) Tabela_A(ID, ...) Transformação Esquema Objeto Esquema Relacional • Associação – M:N Classe Associação Classe A M Tabela_A(ID, ...) Tabela_B(ID, ...) Tabela_AB(IDA, IDB, ...) N Classe B Transformação Esquema Objeto Esquema Relacional • Agregação – Usando o exemplo Catálogo-Brinquedo • Catálogo(ID, ...) Brinquedo(ID, ...) Composto_de(IDC, IDB, ...) chave estrangeira chave estrangeira Transformação Esquema Objeto Esquema Relacional • Composição – Usando o exemplo Universidade- Departamento • Universidade(ID, ...) Departamento(ID, IDU, ...) – Regras de Integridade » Se Universidade.ID = v for removida então Departamento.IDU = v removido (“DELETE CASCADE”)