Bancos de Dados Orientados a Objetos A tecnologia tradicional de BD tem sido utilizada com sucesso para o desenvolvimento de aplicações “comerciais’’ tradicionais. Essa tecnologia, entretanto, não atende adequadamente aplicações mais complexas, tais como aplicações médicas e científicas, geoprocessamento, projetos de engenharia (CAD/CAM), telecomunicações, etc. Essas “novas” aplicações de bancos de dados são caracterizadas por possuírem: dados de estrutura complexa (ex.: dados multimídia, espaciais, geográficos, etc.); transações de mais longa duração; necessidade de operações específicas. Introdução SGBDs orientados a objetos e relacionais estendidos (objeto-relacionais) foram desenvolvidos para atender esses requisitos SGBDs orientados a objetos permitem definir a estrutura de objetos complexos e as operações que podem ser executadas sobre eles SGBDs objeto-relacionais incorporam facilidades oriundas do paradigma de orientação a objetos (definição de novos tipos e operações) ao modelo de dados relacional SQL3 incorpora várias dessas características Introdução Armazenamento (DB2, Oracle, Informix) Necessidade de padronização ODMG X Codificação (Java, C++, SmallTalk, Delphi) Nova tecnologia é decorrente da popularização do paradigma de orientação a objetos Modelagem (UML) Introdução Controle de Versões Transações Segurança Integridade Herança Encapsulamento Introdução Persistência Tecnologia de Bancos de Dados Orientação a Objetos Concorrência Recuperação de Falhas Consultas Armazenamento Polimorfismo Identidade de Objetos Objetos em um banco de dados OO podem existir permanentemente (armazenados) objetos persistentes Correspondência entre objetos do mundo real e objetos armazenados no banco de dados identificadores (object identifiers – OIds) transientes Um objeto tipicamente possui dois componentes: estado (valor) comportamento (operações) Objetos numa linguagem de programação OO existem apenas durante a execução de um programa objetos Objeto Conceitos Básicos valores SGBDs OO, entretanto, permitem a representação de objetos e Cada objeto armazenado no BD possui um identificador único Object Identifier (OId) Um OId é imutável, ou seja, o OId de um determinado objeto nunca é alterado, indepedentemente do seu estado OIds são gerados internamente pelo sistema Teoricamente, valores também deveriam ser vistos como objetos e, portanto, possuir um OId Identidade dos Objetos Conceitos Básicos O modelo orientado a objetos inclui vários construtores de tipo Um objeto pode ser representado como uma tripla (i, c, v), onde i é um OId, c é um construtor de tipo e v é o valor corrente (estado) do objeto Objetos podem ser construídos a partir de outros objetos objetos complexos Estrutura de um Objeto Conceitos Básicos Objetos complexos são construídos a partir de objetos mais simples através da aplicação sucessiva desses construtores básicos: átomo, tupla, conjunto outros: lista, arranjo, multi-conjunto Usados para definir a estrutura dos objetos Construtores de Tipo Conceitos Básicos Átomo (atom) usado para representar valores atômicos de um tipo básico (inteiro, booleano, caractere, string, etc) objetos atômicos não possuem OId Tupla (tuple) <a1:i1, a2:i2, ... , an:in> Construtores de Tipo Conceitos Básicos multi-conjunto (bag) arranjo (array) Os tipos derivados dos construtores conjunto, lista, multi-conjunto e arranjo são denominados de coleções [i1, i2, ... ,i3] Conjunto (set) {i1, i2, ... ,i3} Outros construtores lista (list) Construtores de Tipo Conceitos Básicos o1= (i1, átomo, ‘Houston’) o2= (i2, átomo, ‘Bellaire’) o3= (i3, átomo, ‘Sugarland’) o4= (i4, átomo, 5) o5 = (i5, átomo, ‘Research’) O6 = (i6, átomo, ‘1998-05-22’) o7= (i7,conjunto,{i1, i2, i3}) o8= (i8, tupla, <DNAME:i5, DNUMBER:i4, MGR:i9, LOCATIONS:i7, EMPLOYEES:i10, PROJECTS:i11>) o9= (i9, tupla, <MANAGER:i12, MANAGER_SDATE: i6>) o10= (i10,conjunto,{i12, i13, i14}) ... Exemplos de Objetos Conceitos Básicos o2= (i2,tupla,<DNAME:’Research’, DNUMBER:5, MGR:i3, LOCATIONS:i1, EMPLOYEES:i4, PROJECTS:i5>) o1= (i1,conjunto,{‘Bellaire’,’Houston,’Sugarland’}) Exemplos de Objetos Conceitos Básicos define type Employee: tuple (fname: minit: lname: ssn: date: address: sex: salary: supervisor: dept: define type Date: tuple (year: month: day: integer; integer; integer) string; char; string; string; Date; string; char; float; Employee; Department); Definição de Tipos de Objeto locations: employees: projects: define type Department: tuple (dname: dnumber: mgr: string; integer; tuple (manager: startdate: set(string); set(Employee); set(Project)); Definição de Tipos de Objeto Employee; Date); Semelhante ao conceito de tipo abstrato de dados em linguagens de programação permite definir o comportamento de um tipo de objeto em função das operações que podem ser aplicadas a objetos daquele tipo Separação de interesses: interface: visível externamente, define o nome e os argumentos de cada operação (assinatura) implementação: escondida internamente, inclui a definição das estruturas de dados e a implementação das operaçãoes (métodos) Implementação especificada através de uma linguagem de programação (flexibilidade) Forma de independência de dados lógica: pode-se alterar a implementação sem que as aplicações (usuários) sejam afetadas Encapsulamento Outras operações podem ser declaradas para modificar os objetos de uma classe ou recuperar dados sobre eles Construtor - criar um novo objeto da classe Destrutor - remover um objeto da classe O termo classe é geralmente usado para se referir à definição de um tipo de objeto juntamente com a suas operações uma classe define as características (atributos e métodos) de um conjunto de objetos que compartilham o mesmo comportamento Um objeto é uma instância de uma classe Operações típicas: Classes define class Employee: type tuple (fname: minit: lname: ssn: date: address: sex: salary: supervisor: dept: operations age: create_emp: destroy_emp: end Employee; string; char; string; string; Date; string; char; float; Employee; Department); integer; Employee; boolean; Definição de Classes string; integer; tuple (manager: Employee; startdate: Date); locations: set(string); employees: set(Employee); projects: set(Project)); operations no_of_emps: integer; create_dept: Department; destroy_dept: boolean; assign_emp(e:Employee): boolean; remove_emp(e:Employee): boolean; end Department; define class Department: type tuple (dname: dnumber: mgr: Definição de Classes Operações d.no_of_emps d.destroy_dept Atributos d.dnumber d.mgr.startdate e.dept.dname Notação de Ponto (Dot Notation) PERSON: Name, Address, Birthdate, Age, SSN EMPLOYEE subtype-of PERSON: Salary, HireDate, Seniority STUDENT: subtype-of PERSON: Major, GPA Permite a definição de novos tipos (classes) a partir de tipos (classes) já existentes Este novo tipo (classe), chamado de sub-tipo (sub-classe), herda todos os atributos e operações do tipo (classe) já existente, chamado super-tipo (ou super-classe) Um sub-tipo pode estender (ou especializar) um supertipo acrescentando novas características (atributos ou operações) Exemplos: Hierarquias de Tipos (ou Classes) Não-estruturados O SGBD não conhece a sua estrutura, apenas a aplicação que os utiliza é capaz de interpretá-los Não fazem parte dos tipos de dados básicos Ex.: imagens, textos longos (BLOBs – binary large objects) Operações específicas podem ser definidas usando-se o conceito de tipos abstratos de dados Estruturados Construídos a partir de aplicações sucessivas dos construtores de tipos Objetos Complexos Necessárias em muitas aplicações (ex., engenharia de software, CAD/CAM, etc.) Não é uma característica da tecnologia OO Herança múltipla e herança seletiva Versões Objetos ou operações possuem mais de um comportamento ou significado, dependendo do contexto sobrecarga semântica Exemplo: operador + Polimorfismo Outras Características Ausência de modelo de dados comum Grande atividade experimental e de desenvolvimento Inexistência de um padrão para SGBDOOs limitava a sua utilização de forma ampla Pequena portabilidade Baixa interoperabilidade Falta de referência para comparação de produtos Padrão para SGBDOOs Object Data Management Group Consórcio de desenvolvedores de SGBDOOs Criação de um padrão para SGBDOOs - ODMG 2.0: Modelo de objetos Object Definition Language (ODL) Object Query Language (OQL) Ligações com C++, Java e SMALLTALK ODMG Modelo em que se baseiam as linguagens ODL e OQL Provê tipos, construtores de tipos e demais conceitos para especificação de esquemas para BDOO Componentes básicos: Objetos - estado (valor) e identificador (OId) Literais - valor Objetos podem ser: Atômicos Estruturados (struct) Coleções (set, bag, list, array, dictionary) Modelo de Objetos Herança de uma única classe (EXTENDS) Herança múltipla apenas no caso de comportamento (operações), portanto só podem ser especificadas a partir de interfaces Interface - não instanciável especifica o comportamento (operações) dos objetos Classe - instanciável usada para se criar objetos das aplicações Interface X Classe: Modelo de Objetos extent Herança de interfaces definida via operador “:” Instâncias de classes definidas através da palavra-chave extends Herança de classes definida através da palavra-chave atributos (attributes) relacionamentos (relationships) operações (assinaturas dos métodos) Definições de classes e interfaces podem conter: usada para se “especificar” objetos (classes e interfaces) Independente de qualquer linguagem de programação ODL – Object Definition Language class Student extends Person ( extent students key ssn ) { attribute string class; ... relationship Department majors_in inverse Department::has_majors; relationship set<Grade> completed_sections inverse Grade::student; void change_major(in string dname) raises(dname_not_valid); ... }; Definição de uma Classe ODL - Object Definition Language class Employee ( extent employees key ssn ) { attribute struct Name {string fname, string minit, string lname} name; attribute string ssn; attribute enum Gender{M,F} sex; attribute string address; attribute float salary; attribute date birthdate; attribute set<struct Assgmt{Project proj, float hours}> works_on; relationship set<Dependent> dependents {order_by birthdate}; relationship Employee supervisor; relationship Department works_for inverse Department::workers; }; Exemplo de um Esquema ODMG class Department ( extent departments key number ) { attribute string name; attribute short number; attribute set<string> locations; attribute date manager_start_date; relationship Employee manager; relationship set<Employee> workers inverse Employee::works_for; boolean add_worker (in Employee worker) raises (already_works_here); boolean remove_worker (in Employee worker) raises (not_found); boolean change_manager (in Employee manager); }; Exemplo de um Esquema ODMG class Project ( extent projects key number ) { attribute string name; attribute short number; attribute string location; relationship Department controlling_department; relationship set<Employee> workers; boolean add_worker (in Employee worker) raises (already_works_here); boolean remove_worker (in Employee worker) raises (not_found); }; Exemplo de um Esquema ODMG class Assignment ( extent assignments ) { attribute float hours; relationship Employee employee inverse Employee::works_on; relationship Project project inverse Project::has_workers; }; class Dependent ( extent dependents ) { attribute string name; attribute Gender sex; attribute date birthdate; attribute string relationship; }; Exemplo de um Esquema ODMG class Project ( extent projects key number ) {... relationship set<Assignment> has_workers inverse Assignment::project; } class Employee ( extent employees key ssn ) {... relationship set<Assignment> works_on inverse Assignment::employee; } Com a classe Assignment definida, os seguintes relacionamentos devem inseridos nas classes Employee e Project: Exemplo de um Esquema ODMG e.name e.works_for.dname rsdepartment.manager.salary Expressões de caminho especificam um caminho (path) para objetos e atributos e in employeees variáveis de interação employees (extensão da classe Employee) rsdepartment (nome dado a um objeto do tipo Department) “pontos de entrada” (entry points) objetos persistentes Consultas requerem select ... from ... where select e.name.lname from e in employees where e.works_for.dname = ‘Research’ Sintaxe semelhante a SQL OQL – Object Query Language select d.dname from d in departments where d.college = ‘Engineering’; retorna um resultado do tipo bag<string> departments; retorna um resultado do tipo set<Department> csdepartment.chair; retorna um resultado do tipo Faculty csdepartment.chair.rank; retorna como resultado um string Resultado das Consultas em OQL select f.rank from f in csdepartment.has_faculty; select distinct f.rank from f in csdepartment.has_faculty; select f.rank from f in faculty where f.works_in.dname = ‘Computer Science’; Posição (rank) dos professores do departamento de computação Exemplos de Consulta em OQL select struct (name:struct (last_name: s.name.lname, first_name: s.name.fname), degrees(select struct (deg: d.degree, yr: d.year, college: d.college) from d in s.degrees)) from s in csdepartment.chair.advises; from s in grad_student where s.advisor in select d.chair from d in departments where d.dname = ‘Computer Science’; Nome e respectivos títulos dos estudantes de pósgraduação orientados pelo chefe do departamento de computação Exemplos de Consultas OQL relacionamento select struct (last_name: s.name.lname, operação first_name: s.name.fname), gpa: s.gpa) from s in students where s.majors_in.dname = ‘Computer Science’ and s.class = ‘senior’ order by gpa desc, last_name asc, first_name asc; Nome dos estudantes seniores do curso de computação com seus respectivos coeficientes de aproveitamento acadêmico Exemplos de Consultas OQL avg (select s.gpa from s in students where s.majors_in.dname = ‘Computer Science’ and s.class = ‘senior’); count (s in has_minors(‘Computer Science’)); Funções de agregação has_minors(‘Computer Science’); define has_minors(deptname) select s from s in students where s.minors_in.dname = deptname; Consultas parametrizadas (similares ao conceito de visão no modelo relacional) Outras Facilidades OQL select s.name.lname, s.name.fname from s in students where ‘Database Systems I’ in (select c.cname from c in s.completed_sections.of_courses); for all g in (select s from s in grad_students where s.majors_in.dname = ‘Computer Science’) : g.advisor in csdepartment.has_faculty; Exists g in (select s from s in grad_students where s.majors_in.dname = ‘Computer Science’) : g.gpa = 4; Expressões de pertinência e quantificação Outras Facilidades OQL Descrevem como as construções do modelo de objetos ODMG são mapeadas para construções das linguagens de programação requer ainda uma linguagem específica para manipulação de objetos (OML – Object Manipulation Language) Propostas para três linguagens: C++ Java Smalltalk Ligações (Bindings) para o Padrão ODMG 2.0 O2 (Java e C++) ObjectStore (Java, C++ e ActiveX) Objectivity (Java, C++ e SmallTalk) Poet Object Store (Java e C++) Versant (Java e C++) SGBDOOs Concordantes com o Padrão ODMG 2.0 Elsmari, R. & Navathe, S.B. Fundamentals of Database Systems. 3ª Ed., Addison Wesley, Reading, MA, 2000. (Cap. 11 e 12) Cattel, R. (ed.) The Object Database Standard - ODMG 2.0. Morgan Kaufmann, San Francisco, CA, 1997. Referências