PostGres: Um Banco de Dados Orientado a Objetos Álvaro Vinícius de Souza Coêlho [email protected] PostGres • Desenvolvido na Universidade de Berkeley • Sucessor do INGRES • Atualmente: Miro (Comercial) PostGres • Versão não comercial disponível no site da universidade • Escrito em C • 180.000 linhas de código PostGres • • • • • • Relacional Estendido Objetos OIDs “tradicionais” Objetos Compostos Herança Múltipla Versões PostGres • Dados históricos • Linguagem de consulta – PostQUEL – extensão da linguagem QUEL do INGRES PostGres • Dados históricos: • Pode-se consultar sobre o estado do banco em um determinado momento • Armazena o estado do BD depois de cada alteração PostGres • Modelo de dados baseado no relacional • ADT (Abstract Data Type) – disponível para que se possa definir um novo tipo no Banco de Dados • Todos os demais são derivados deste PostGres • Fornece um OID para cada elemento da relação – “mapeando” tabelas em objetos • Como criar classes e objetos? PostGres • O projeto: Pessoa Nome Idade Endereço Casado com Casar(Pessoa) Separar() TerFilho(Nome) Aniversaria() Mudar(NovEnd) Empresa Trabalha em RazãoSocial Endereço Contrata(Pessoa) Demite(Pessoa) Filho de PostGres • Declaração: Create empresa (CNPJ char [15], razaosocial = char[25], Endereço = char[30], Pessoas = postquel) Key (CNPJ) PostGres • Declaração: Create pessoa ( RG (char[11], nome = char[25], Idade = int, endereco = char [50], empregador = empresa, Filhode = pessoa Casadocom = pessoa) Key (RG) PostGres • Herança Create PrestServico (precohora = float) Inrerits (pessoa) PostGres • Herança múltipla • Caso se ponha mais de uma classe no comando inherits • Caso haja conflito de nomes de atributos retorna um erro. PostGres • Tipos de dados PostQuel • Servem para executar um método que faz o acesso ao relacionamento • Uma consulta feita em PostQuel PostGres • Key define um atributo como OID • Pode haver mais de um atributo • Nenhum pode ser nulo e eles não irão se repetir • Implementação quase idêntica à de chave primária do modelo relacional PostGres • Onde está a diferença? • Pode-se usar um tipo definido pelo usuário • Por exemplo, usar o par (empregador, matricula) • Empregador é do tipo empresa • Como comparar empresa? Como saber se uma empresa é igual a outra? PostGres • Cria-se uma função Define function há_emp(e = empresa) Return int as Retrieve any(empresa.all Where empresa.cnpj = e.cnpj • Key empregador using há_emp, matricula) PostGres • Manipulação de Dados • PostQUEL contem os comandos append, replace e delete – Append to pessoa (nome = ...) – Delete pessoa where ... – Replace pessoa (nome= ... ) where ... • Qualquer semelhança com QUEL NÃO terá sido mera coincidência! PostGres • Percurso do fecho transitivo de um esquema • Característica do postquel em extensão a quel • Mostrar todos os ancestrais de José PostGres • A consulta Retrieve * into classeresposta (pessoa.filhode) from a in classeresposta Where pessoa.nome = “José” Or pessoa.nome = getnome(a.filhode)) • * obriga que a consulta será executada até não retornar mais dados • Observar que a sintaxe do getnome não é OO PostGres • A consulta Retrieve (e.nome) from e in pessoa* Where e.nome = “José” • * aqui obriga que a consulta seja executada em todas as subclasses da classe pessoa PostGres • A consulta Retrieve func.salario From func[D] Where func.nome = “José” • Retorna o salário de José na data D PostGres • Regras • Ação executada no banco sob ordem de determinado evento On evento to objeto where condição Then do [instead] comandos PostGres • Evento pode ser – – – – – – Retrieve Replace Delete Append New (replace ou append) Old (delete ou replace) PostGres • Objeto é o nome de uma classe, ou do atributo de uma classe • Condição é um qualificador qualquer usado em PostQUEL • Instead indica que o comando deve substituir, e não acompanhar o evento que gerou a regra PostGres • Podem se referenciar a new e current em lugar do nome da classe – New é o novo valor (caso de inclusões ou alterações) – Current é o valor atual (caso de exclusões ou alterações) • Refuse: indica o cancelamento do evento (Rollback) PostGres • Exemplo: • O Salário de um funcionário no cargo de professor deve ser o que está determinado para este emprego na tabela Cargos On new funcionario.salario where funcionario.cargo = “Professor” Then do replace new.salario = c.salario From c in cargos Where c.nome = “Professor” PostGres • Críticas – Métodos implementados em funções – não nas classes – Não implementa OIDs naturais – Relacionamentos se confundem com variáveis de instância – Padrão proprietário – Viola o encapsulamento PostGres • Qualidades – – – – – Herança e Herança múltipla Versões de dados ao longo do tempo Completeza implementada em PostQuel Aceita tipos definidos pelo usuário É baratinho... PostGres. FIM! “Numa democracia, o direito de ser ouvido não inclui automaticamente o direito de ser levado a sério” Hubert Humphrey Degas