PostGres: Um Banco de Dados Orientado a Objetos Álvaro Vinícius de Souza Coêlho alvaro_degas@yahoo.com.br
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 Casar(Pessoa) Separar() TerFilho(Nome) Aniversaria() Mudar(NovEnd) Empresa RazãoSocial Contrata(Pessoa) Demite(Pessoa) Trabalha em Filho de Casado com
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 Key empregador using há_emp, matricula) 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 Retorna o salário de José na data D 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