Dissertação de Mestrado de Ricardo Oliveira Barros - SE/8

Transcrição

Dissertação de Mestrado de Ricardo Oliveira Barros - SE/8
INSTITUTO MILITAR DE ENGENHARIA
USO DE REGRAS ATIVAS NO TRATAMENTO DE EVOLUÇÃO DE ESQUEMAS EM
UM SISTEMA DE GERENCIADOR DE OBJETOS
POR
RICARDO OLIVEIRA BARROS
TESE SUBMETIDA
COMO REQUISITO PARCIAL
PARA A OBTENÇÃO DO GRAU DE
MESTRE EM CIÊNCIAS EM SISTEMAS E COMPUTAÇÃO
Assinatura do Orientador da Tese
_________________________________________
ANA MARIA DE CARVALHO MOURA - D. Ing.
Rio de Janeiro
Maio 1996
Tese apresentada por
___________________________________________
RICARDO OLIVEIRA BARROS
e aprovada por:
___________________________________________
ANA MARIA DE CARVALHO MOURA - Dr. Ing.
___________________________________________
ASTÉRIO KIYOSHI TANAKA - PhD.
___________________________________________
MARTA LIMA DE QUEIRÓS MATTOSO - D.Sc.
___________________________________________
GUSTAVO MIRANDA ARAÚJO - M.Sc.
IME, RIO DE JANEIRO - RJ, 03 de Maio de 1996.
ii
RESUMO
Evolução de esquemas é um importante requisito para aplicações OO (Orientadas a
Objeto). Esta funcionalidade está associada à habilidade de executar dinamicamente uma
larga variedade de modificações sobre o esquema do BD, minimizando a necessidade de uma
reorganização em prol de um melhor desempenho do sistema.
Modificações em esquemas de SGBDOOs tendem a ser mais freqüentes do que em
SGBDs convencionais, devido ao fato de que um esquema de BDOO é extensível, ou seja,
suporta a criação de novos tipos e operações. Portanto, a existência de muitos interrelacionamentos no esquema e a necessidade de alterações cada vez mais freqüentes, fazem
com que o suporte à evolução de esquemas em SGBDOOs seja necessário e muito mais
complexo que nos SGBDs convencionais. Muitos dos SGBDOOs comercialmente disponíveis
tratam apenas da integridade estrutural do esquema, não permitindo modificações depois da
base instanciada. Neste trabalho, são tratados os efeitos das modificações do esquema sobre
os métodos e objetos instanciados no SIGO - Sistema Gerenciador de Objetos. O principal
objetivo é garantir, além da integridade estrutural, a integridade comportamental e de
instanciação do esquema da aplicação. Este resultado é obtido pelo armazenamento das
efetivas modificações sobre o esquema numa hierarquia de classes e pela conseqüente
propagação destas modificações aos objetos instanciados. A propagação é feita através de
métodos definidos como regras ativas associados às classes. Estas regras são automaticamente
ativadas por métodos que referenciam os objetos durante a manipulação do esquema.
iii
ABSTRACT
Schema evolution is an important requirement to OO (Object Oriented) applications.
This functionality is associated to the ability to dynamically execute a wide variety of
modifications on the DB (Database) schema, minimizing the need to reorganize it, in order to
have a better performance. Schema changes in an OODBMS (Object Oriented Database
Management System) happen to be more frequent than in conventional DBMS, as the schema
is extensible, that is, it provides the creation of new types and operations. So, the existence of
many relationships in the schema and its need for frequent changes, turns out to require an
OODBMS schema evolution support, naturally much more complex than in conventional
DBMS. Most of the commercial OODBMS available in the market keep only the schema
structural integrity, not allowing modifications after the database has been instantiated. This
work describes the schema modification effects over objects and methods stored in SIGO - an
Object Manager System. Its main purpose is to maintain, besides its structural integrity, the
behavioral and the instantiation integrity of the application schema. This aim is obtained by
storing the real schema modification in a class hierarchy and by propagating these
modifications to the objects instantiated in the DB. This propagation is executed by methods
defined as active rules, associated to the classes. These rules are automatically activated by
application methods that reference objects during the schema manipulation.
iv
SUMÁRIO
RESUMO
iii
ABSTRACT
iv
LISTA DE ILUSTRAÇÕES
viii
LISTA DE TABELAS
xi
LISTA DE ABREVIATURAS E SÍMBOLOS
xii
1 - INTRODUÇÃO
1
1.1 - Posicionamento
1
1.2 - Justificativa para o trabalho
3
1.3 - Objetivo do trabalho
8
1.4 - Organização do trabalho
9
2 - EVOLUÇÃO DE ESQUEMAS EM SGBDOOs
2.1 - Evolução de esquemas sobre um esquema único
11
11
2.1.1 - Evolução de esquemas no O2
15
2.1.2 - Evolução de esquemas no ORION
19
2.1.3 - Evolução de esquemas no GEMSTONE
25
2.1.4 - Evolução de esquemas no OBJECTSTORE
27
2.1.5 - Quadro resumo dos aspectos de correção nos SGBDOOs
estudados
31
2.2 - Evolução de esquemas utilizando Versionamento
v
32
3 - SIGO
38
3.1 - Uma visão geral
38
3.2 - O modelo de objetos e o esquema conceitual
40
3.3 - Evolução de esquemas
45
3.4 - Persistência de objetos
47
3.5 - Ambiente de programação
50
4 - USO DE REGRAS ATIVAS NO TRATAMENTO DE EVOLUÇÃO
DE ESQUEMAS NO SIGO
53
4.1 - Aspectos de Regras Ativas
53
4.1.1 - Uma visão geral
53
4.1.2 - Semântica de regras ativas
57
4.1.3 - Seleção da regra e o modo de acoplamento
58
4.1.4 - Granularidade do processamento de regras ativas
59
4.1.5 - Arquiteturas e técnicas para monitoramento de condições
60
4.2 - Efeito das modificações do esquema sobre os objetos e métodos
63
4.2.1 - Modificações de atributos
65
4.2.2 - Modificações de classes
74
4.2.3 - Modificações de objetos
79
4.2.4 - Modificações de métodos
80
4.3 - Especificação das alternativas e mecanismos utilizados para evolução da
vi
base de objetos
82
4.3.1 - Semântica de regras ativas no SIGO
83
4.3.2 - Aderência Conceitual ao modelo de execução de regras em BDs
Ativos
85
4.3.3 - O Repositório de Regras Ativas Orientado a Objetos (R2O2)
86
5 - DESCRIÇÃO FUNCIONAL DE MÉTODOS E FUNÇÕES
91
5.1 - Operações de modificação sobre objetos e métodos
91
5.2 - Operações específicas de manipulação do R2O2
108
5.3 - Tabelas de Conversão para modificações de atributos
110
6 - AMBIENTE DO PROTÓTIPO DE IMPLEMENTAÇÃO
114
6.1 - Contexto da aplicação
114
6.2 - Operações de evolução da base de objetos no SHC
115
7 - CONCLUSÃO
132
7.1 - Contribuições
132
7.2 - Sugestões para trabalhos futuros
133
7.3 - Considerações finais
135
REFERÊNCIAS BIBLIOGRÁFICAS
137
APÊNDICE A - ESTRUTURA DO ARQUIVO DE MODIFICAÇÕES DO
ESQUEMA ALT.DAT
142
vii
LISTA DE ILUSTRAÇÕES
FIGURA 2.1 - Arquitetura ORION
19
FIGURA 2.2 - Uma hierarquia de classes com conflito de nomes
23
FIGURA 2.3 - Classe VEÍCULOS
24
FIGURA 2.4 - Categorias e subcategorias de modificações de esquema
30
FIGURA 2.5 - Histórico de versões para três objetos X, Y e Z em um BD
34
FIGURA 3.1 - Arquitetura do SIGO
38
FIGURA 3.2 - Definição de Objeto no SIGO
41
FIGURA 3.3 - Exemplo de uma aplicação SIGO
43
FIGURA 3.4 - Seleção da Classe EMPREG e criação do atributo PROJETOS
44
FIGURA 3.5 - Seleção da Classe PROJETO como elemento da Lista PROJETOS
44
FIGURA 3.6 - Definição da Lista PROJETOS para o máximo de sete elementos
45
FIGURA 3.7 - Tabelas representando um esquema conceitual
48
FIGURA 3.8 - Ambiente de desenvolvimento de aplicações
51
FIGURA 4.1 - Algoritmo para o processamento de regras
57
FIGURA 4.2 - Arquitetura Integrada para BDs Ativos
61
FIGURA 4.3 - Arquitetura de Camadas para BDs Ativos
62
FIGURA 4.4 - Inclusão do atributo dt_nasc para a classe Pessoa
66
FIGURA 4.5 - Exclusão do atributo dt_nasc da classe Pessoa
67
FIGURA 4.6 - Modificação do domínio do atributo projeto da classe Funcionário
69
FIGURA 4.7 - Modificação de restrição sobre atributo salário da classe Funcionário
71
FIGURA 4.8 - Modificação de característica sobre o atributo endereço da classe Pessoa 72
FIGURA 4.9 - Inclusão da classe Pessoa como superclasse da classe Professor
viii
75
FIGURA 4.10 - Retirada da classe Pessoa da lista de superclasses da classe Professor
76
FIGURA 4.11 - Retirada da classe Funcionário do esquema do BD
78
FIGURA 4.12 - Migração do objeto 04 da classe Funcionário para a classe Aluno
80
FIGURA 4.13 - Arquitetura do SIGO com suporte à evolução da base de objetos
82
FIGURA 4.14 - Algoritmo para processamento de regras no SIGO
84
FIGURA 4.15 - Hierarquia de classes do R2O2 para operações sobre objetos
87
FIGURA 4.16 - Hierarquia de classes do R2O2 para operações sobre métodos
90
FIGURA 6.1 - Esquema conceitual e tabelas da aplicação SCH
115
FIGURA 6.2 - Objetos instanciados na classe MÉDICO (Exemplo no 1)
122
FIGURA 6.3 - Objetos instanciados na classe MÉDICO (Exemplo no 1)
122
FIGURA 6.4 - Objetos instanciados na classe EXAME (Exemplo no 2)
123
FIGURA 6.5 - Objetos instanciados na classe EXAME (Exemplo no 2)
123
FIGURA 6.6- Objetos instanciados na classe MÉDICO (Exemplo no 3)
124
FIGURA 6.7 - Objetos instanciados na classe MÉDICO (Exemplo no 3)
124
FIGURA 6.8 - Objetos instanciados na classe PACIENTE (Exemplo no 4)
125
FIGURA 6.9 - Objetos instanciados na classe PACIENTE (Exemplo no 4)
125
FIGURA 6.10 - Objetos instanciados na classe PACIENTE (Exemplo no 5)
126
FIGURA 6.11 - Objetos instanciados na classe PACIENTE (Exemplo no 5)
126
FIGURA 6.12 - Objetos instanciados na classe PESSOA (Exemplo no 6)
127
FIGURA 6.13 - Objetos instanciados na classe PESSOA (Exemplo no 6)
127
FIGURA 6.14 - Objetos instanciados na classe EXAME (Exemplo no 7)
128
FIGURA 6.15 - Objetos instanciados na classe EXAME (Exemplo no 7)
128
FIGURA 6.16 - Objetos instanciados na classe EXAME (Exemplo no 8)
128
FIGURA 6.17 - Objetos instanciados na classe EXAME (Exemplo no 8)
129
ix
FIGURA 6.18 - Objetos instanciados na classe RESIDENTE (Exemplo no 10)
129
FIGURA 6.19 - Objetos instanciados na classe RESIDENTE (Exemplo no 10)
129
FIGURA 6.20 - Objetos instanciados na classe MÉDICO (Exemplo no 12)
130
FIGURA 6.21 - Objetos instanciados na classe PACIENTE (Exemplo no 12)
130
FIGURA 6.22 - Objetos instanciados na classe MÉDICO (Exemplo no 12)
131
FIGURA 6.23 - Objetos instanciados na classe PACIENTE (Exemplo no 12)
131
x
LISTA DE TABELAS
TABELA 2.1 - Aspectos de correção do esquema nos SGBDOOs: O2, ORION,
OBJECTSTORE e GEMSTONE
31
TABELA 5.1 - Conversões possíveis de domínio
111
TABELA 5.1 - Modificações possíveis de restrições
111
TABELA 5.3 - Modificações possíveis de características
111
xi
LISTA DE ABREVIATURAS E SÍMBOLOS
ADB
-
Administrador do Banco de Dados
API
-
Application programming interface
BD
-
Banco de Dados
BDOO
-
Banco de Dados Orientado a Objeto
BLOB
-
Binary Large Objects
CAD
-
Computer-aided Design
CAM
-
Computer-aided Manufacturing
CASE
-
Computer-aided Software Engineering
C/S
-
Cliente/Servidor
ECA
-
Evento / Condição / Ação
GSI
-
GemStone Smalltalk Interface
IA
-
Inteligência Artificial
ID_OBJ
-
Identificadores de Objetos
IME/RJ
-
Instituto Militar de Engenharia no Rio de Janeiro
LIDAS
-
Linguagem para o Desenvolvimento de Aplicações
LIMOS
-
Linguagem Interativa para Manipulação de Objetos
MACRO
-
Módulo de Armazenamento, Criação e Recuperação de Objetos
MAME
-
Módulo de Aquisição e Modelagem de Esquema
MCC
-
Microelectronics and Computer Technology Corporation
MORSO
-
Modelo em Rede Semântica Orientada a Objetos
OIS
-
Office Information System
OO
-
Orientação a Objetos / Orientado a Objetos
xii
R2O2
-
Repositório de Regras Ativas Orientado a Objetos
SCH
-
Sistema de Controle Hospitalar
SGBD
-
Sistema Gerenciador de Banco de Dados
SGBDOO
-
Sistema Gerenciador de Banco de Dados Orientado a Objeto
SGBDR
-
Sistema Gerenciador de Banco de Dados Relacional
SIGO
-
Sistema Gerenciador de Objetos
SQL
-
Structured Query Language
TAO
-
Tipos Abstratos de Objetos
xiii
CAPÍTULO 1
INTRODUÇÃO
1.1 - POSICIONAMENTO
Ao contrário dos SGBDs relacionais (SGBDRs) (CODD,1970) que armazenam apenas
dados, os SGBDs Orientados a Objetos (SGBDOOs) armazenam também processos, sob a
forma de métodos, aplicações e/ou funções, aumentando a complexidade para manutenção da
consistência do esquema do Banco de Dados (BD) em um ambiente dinâmico (MORSI,1992).
Além disso, as classes de um esquema Orientado a Objetos (OO) podem estar interrelacionadas, através de composição ou herança, possibilitando a geração de esquemas
extensíveis. Por estes motivos, alterações em esquemas de Bancos de Dados Orientados a
Objetos (BDOOs) podem causar efeitos colaterais em várias definições, além de afetar objetos
instanciados e a execução de métodos a eles associados (PREVOT,1994).
O paradigma da Orientação a Objetos tem sido o mais adequado para modelar
estruturas complexas no domínio de aplicações não convencionais, tais como: CAD/CAM,
CASE, IA, sistemas baseados em conhecimento e OIS (Office Information Systems) com
documentos multimídia (BANERJEE,1987). Aplicações de BDs Não Convencionais
requerem funcionalidades adicionais, também para ambientes de desenvolvimento, visto que
o projeto de aplicações em geral, vem a ser naturalmente interativo, onde a completeza destes
projetos pode requerer a investigação de algumas alternativas (KIM,1995). Porém, a
importância da flexibilidade de modificar esquemas durante a fase de especificação em
ambientes de desenvolvimento, pode não ser a mesma em ambientes de produção onde o
desempenho seja fundamental (KIM,1990).
1
Assim, além da persistência e compartilhamento - dentre outras características,
advindas dos SGBDs Convencionais e incorporadas ao ambiente OO (ATKINSON,1989)
(KHOSHAFIAN,1993) (CATTELL,1994) - outro importante requisito para estas aplicações é
a evolução de esquemas, ou seja, a habilidade de executar dinamicamente uma larga
variedade de modificações sobre o esquema do BD, minimizando a necessidade de uma
reorganização em prol de um melhor desempenho do sistema (CATTELL,1991).
Alguns SGBDOOs permitem ao usuário modificar a definição de classes, muito
embora variando consideravelmente o nível de assistência oferecido para o manuseio destas
modificações (LÈCLUSE,1989) (DEUX,1991) (FERRANDINA,1995) (ZICARI,1991)
(KIM,1990) (XIDAK,1990) (OBJECTIVITY,1990) (PENNEY,1987) (GEMSTONE,1995)
(OBJECTDESIGN,1990). Por exemplo, se um novo atributo é incluído para uma classe de
objetos:
“É necessário ao usuário corrigir, explicitamente, todos os objetos existentes daquela
classe para que tenham o novo atributo ?”;
“É possível incluir uma nova superclasse quando existem instâncias de uma classe ?”;
“O que acontece aos programas existentes que usam o antigo esquema ?”.
Existem, portanto, três implicações decorrentes de modificações em um esquema de
dados:
(1) Modificações de programas que usam o antigo esquema;
(2) Modificações das instâncias existentes das classes modificadas;
(3) Efeitos das modificações no restante do esquema.
A implicação (1) é extremamente substancial, porém, se for usado encapsulamento
restrito, em modificações feitas somente para atributos, os únicos programas que necessitam
2
ser
modificados
são
aqueles
associados
às
classes
de
objetos
modificadas
(KHOSHAFIAN,1993).
Outrossim, a exclusão ou modificação da interface de um método pode invalidar tanto
o código existente em outra classe de objetos, como também modificar atributos não
protegidos por encapsulamento, ou por algum outro mecanismo de independência de dados.
A maioria dos SGBDOOs não oferece, até então, ferramentas de assistência às
modificações de programas existentes quando ocorrem atualizações no esquema. Contudo, a
capacidade para renomear, incluir e excluir propriedades de tipos de objetos, bem como
incluir e excluir os próprios tipos de objetos em tempo de execução (“run-time types”) são
importantes requisitos, que visam prover ferramentas e programas “Ad hoc” para executar
transformações no esquema. Sem estas capacidades de “run-time types” seria necessário
definir estaticamente o novo e o antigo esquema através de um programa genérico de
transformação (CATTELL,1991).
1.2 - JUSTIFICATIVA PARA O TRABALHO
Como foi visto anteriormente, as aplicações não convencionais necessitam de aspectos
relacionados a um maior dinamismo e que, por enquanto, somente a OO é capaz de satisfazer
a estes requisitos de forma mais simples e natural. Assim, modificações em esquemas de
SGBDOOs tendem a ser mais freqüentes do que em esquemas de BDs Convencionais, pelo
fato dos esquemas gerados por um SGBDOO serem extensíveis, isto é, por suportarem a
criação de novos tipos e operações (CATTELL,1991).
Portanto, a existência de muitos inter-relacionamentos em um esquema e a
necessidade de modificações cada vez mais freqüentes fazem com que o suporte à evolução
3
de esquemas em SGBDOOs seja necessário e muito mais complexo do que nos SGBDs
Convencionais:
relacionais,
redes
e
hierárquicos
(NAVATHE,1994)
(SILBERSCHATZ,1994) (ULLMAN, 1989) (DATE, 1987).
O processo de evolução de esquemas inclui dois importantes aspectos relativos à
consistência intencional e extensional dos componentes do BD. Estes aspectos são
controlados por mecanismos que garantem a integridade do BD como um todo. A parte
intencional é composta pelo esquema, onde está traduzida a semântica da aplicação para o
contexto do modelo de dados utilizado, e a parte extensional é composta pela base de dados,
informações do mundo real captadas de acordo com a perspectiva do esquema
(GUIMARÃES,1995).
Ao serem confrontadas aplicações tradicionais com as não convencionais, é possível
perceber que as primeiras apóiam-se num esquema praticamente fixo, enquanto as outras,
implicitamente, supõem uma dinamicidade da modelagem da realidade, isto é, o possível
surgimento de novos relacionamentos, novas composições etc., ao longo da construção do
esquema, assim tornando, freqüentes as alterações.
Verificada a necessidade de evolução da modelagem e, por conseguinte, do esquema é
preciso garantir sua correção ao longo do processo evolutivo. Em (BANERJEE,1987) estas
modificações são definidas como o mapeamento que leva um esquema de um estado
consistente S a outro S', igualmente consistente. Assim, após cada modificação introduzida,
deve ser verificada a correção do esquema.
Ainda em (BANERJEE,1987) são identificados três aspectos a serem examinados: o
relacionado com a estrutura do esquema frente ao modelo que o sustenta; o relacionado com
as aplicações sobre ele construídas; e o que envolve as instâncias obtidas a partir das classes
que as compõem. Deste modo são observados os seguintes aspectos de correção:
4
(1) Integridade Estrutural
Refere-se à correção do grafo que representa o esquema, onde as classes estão
representadas por arcos de especialização / generalização. Este aspecto é mantido através do
estabelecimento de pré-condições, denominadas invariantes do esquema. Estas invariantes são
verificadas após cada alteração, e quando satisfeitas, asseguram este aspecto de correção.
(2) Integridade Comportamental
Refere-se à correção dos aspectos comportamentais (métodos) associados às classes,
assegurando que suas assinaturas possuem parâmetros com tipos existentes e corretos e que o
valor de retorno tem o tipo certo. De uma forma mais ampla, um BDOO é
comportamentalmente correto se todos seus métodos produzirem o resultado esperado.
Este aspecto é de difícil controle, pois a atuação do método tem um sentido semântico
amplo. No entanto, mantendo-se uma lista de atributos e outra de métodos, é possível
detectar, por exemplo, na oportunidade de redefinição de um atributo, quais métodos serão
afetados e alertar o projetista (detentor do completo domínio da semântica que se desejou
traduzir no código).
(3) Integridade de Instanciação
Aqui a preocupação é que todas as instâncias, ao menos quando consultadas, estejam
de acordo com a definição atual da classe que tomam como base. Neste caso pode não ser
necessário manter as instâncias constantemente atualizadas, bastando que sejam "vistas" como
atualizadas.
5
Outra abordagem semelhante encontrada em (PREVOT,1994), ainda sobre os aspectos
de consistência, apresenta interessantes definições. Nesta abordagem um esquema modela
ambas as partes: estrutural e comportamental do BD. Seus principais componentes são a
hierarquia de classes e as assinaturas de métodos, que descrevem a interface de programação
das instâncias das classes. As classes são os pontos de entrada no BD. Funções, aplicações e
tipos são também partes do esquema.
Uma base é uma coleção de instâncias (objetos e valores) cujas estruturas e
comportamentos estão definidos em um esquema. Ela está sempre relacionada a um único
esquema, que a descreve, podendo servir como definição estrutural e comportamental de
várias bases.
Modificações de esquema podem implicar em alterações nos objetos que estiverem
relacionados com a parte do esquema onde foi feita a mudança. Já modificações de objetos
não implicam em mudanças no esquema. O desejado é que mudanças na parte estrutural e
comportamental não provoquem erros de execução, ou comportamentos anômalos de um
método e/ou função e/ou programa, ou outros tipos de situações imprevisíveis.
A consistência do esquema e da base é estabelecida a partir de uma classificação em
dois tipos: consistência estrutural, que se refere à parte estática do BD; e consistência
comportamental, que se referem aos métodos, aplicações ou funções.
Um esquema é estruturalmente consistente se e somente se:
(1) a hierarquia de classes é consistente;
(2) o conjunto de métodos é consistente;
(3) cada nome dentro do esquema tem uma regra de escopo bem definida.
Uma base é estruturalmente consistente se e somente se:
(1) os valores dos objetos forem consistentes com o tipo da classe a que pertencem;
6
(2) os valores de cada propriedade especificada forem consistentes com o tipo definido
na classe à qual estão associados.
Informalmente, um SGBDOO é comportamentalmente consistente se cada método,
função e programa, através de suas assinaturas e códigos, produzirem o resultado esperado. A
assinatura de um método é utilizada para verificar a compatibilidade de tipo dos argumentos
do método dentro da hierarquia. Portanto, este tipo de verificação também é parte do processo
para assegurar a consistência estrutural. No entanto, a verificação de assinaturas não é
suficiente para assegurar a consistência comportamental de métodos, de funções e de
programas. Existem referências dentro de seus códigos que podem se tornar inválidas após
uma alteração no esquema. Com isto, tais alterações podem resultar em comportamentos
anômalos de algumas funções, programas e métodos no tocante à dependência entre os
mesmos. Por exemplo, remover um método pode tornar outros métodos inconsistentes, por
estes referirem-se a um método não mais existente, ou ainda, porque o método que substituiu,
por herança, o método excluído, tem uma assinatura incompatível com a chamada ao método.
Inconsistências comportamentais nem sempre resultam em erros de execução. Podem
existir métodos que, em conseqüência de uma alteração, tenham um comportamento diferente
do anterior à mudança. É preciso ressaltar que os conceitos de falha em um método (métodos
com erros de execução) e de mudança de comportamento de um método (métodos com
resultado diferente do esperado) são distintos, no entanto, o termo geral “consistência
comportamental” é utilizado em ambos os casos.
Para que o esquema e a base continuem estruturalmente consistentes, deverá ser
garantido que:
(1) não ocorrerão conflitos de herança;
(2) a hierarquia de classes deverá permanecer consistente;
7
(3) o conjunto de assinaturas de métodos deverá permanecer consistente;
(4) a base de dados deverá permanecer consistente com o esquema que a descreve.
Em (KIM,1990) as modificações dinâmicas de esquemas de BDs integrados são
divididas em duas dimensões: evolução sobre um esquema único, onde as modificações são
diretamente executadas sobre um único esquema lógico de BD, e evolução de esquemas
utilizando versionamento, onde são criadas versões do esquema referentes às modificações.
1.3 - OBJETIVO DO TRABALHO
A maioria dos SGBDOOs comercialmente disponíveis trata apenas da integridade
estrutural do esquema, não permitindo modificações depois da base instanciada.
Neste trabalho, são tratados os efeitos destas modificações sobre os objetos
instanciados em uma base definida no ambiente do Sistema Gerenciador de Objetos - SIGO
(MOURAa,1995) (MOURAb,1995) (BARROS,1996). Este tratamento tem como objetivo
garantir a integridade de instanciação do esquema da aplicação, além de sua integridade
estrutural e comportamental, através do uso de regras ativas.
Para obtenção deste resultado, as efetivas modificações sobre o esquema da aplicação
são armazenadas numa hierarquia de classes e, conseqüentemente, propagadas aos objetos
instanciados, podendo resultar na criação, retirada ou modificação destes objetos. Esta
propagação é feita através de métodos associados às classes e definidos como regras ativas,
estruturas capazes de reconhecer
eventos específicos que, sob determinadas condições,
executam algumas ações, seguindo o paradigma (ECA) EVENTO/CONDIÇÃO/AÇÃO
(WIDOM,1996) (CERI,1994) (TANAKA,1995). Estas regras são automaticamente ativadas
8
por métodos de aplicações que referenciem objetos e classes durante a manipulação do
esquema.
Em resumo, a partir da determinação da necessidade de suporte à evolução de
esquemas em SGBDOOs e do estudo de alguns aspectos associados, este trabalho tem por
objetivo, usando regras ativas, estender a garantia de consistência aos objetos instanciados em
uma base definida no sistema SIGO, durante o processo de evolução de esquemas.
1.4 - ORGANIZAÇÃO DO TRABALHO
O restante deste trabalho está organizado da seguinte maneira: no capítulo 2 é
apresentado um estudo sobre evolução de esquemas em SGBDOOs no tocante aos aspectos
específicos: evolução de esquemas sobre um esquema único, e evolução de esquemas
utilizando versionamento. Também são apresentados mecanismos de evolução de esquemas
desenvolvidos nos seguintes SGBDOOs: O2, ORION, GEMSTONE e OBJECTSTORE.
No capítulo 3 é descrito o Sistema Gerenciador de Objetos - SIGO, através de uma
visão geral de sua arquitetura, bem como características específicas de modelagem,
persistência de objetos e ambiente de programação.
O capítulo 4 apresenta a proposta deste trabalho, ou seja, as alternativas e mecanismos
adotados para manutenção da integridade de instanciação, a partir das efetivas modificações
sobre o esquema da aplicação, numa hierarquia de classes definida no SIGO.
No capítulo 5 é descrita a funcionalidade de métodos e funções, especificadas no
capítulo 4.
9
No capítulo 6, os efeitos da propagação das operações de evolução de esquemas são
apresentados através de alguns exemplos implementados sobre o protótipo da aplicação SCH
- Sistema de Controle Hospitalar definida no ambiente SIGO.
No Capítulo 7 são finalmente apresentadas as conclusões do presente trabalho, com
suas principais contribuições e propostas de pesquisas futuras.
10
CAPÍTULO 2
EVOLUÇÃO DE ESQUEMAS EM SGBDOOs
2.1 - EVOLUÇÃO DE ESQUEMAS SOBRE UM ESQUEMA ÚNICO
A independência lógica de dados em SGBDs sugere que o problema de modificação
de esquemas pareça extremamente simplificado. Porém esta ainda é a maior questão, apesar
da antigüidade dos BD. Este problema não surgiu com as linguagens de programação, onde
tipos criam dados, em vez de dados criarem tipos.
Os SGBDOOs são suportados por um modelo complexo e destinam-se às aplicações
nas quais mudanças no esquema podem ser freqüentes, fruto de modificações na modelagem
realizadas pelo projetista e que implicarão em operações de correção sobre a definição do
esquema. Este processo necessita de meios que, integrados ao BD, possibilitem a prototipação
do comportamento do esquema frente às modificações.
Em (BANERJEE,1987) é definida uma taxonomia para modificação de esquemas,
bem como (ABITEBOUL,1988), (PENNEY,1987), (ZICARI,1991), também definem
taxonomias similares. Podemos usar cada taxonomia para classificar sistemas de BDs
conforme o tipo de modificação de esquema permitido, isto é, se as modificações permitidas
são em tempo de execução e se o sistema modifica automaticamente instâncias ou programas
existentes. Embora pudessem ser facilmente incluídas como outra modificação, as definições
de relacionamentos não constam destas taxonomias, visto que nos sistemas de BD os
relacionamentos são representados como atributos.
Alguns sistemas permitem simplesmente modificar nomes, incluir e excluir
propriedades. O nome modificado, bem como a inclusão e a exclusão de métodos tipicamente,
11
envolvem modificações apenas para o próprio esquema, já que em vez de nomes,
identificadores são usados para referenciar os tipos das próprias instâncias. A inclusão ou
exclusão de atributos ou relacionamentos, muitas vezes requer técnicas mais sofisticadas,
porque normalmente espaços são reservados para esses dados em cada instância.
As modificações podem ter efeito sobre objetos existentes,
alterando-os
imediatamente no momento em que o esquema é modificado, ou pelo uso de uma
representação de tipo, que permita a coexistência de instâncias de objetos com diferentes
conjuntos de atributos, ou relacionamentos, quer dizer, evolução de esquemas utilizando
versionamento vista no item 2.2 deste capítulo.
Uma alternativa, denominada “lazy update”, representa uma forma postergada de
propagação dos efeitos sobre os objetos. Esta alternativa é mais difícil de implementar, mas
útil por evitar uma sobrecarga no tempo de modificação do esquema. Mais adiante, estas
alternativas serão discutidas como uma questão de implementação.
ORION e seu sucessor ITASCA (ITASCA,1990), bem como o O2 provavelmente
possuem o mais sofisticado tratamento de evolução de esquemas dentre os SGBDOOs
estudados, suportando a maior parte das modificações contidas na taxonomia definida em
(BANERJEE,1987).
Outrossim, uma vez que modificações relativamente complexas podem ocorrer em
muitas aplicações, outra alternativa seria o sistema propiciar boas ferramentas para auxiliar o
usuário final na transformação do esquema, dos objetos, e dos programas, ao invés de prover,
incrementalmente, uma evolução de esquemas mais automática para modificações contidas na
taxonomia sugerida (CATTELL,1991).
Conforme visto anteriormente, alguns autores sustentam que o esquema modifica-se
mais freqüentemente para aquelas aplicações em que os SGBDOOs são mais indicados,
12
embora existam aplicações em SGBDs Relacionais (SGBDRs) onde modificações de
esquema sejam igualmente freqüentes.
Em qualquer caso, a evolução de esquemas é um problema importante e mais
complexo em modelos de dados avançados, por causa do número de características e das
possibilidades de transformações de esquema nestes modelos.
Em (CATTELL,1991) são definidas quatro principais alternativas de manutenção de
instâncias para evolução de esquemas:
(1) “Write-once type” (tipos criados uma vez): a alternativa mais simples, que
consiste em proibir as modificações no esquema, uma vez que instâncias tenham sido criadas.
Se um usuário desejar definir um novo atributo ou modificar a classe, uma nova classe deve
ser definida e as instâncias antigas copiadas para esta. Esta alternativa era adotada pelo SIGO,
anteriormente a este trabalho;
(2) “Immediate Update” (atualização imediata): como o nome sugere nesta
alternativa a mudança do esquema afeta imediatamente as instâncias existentes da classe. Por
exemplo, se um novo atributo é adicionado para uma classe de objetos, todos os objetos
daquela classe são automaticamente atualizados, recebendo um valor “null” para o atributo
adicionado. Esta alternativa, adotada pelo OBJECTSTORE (OBJECTDESIGN,1990) e
GEMSTONE (GEMSTONE,1995) é considerada a mais comum entre os SGBDOOs.
(3) “Lazy Update” (atualização postergada): esta alternativa, adotada pelo ORION
(XIDAK,1990) e pelo O2 (FERRANDINA,1995), consiste em retardar as atualizações para
objetos de uma classe até que estes sejam referenciados. Quando os objetos são recuperados
na memória, uma associação acrescentada ao objeto indica se este foi atualizado pela última
definição. Se o esquema mudou - por exemplo, um atributo foi incluído - a atualização é feita,
então, neste momento. Nesta alternativa, a informação do histórico do esquema e conversão
13
de procedimentos deve ser mantida pelo SGBDOO, até que todas as instâncias da classe
modificada tenham sido convertidas para a nova representação.
Em (HARRUS,1990) é apresentado um estudo sobre o desempenho “lazy update”
versus “immediate update”.
(4) “Schema Mapping” (mapeamento de esquemas): a alternativa mais extrema,
que consiste em manter um mapeamento entre a representação corrente das classes e todas as
versões anteriores, retardando, indefinidamente, as atualizações para objetos existentes, ou até
que uma reorganização seja explicitamente requisitada. Este mapeamento requer a
manutenção de múltiplas versões de um esquema, o que permite aos usuários diferentes
visões de um mesmo objeto. Sistemas como ORION e GEMSTONE provêem esta
funcionalidade. Haja vista a sua complexidade, esta alternativa é de difícil implementação
para os SGBDOOs.
Geralmente, para modificações de esquemas suficientemente complexas, todos os
SGBDOOs tendem a utilizar a primeira alternativa, definindo novas classes e copiando as
instâncias existentes. Alguns sistemas podem manipular diretamente modificações simples,
tais como inclusão ou exclusão de um atributo, de um relacionamento ou de um método e
inclusão ou remoção de subclasses. Embora, de modo direto, em sistemas como o ORION que pode manipular todas as modificações da taxonomia anteriormente apresentada - a vasta
maioria das modificações não coberta pela mesma taxonomia, requer que o usuário
desenvolva programas para criar novas classes e executar transformações de dados do
esquema antigo para o esquema novo.
Provavelmente, a maioria das modificações de esquema do mundo real irá requerer
programação nos SGBDOOs e pesquisas dentre os mais sofisticados algoritmos de
transformação de esquemas.
14
Apesar de academicamente interessante, esta situação, muito provavelmente, não será
mudada. Entretanto, esforços podem ser futuramente alocados em pesquisas de ferramentas
mais sofisticadas, para assistir ao usuário na modificação do esquema. Por exemplo,
ferramentas de transformações gráficas, ou linguagens com o objetivo de simplificar uma
larga classe de transformações, no lugar de fazer melhorias incrementais para facilitar a
modificação de esquemas executadas pelo próprio SGBDOO.
No mínimo, a introdução de linguagens de consulta mais poderosas e de linguagens de
programação mais amigáveis para BD, proporcionam certo grau de simplificação às
atualizações para as instâncias existentes. Esta é a alternativa adotada na maioria dos SGBDs
convencionais.
Qualquer que seja a opção, os usuários também devem tratar da
compatibilidade de programas existentes que usem o antigo esquema. A linguagem de
consulta declarativa pode tomar um longo caminho no sentido de satisfazer esta exigência.
Ferramentas gráficas ou linguagens especificamente orientadas no sentido de
descreverem transformações também podem ser úteis. Existem, portanto, muitos trabalhos e
pesquisas sendo desenvolvidos em busca de soluções, cada vez mais adequadas, para o
tratamento de modificação de esquemas (CATTELL,1991).
2.1.1 - Evolução de Esquemas no O2
O sistema O2 (LÈCLUSE,1989) (DEUX,1991) (SOLOIEV,1992) (ZICARI,1991)
(FERRANDINA,1995) é um SGBDOO comercializado pela O2 Technology. A estrutura
principal de um esquema O2 é constituída por um conjunto de classes relacionadas por
herança e/ou composição. O esquema O2 contém a definição de tipos, funções e aplicações,
15
enquanto a base O2 agrupa, de forma conjunta, objetos e valores que são criados segundo a
definição do esquema.
Um objeto possui uma identidade, um valor e um comportamento definidos pelos
seus métodos. Objetos são instâncias de classes e valores são instâncias de tipos. Um objeto
pode ser compartilhado ou referenciado por diferentes entidades, na qual uma entidade pode
ser um objeto, ou um valor. Por definição, objetos e valores criados em tempo de execução de
programas não são persistentes. Para uma entidade tornar-se persistente, deverá ser direta ou
indiretamente, vinculada a um nome, isto é, uma raiz persistente pertencente ao esquema.
A definição de classe consiste de uma definição de tipo e um conjunto de métodos.
Um tipo é uma descrição genérica de uma estrutura de dados, definido recursivamente como
um dos tipos: atômicos (“integer, boolean, char, string, real, ...”), classes e construtores
(“tuple, set, list...”). Métodos são codificados usando o O2C ou a linguagem C++, as quais
habilitam a manipulação de entidades persistentes e não persistentes.
O encapsulamento no O2 é provido em diferentes níveis. Primeiramente, propriedades
por definição são privadas para suas classes. Os programas são encapsulados em aplicações.
Finalmente, no nível do esquema, o encapsulamento existe, uma vez que elementos de um
esquema não podem ser usados por outro esquema. Visando a melhora do critério de
reusabilidade, O2 provê um mecanismo de importação e exportação de esquemas.
O O2 permite herança múltipla. Quando uma subclasse herda propriedades com um
mesmo nome (de duas ou mais de suas superclasses), mas com definições conflitantes, ocorre
o que chamamos de conflito de herança. Existem duas categorias de conflito. No caso simples
as propriedades têm o mesmo nome, mas suas origens são distintas, neste caso, o O2,
automaticamente, atribui diferentes nomes para as propriedades, de modo que a classe onde
ocorre o conflito herde todas as propriedades, isto é chamado de renomeação. No caso mais
16
complicado, as propriedades com o mesmo nome têm uma mesma origem, mas foram
herdadas por diferentes caminhos na hierarquia, isto é chamado de herança repetida. No caso
das propriedades não terem sido redefinidas ao longo de seus caminhos, nenhum problema
ocorre, pois a classe herdará somente uma cópia da propriedade. O problema existe quando as
propriedades são redefinidas ao longo dos diferentes caminhos.
As modificações de esquema em O2 podem ser executadas tanto de forma incremental,
usando primitivas específicas, como por exemplo, incluindo ou excluindo atributos de uma
classe, como também pela redefinição da estrutura de classes como um todo. As primitivas de
manipulação de esquemas disponíveis, são as seguintes:
(1) Criação de uma nova classe;
(2) Modificação de uma classe existente;
(3) Exclusão de uma classe existente;
(4) Renomeação de uma classe existente;
(5) Criação de uma relação de herança entre duas classes;
(6) Exclusão de uma relação de herança entre duas classes;
(7) Criação de um novo atributo;
(8) Modificação de um atributo existente;
(9) Exclusão de um atributo existente;
(10) Renomeação de um atributo existente;
Independentemente de como a classe é modificada, o O2 executa somente aquelas
modificações que mantêm o esquema consistente.
A integridade comportamental no O2 é tratada da seguinte forma: no caso de haver
referências inválidas a métodos, às funções e/ou a programas, estes não serão alterados. As
17
referências inválidas serão apenas informadas, ficando a avaliação e alteração do código fonte
sob responsabilidade do usuário.
No atual estágio de implementação, o O2 garante a integridade de instanciação pelas
alternativas “immediate update” e “lazy update”, proporcionando ao projetista a possibilidade
de selecionar a que for mais apropriada ao domínio de sua aplicação, a partir de funções de
conversão disponibilizadas pelo sistema.
As atualizações semânticas para manutenção da integridade da base de dados ocorrem
após a modificação do esquema, de acordo com o que tenha sido definido para a aplicação.
Este mecanismo básico é muito simples: o projetista programa funções de conversão, que são
associadas às classes do esquema e que definem como os objetos devem ser reestruturados. Se
nenhuma conversão for especificada pelo projetista, o sistema provê funções de conversão
padrão para as quais não é requerido qualquer tipo de programação. Nesse caso, quando uma
classe do esquema é modificada, o sistema compara cada atributo da classe antes e depois da
modificação e transforma os valores dos objetos de acordo com as seguintes regras padrão:
•
Se um atributo definido em uma classe não estiver presente após sua modificação,
o mesmo foi excluído e será ignorado;
•
Se um atributo aparecer em uma classe após sua modificação, este foi incluído e
será inicializado com valores pré-estabelecidos, por exemplo, zero para inteiros,
nulo para atributos que referenciem classes, etc.;
•
Se um atributo aparecer em uma classe antes e após sua modificação, será
inicializado a partir de valores de conversão pré-estabelecidos, de acordo com a
alteração de tipo.
O projetista poderá sobrepor as funções padrão de transformação, pela definição
explícita de funções de conversão para as classes, após suas modificações no esquema. Neste
18
caso, estas modificações ocorrerão em duas fases. Primeiramente, as classes serão atualizadas,
usando primitivas de atualização do esquema. A segunda fase, denominada fase de conversão
por funções definidas, as inicializações ocorrerão de acordo com o que foi especificado pelo
usuário (FERRANDINA,1995).
2.1.2 - Evolução de Esquemas no ORION
ORION (KIM,1987) (KIM,1990) (XIDAK,1990) é um SGBDOO desenvolvido pela
MCC - Microelectronics and Computer Technology Corporation sob o paradigma da
programação OO. É um sistema multiusuário, multitarefa, destinado as aplicações em IA,
documentos multimídia e CAD/CAM. Foi implementado em Common Lisp e portado para
workstation Sun /UNIX (VELEZ,1989). A Figura 2.1 apresenta uma visão de alto nível da
arquitetura ORION.
Gerenciador de
Mensagens
Subsistema de
Objetos
Subsistema de
Transações
Subsistema de
Armazenamento
FIGURA 2.1 - Arquitetura ORION
O gerenciador de mensagens recebe todas as mensagens enviadas ao sistema ORION,
incluindo mensagens para métodos definidos pelo usuário, mensagens de acesso e funções
19
definidas pelo sistema. Uma mensagem de acesso recupera ou atualiza o valor de um atributo
de classe. Funções definidas pelo sistema incluem: funções para definição de esquemas,
criação e exclusão de instâncias, gerenciamento de transações e outras.
O subsistema de objetos provê funções de alto nível, tais como evolução de esquemas,
controle de versões, otimização de consultas e gerenciamento de informações multimídia.
O subsistema de armazenamento provê acesso aos objetos em disco. Gerencia a
alocação e liberação de segmentos de páginas no disco, recupera e armazena objetos nas
páginas e move páginas do disco e para o disco. Ele ainda gerencia índices criados sobre
atributos de uma classe, para acelerar a avaliação de consultas associativas.
O subsistema de transações provê um controle de concorrência e um mecanismo de
proteção da integridade do BD, enquanto permite a execução intercalada de múltiplas
transações concorrentes. O controle de concorrência usa um protocolo de bloqueio (“locking
protocol”), e um mecanismo de replicação (“logging mechanism”) para recuperar falhas do
sistema e términos anormais de transações geradas pelos usuários.
Aplicações ORION têm considerável flexibilidade para definir e modificar
dinamicamente o esquema do BD, isto é, as definições de classe e a estrutura hierárquica do
diagrama de classes (“class lattice”).
Foi desenvolvida uma taxonomia de operações de modificações de esquemas no
ORION, que consiste de um conjunto de propriedades do esquema chamada invariantes e de
um conjunto de regras para preservar as invariantes (KIM,1990). As invariantes detêm todo o
estado consistente do esquema (“quiescent state”), antes e depois de uma operação de
modificação de esquema. Além disto, provêem fundamento à definição da semântica de toda
modificação significativa de esquema, garantindo que estas não deixarão o esquema em um
estado inconsistente, ou seja, não violarão nenhuma invariante.
20
O conjunto de regras estabelece a seleção das invariantes de uma maneira mais
expressiva.
O ORION suporta dois tipos de modificação de esquemas: modificações para
definições de uma classe em um diagrama de classes (“classe lattice”) e modificações para
estrutura de um diagrama de classes. O primeiro tipo inclui a criação e exclusão de uma
classe, bem como alteração do relacionamento É-UM (IS-A) entre classes. A taxonomia
adotada
para
modificação
de
esquemas
é
uma
versão
daquela
proposta
por
(BANERJEE,1987).
Serão vistas a seguir, as definições semânticas para algumas operações, envolvendo
maior complexidade, a exemplo de modificação de esquema, quando a base já está
instanciada:
(1) Modificações para os componentes de um tipo:
(1.1) Modificações para atributos
(1.1.2) Excluir um atributo V de uma classe C.
Se V for excluído de C, deve também ser excluído recursivamente de outras
subclasses de C. Se C ou qualquer de suas subclasses possuírem outras superclasses que
possuem atributos de mesmo nome V, C herda um dos atributos. Neste caso, V deve ser
excluído de C, ou de qualquer de suas subclasses sem uma reposição. Instâncias existentes
destas classes perdem seus valores para V.
(2) Modificações na hierarquia de classes:
(2.1) Tornar uma classe S uma superclasse de uma classe C.
A inclusão de uma nova classe não pode resultar em um ciclo no diagrama de
classes C e suas subclasses herdam atributos e métodos de S, supondo-se que não ocorra
conflito de nomes. A instância de C e suas subclasses recebem valor nulo para os novos
21
atributos herdados. As operações 1.1.1 e 1.2.1 são aplicadas, respectivamente, para incluir
atributos e métodos de S para C.
(2.2) Remover a classe S de uma superclasse Lista, onde S é superclasse de C.
A exclusão de uma superclasse S de uma classe C não pode resultar num
diagrama de classes desconectado. Neste caso, S seria a única superclasse de C. A superclasse
imediata de S, tornar-se-á a superclasse imediata de C. Portanto, C não perde nenhum atributo
ou métodos que eram herdados das superclasses de S. C perderá somente os atributos ou
métodos que havia herdado diretamente de S. As operações para exclusão de atributos (1.1.2)
e de métodos (1.2.2) são aplicadas, respectivamente, para cada atributo e método que forem
excluídos de C.
(3) Modificações das classes:
(3.2) Excluir uma classe C existente.
Todas as ligações de C para suas subclasses serão excluídas, usando a operação 2.2.
Posteriormente, todas as ligações de C para suas superclasses serão excluídas. Finalmente, a
definição de C é excluída e C é removido do diagrama. As subclasses de C continuam
existindo. Se a classe C era o domínio de um atributo V1 de outra classe C1, então V1 é
referenciado para a primeira superclasse da classe C excluída.
Existem duas maneiras pelas quais um método que contém uma referência para um
atributo, ou para outro método, pode tornar-se inválido. Uma, obviamente, ocorre quando o
método ou o atributo referenciado foi removido. Por exemplo, na Figura 2.2, se o atributo Vx
for removido da classe A, o método Ma que referencia Vx torna-se inválido. O problema pode
ser solucionado pela identificação e invalidação dos métodos afetados pela remoção. Esta
verificação é feita a partir de uma lista que mostra a associação dos parâmetros a cada método
22
das classes e suas subclasses. A invalidação de um método pode por sua vez causar a
invalidação de outros métodos.
O segundo tipo, uma forma mais complexa, ocorre apenas para sistemas que suportam
herança múltipla e pode ser ilustrado pela mesma Figura 2.2. A classe C possui duas
superclasses A e B. A classe A possui o atributo Vx e o método Ma localmente definidos e
Ma referencia Vx. Similarmente, a classe B possui o atributo Vx e o método Mb localmente
definidos e Mb referencia Vx. Vx de A e Vx de B, apesar de possuírem o mesmo nome, são
atributos diferentes. Quando a classe C é criada, ela herda Ma e Mb; mas Vx é herdado apenas
da primeira superclasse A. Então Mb em C vai referenciar Vx que C herdou de A.
Este problema ocorre quando uma classe herda, separadamente, o método e os
atributos referenciados pelo método. Portanto, uma forma simples de resolver o problema é
requerer que ambos sejam herdados conjuntamente, tratando as modificações necessárias aos
atributos referenciados e os métodos que apresentem conflitos de nomes.
A
B
Atributos
Vx
Métodos
Ma-referencia Vx
Atributos
Vx
M étodos
Mb-referencia Vx
C
Atributos
Vx herdado de A
Métodos
Ma- herdado de A
Mb- herdado de B
FIGURA 2.2 - Uma hierarquia de classes com conflito de nomes
23
Para manutenção da integridade de instanciação, o ORION adota a alternativa “lazy
update”. Se as modificações afetarem logicamente as instâncias, o sistema remove as
informações desatualizadas, ou ainda, atribui valores nulos, quando as instâncias são
apresentadas ao usuário. Esta situação pode ser ilustrada a partir do exemplo mostrado na
Figura 2.3. Se o atributo Peso é removido da classe Veículos, o sistema remove os valores
deste atributo para as instâncias O1, O2 e O3. Em outro caso, se o atributo Cor for inserido
para a classe Veículos, o sistema insere o atributo Cor com valor nulo para as instâncias O1,
O2 e O3. Tanto a retirada quanto a inserção de valores somente ocorrem quando as instâncias
forem referenciadas.
VEÍCULOS
Cor
Atributos
Identificação
Peso
Fabricante
O1 O2 O3
FIGURA 2.3 - Classe VEÍCULOS
A alternativa “lazy update” garante um melhor desempenho às operações de
modificações de esquema, embora com a desvantagem das informações desatualizadas
permanecerem no BD até sua efetiva propagação. Além disso, esta alternativa não é viável
para algumas operações significativas, como é o caso da intercalação de mais de uma classe
em uma classe única. Todas as instâncias das classes irão pertencer à nova classe, como
também seus identificadores de classe serão atualizados (KIM,1990).
24
2.1.3 - Evolução de Esquemas no GEMSTONE
O
sistema
GEMSTONE
(BUTTERWORTH,1991)
(GEMSTONE,1995)
(PENNEY,1987) é um produto comercial desenvolvido pela Servio Logic Corporation,
atualmente GemStone Systems Inc., com o objetivo inicial de dar persistência à linguagem
Smalltalk, tornando-a um SGBDOO. O GemStone está disponível para uma extensa faixa de
sistemas baseados em UNIX, dentre eles: Sun SPARC, HP 9000, 700 e 800, e IBM RS/6000.
Está disponível também para plataformas INTEL com sistemas operacionais Windows NT.
Além disso, o sistema provê as seguintes funcionalidades:
•
Ambiente heterogêneo, distribuído, multiusuário, cliente / servidor, com
mecanismo para diversos níveis de segurança e controle de concorrência;
•
Estruturação de dados em diversos níveis;
•
Modificação do esquema sem necessidade de reestruturação do BD;
•
Capacidade de armazenar os diferentes estados do BD, possibilitando assim a
consulta a estados anteriores;
•
Ambiente para desenvolvimento de aplicações, gerenciamento e administração de
classes e métodos através de ferramentas visuais, providas pelo (GSI) GemStone
Smalltalk Interface;
•
A linguagem GemStone Smalltalk, para definição e manipulação de dados, e para
a facilitação de consulta numa linguagem computacionalmente simples.
Apesar de possuir sua própria linguagem, GemStone Smalltalk, os usuários podem
desenvolver suas aplicações em: C++, ParcPlace\Smalltalk (Visual Works), IBM Smalltalk
(VisualAge), Smalltalk V (Visual Smalltalk Enterprise) e C, ou qualquer linguagem que faça
25
chamadas C, tais como COBOL ou FORTRAN. Além disso, é garantida a interoperabilidade
entre os objetos gerados, independentemente da linguagem utilizada (GEMSTONE,1995).
A arquitetura básica do GEMSTONE consiste de um repositório para armazenamento
de objetos e um conjunto de processos. Os dois processos chave são Gem e Stone.
O Gem é um servidor primário e provê o processamento multiusuário em Smalltalk, o
armazenamento e a recuperação de objetos para aplicações e programas desenvolvidos por
qualquer das interfaces, além disso, provê, igualmente, visões consistentes do repositório de
objetos, o gerenciamento de sessões de usuário, o histórico e a paginação de memória para os
objetos acessados quando necessários. Conforme o caso, as aplicações de usuários estarão
conectadas a no mínimo um ou a muitos processos Gem.
O Stone é um coordenador de recursos para o repositório de objetos. É responsável
pelo sincronismo de atividades e garantia de consistência. Como gerenciador de dados provê
o I/O de disco, o controle de concorrência, de autorização, de transações e serviços de
recuperação.
O modelo de dados do sistema é resultante da extensão dos conceitos da linguagem
Smalltalk, ele baseia-se em conjuntos rotulados de valores heterogêneos. Cada elemento de
um conjunto possui um nome único no conjunto e um valor, que pode ser um conjunto ou um
tipo simples.
O desenvolvimento ou manutenção de uma aplicação pode necessitar de modificações
das classes do esquema, o que implica em dois problemas. Primeiro como modificar as
classes sem afetar outros usuários que estejam dependendo de uma versão estável daquela
classe? E segundo, como modificar as instâncias existentes, como reflexo das modificações
na estrutura de classes?
26
Para solucionar estes problemas, o GEMSTONE possui as funcionalidades de
versionamento de esquemas e migração de instâncias.
O versionamento de esquemas permite que os usuários e projetistas trabalhem sobre
diferentes versões do esquema no mesmo repositório, ou seja, projetistas podem modificar e
testar uma versão, enquanto usuários trabalham sobre uma versão estável em uma aplicação
desenvolvida.
A migração de instâncias permite aos projetistas atualizarem automaticamente
algumas, ou todas as instâncias existentes numa classe modificada. Para isto, uma nova
versão da classe pode ser criada de forma que se possa trabalhar com as instâncias existentes
(GEMSTONE,1995).
2.1.4 - Evolução de Esquemas no OBJECTSTORE
OBJECTSTORE
(OBJECTDESIGN,1990)
(LAMB,1991)
é
um
SGBDOO
desenvolvido pela Object Design Inc., especificamente para atender à demanda dos requisitos
C/S (Cliente/Servidor).
É um sistema de gerenciamento completo, provendo compartilhamento flexível e
escalonável de dados num ambiente C/S heterogêneo, além de gerenciar dados sofisticados de
uma maneira natural, diferentemente das soluções de armazenamento com tabelas ou arquivos
hierárquicos. Pode ser caracterizado como um BD baseado em objetos, completamente
distribuído, multi-cliente, com linguagens C, C++, e Smalltalk. O sistema foi projetado para
armazenar
todos
os
tipos
de
dados
para
independentemente de suas complexidades.
27
aplicações
comerciais
e
científicas,
O OBJECTSTORE permite o gerenciamento de transações e o acesso concorrente a
objetos por múltiplos usuários da rede, oferecendo funções de BD, tais como “two-phasecommit”, controle de versões, suporte a evolução de esquemas, recuperação e uma arquitetura
completa multi-cliente / multi-servidor.
No módulo cliente, encontra-se a API “Application programming interface” para
gerenciamento de memória e de memória cache, o serviço para tratamento de esquemas e
transações e mais um módulo de comunicação com o servidor.
No módulo servidor, encontra-se o gerenciador de diretórios, o armazenamento de
dados, o controle de “deadlock”, “backup/restore”, a recuperação de erros e controle de
transações e mais um módulo de comunicação com o cliente.
O OBJECTSTORE está disponível para os sistemas Solaris, AIX, Microsoft
WINDOWS, 0S/2, Netware e as plataformas UNIX mais comuns.
Para definição e manipulação dos modelos de dados, o sistema provê a identidade de
objetos, os atributos inversos, a herança múltipla, os objetos extensos (BLOBs), um
“browser”
interativo
e
uma
ferramenta
interativa
para
projeto
de
esquemas
(OBJECTDESIGN,1990). Além disso, o OBJECTSTORE suporta todos os tipos de dados:
básicos, estruturas e arrays construídos com os tipos básicos, as classes coleções e os
relacionamentos de nível mais alto.
O sistema também oferece facilidades para trabalho cooperativo através de transações
longas e aninhadas. É possível copiar um grupo de objetos para um espaço privado, fazer as
alterações desejadas e, então, devolvê-los à área comum de desenvolvimento, tornando suas
modificações visíveis ao restante da equipe de usuários (LAMB,1991).
Na fase de desenvolvimento de aplicações, o utilitário “ObjectStore Schema
Generator” realiza a compilação, linkedição e armazenamento do esquema num BD especial.
28
Quando a definição da classe muda, o esquema também muda e todos os objetos persistentes
têm de ser migrados. Esta evolução de esquemas é implementada em duas fases: modificação
do esquema e migração das instâncias (fase que, por sua, vez divide-se em: inicialização das
instâncias e transformação das instâncias).
A primeira fase envolve modificações no próprio esquema, por exemplo, incluir ou
corrigir um atributo de uma classe. Esta é a parte trivial do processo, a partir do momento em
que as modificações forem realizadas e as aplicações recompiladas, qualquer nova instância
de objeto será representada de acordo com o novo esquema.
A fase de migração das instâncias envolve modificação na representação dos objetos
persistentes existentes, em princípio, pela inicialização das instâncias existentes nas classes
modificadas, bem como pela modificação de suas representações conforme as definições da
nova classe. Esta atividade pode envolver: inclusão ou exclusão de campos ou sub-objetos,
modificação do tipo de um campo ou exclusão de todos os objetos. Esta fase da migração
também inicializa quaisquer componentes armazenados que tenham sido incluídos e cujo tipo
tenha sido modificado. Na maioria dos casos os novos campos são inicializados com zeros.
Para algumas modificações apenas a fase de inicialização é suficiente. Mas em outros
casos, modificações adicionais de instâncias e estruturas são requeridas para completar a
evolução de esquemas. A Figura 2.4 ilustra as categorias e subcategorias de modificações de
esquema. Estas modificações adicionais são geralmente dependentes de aplicações. Para esta
tarefa, o OBJECTSTORE permite ao usuário definir suas próprias funções de transformação.
Nestas funções, o usuário associa um procedimento “transformador” a cada classe que deseja
transformar. Na fase de migração, para cada instância, são chamadas as funções de
transformação associadas às classes. Este tratamento inclui também as instâncias das
subclasses.
29
Modificações
de
Esquemas
Criação
de
Classes
Redefinição
de
Classes
Redefinição
de
Atributo
Redefinição
de
Herança
Inclusão
de
Atributo
Exclusão
de
Classes
Exclusão
de
Atributo
Redefinição
de
Função
Reordenação
Modificação
de
Domínio
FIGURA 2.4 - Categorias e subcategorias de modificações de esquema.
Funções de transformação são particularmente úteis quando o usuário deseja
determinar o valor de um atributo de uma instância migrada, a partir de valores de um ou mais
campos pertencentes à antiga instância. Para isto, é provida uma função que permite ao
usuário recuperar a antiga instância correspondente à nova instância.
Estas funções também são úteis para ajustar referências locais e estruturas de dados
dependentes dos endereços das instâncias migradas. Por exemplo, uma tabela “hash” pode ser
reconstruída a partir de um procedimento transformador.
Terminada a fase de transformação, todas as instâncias antigas serão excluídas. Se as
instâncias antigas da classe modificada não forem necessárias à fase de transformação, elas
podem ser previamente excluídas na fase de inicialização.
30
Além disso, a funcionalidade de evolução de esquemas permite a “reclassificação”,
uma forma especial de migração de instâncias, onde instâncias de uma classe são
reclassificadas para uma de suas subclasses. Esta reclassificação ocorre durante a fase de
transformação, juntamente com as instâncias migradas.
Para que o usuário tenha uma visão geral das operações envolvidas na inicialização de
instâncias dentro de uma evolução em particular, o relatório “lista de tarefas” descreve os
processos. A lista de tarefas consiste da definição das funções, indicando como as instâncias
migradas de cada classe serão inicializadas. Este relatório pode ser gerado sem que a evolução
seja efetivamente executada, permitindo ao usuário uma simulação dos efeitos de uma
modificação, antes mesmo da migração de dados (OBJECTDESIGN,1990).
2.1.5 - Quadro Resumo dos Aspectos de Correção nos SGBDOOs Estudados
A tabela 2.1 mostra, de forma resumida, os aspectos de correção do esquema, no que
se refere à integridade estrutural, à comportamental e a de instanciação adotadas pelos
SGBDOOs apresentados.
TABELA 2.1 - Aspectos
de correção do esquema nos SGBDOOs: O2, ORION, OBJECTSTORE
e GEMSTONE
O2
ORION
OBJECTSTORE
GEMSTONE
Integridade Estrutural
sim1
sim1
sim1
sim1
Integridade Comportamental
sim2
sim4
sim6
sim2
Integridade de Instanciação
sim3
sim5
sim7
sim8
31
(1)
A partir de primitivas de manipulação do esquema, baseadas na proposta de
(BANERJEE,1987);
(2)
As referências inválidas serão apenas informadas, ficando a avaliação e
alteração do código fonte sob a responsabilidade do usuário;
(3)
A partir de funções de conversão, assumidas pelo sistema ou definidas pelo
usuário, ambas disponibilizadas pelo sistema. O projetista pode selecionar a alternativa “lazy”
ou “immediate update”, conforme a mais adequada para aplicação;
(4)
Os métodos afetados pela modificação são invalidados. A herança conjunta
para métodos e atributos referenciados pelos métodos é condicionada nos casos de herança
múltipla;
(5)
A propagação das modificações é feita diretamente aos objetos instanciados
pela alternativa “lazy update”;
(6)
A avaliação e alteração do código fonte é responsabilidade do usuário. O
relatório “lista de tarefas” informa os efeitos da modificação;
(7)
A partir de funções de transformação responsáveis pela migração de instâncias
ocorrida em duas fases: inicialização e transformação. A alternativa é “immediate update”;
(8)
A alternativa é “immediate update”, a partir da migração automática
de
instâncias ou versionamento.
2.2 - EVOLUÇÃO DE ESQUEMAS UTILIZANDO VERSIONAMENTO
Existem dois aspectos a serem observados para modificações sobre um esquema
único. O primeiro é que o histórico dos objetos modificados não é preservado. Por exemplo,
se o atributo de uma classe é removido, os valores do atributo para as instâncias existentes são
32
irreversivelmente perdidos. Mesmo se este mesmo atributo for novamente adicionado será
tratado como um atributo novo e seus antigos valores não poderão ser mais vistos.
O outro aspecto é que em num ambiente multi-usuário, o impacto das modificações
efetuadas por um usuário afetam as outras visões do BD. Por exemplo, se um usuário
qualquer excluir um atributo de uma classe, ou modificar o relacionamento classe /
superclasse entre duas classes, todos os outros usuários verão estas modificações. Este
problema não é específico dos SGBDOOs, ocorrendo também para os SGBDRs. A solução
tradicional tem sido limitar o privilégio de fazer modificações de esquema ao ADB Administrador do BD, ou suportar visões sobre as relações armazenadas.
Versões de esquema solucionam estas limitações, através do versionamento dos
objetos e do esquema. O sistema gerencia mais de um esquema lógico para um único BD,
apresentando diferentes visões, através de diferentes versões do esquema. Por exemplo, para
remover um atributo de uma classe em uma versão do esquema, um usuário pode criar uma
nova versão que irá refletir esta modificação. Sob esta versão, o usuário não terá acesso aos
valores das instâncias existentes nas classes. Porém, se posteriormente o usuário alterar o
acesso à classe, através da versão prévia, disponibilizará todos os valores dos atributos para
todas as instâncias existentes, antes da criação da nova versão do esquema (KIM,1990).
Assim, o tratamento de evolução de esquemas por versionamento é utilizado para
compor objetos, retornar às situações anteriores e armazenar o histórico do desenvolvimento
do esquema, sem que seja necessário uma reorganização completa do BD e a interrupção do
funcionamento do sistema (CATTELL,1991) (FORNARI,1993) (GOLENDZINER,1993)
(GOLENDZINER,1995).
33
Versionamento em SGBDOOs podem grandemente simplificar aplicações que tenham
de manter múltiplas versões de dados. Sem esta funcionalidade, a própria aplicação teria de
implementar a semântica e manter explicitamente informações sobre as versões no BD.
A Figura 2.5 ilustra o histórico de versões para objetos hipotéticos X, Y e Z. A
configuração C representa um grupo de versões de objeto que são visões mutuamente
consistentes de um BD, outras tantas configurações podem ser definidas.
X3a
X1
X2
X4
X3b
Configuração C
Y1
Y2
Y3
Z3a
Z1
Z2a
Z3a
Z2b
FIGURA 2.5 - Histórico de versões para três objetos X, Y e Z em um BD
As novas versões de um objeto não precisam ser criadas estritamente em seqüência
linear. Podem-se criar novas versões de um objeto X1, X2, X3 e X4 seqüencialmente
modificando a última versão do objeto X, como também criar um ramo de versões X3a e X3b,
ambos derivados de X2. Essas versões podem, mais tarde, ser submetidas a uma versão
intercalada X4. Ramos de versões, isto é, duas ou mais novas versões, independentes de um
34
objeto, podem ser úteis em um ambiente de projeto, quando dois ou mais usuários devem,
independentemente, trabalhar em revisões que envolvam alguns dos mesmos objetos.
Eventualmente, os usuários devem intercalar seus trabalhos, isto é, criar uma versão
nova de um objeto que se sobreponha a esta separação de versões ramificadas, com o objetivo
de construir um projeto consistente. Portanto, o histórico de versões conterá pontos de
ramificação e de intercalação.
Todos os SGBDOOs com versionamento provêem mecanismos para examinar o
histórico das versões e devem permitir histórico de versões com ramificações e intercalação.
Em alguns sistemas, versões podem ser classificadas como transiente, de trabalho e
liberada. A versão transiente é promovida para versão de trabalho e torna-se visível para
outros usuários no final da sessão. E uma versão de trabalho é promovida a uma versão
liberada quando objetos são congelados para uso (GOLENDZINER,1993).
Versões podem também ser aplicadas para compor objetos, a partir da criação de
novas versões de um grupo de objetos. O SGBDOO deve também permitir versionamento do
próprio esquema, simplificando deste modo o tratamento de evolução de esquemas.
Configuração, uma facilidade adicional, é uma coleção de versões de objetos
mutuamente consistentes em um BD. Por exemplo, se atualizações são feitas para 20 módulos
de software para criar uma nova versão de um sistema operacional, então essas 20 novas
versões de objeto, mais as versões existentes de todos os outros módulos do sistema
operacional, representam uma configuração.
Existem duas alternativas para configurações em um SGBDOO:
(1)
O SGBDOO pode prover um mecanismo, mas não uma política para
gerenciamento de configurações, deixando o problema de gerenciamento de configurações ser
35
resolvido pelo usuário. Essa alternativa, por exemplo, é adotada pelo OBJECTIVITY/DB
(OBJECTIVITY,1990);
(2)
O SGBDOO pode implementar configurações automaticamente, com uma
política de opções especificadas pelo usuário. Essa alternativa é adotada pelo
OBJECTSTORE.
No primeiro caso, o SGBDOO deve prover um mecanismo suficiente para
implementar configurações em uma aplicação convenientemente. Por exemplo, em
OBJECTIVITY/DB, objetos compostos podem ser usados para representar configurações.
OBJECTIVITY/DB provê três opções de manutenção de versões para relacionamentos
entre objetos: “move, drop e copy”. Um atributo inverso, representando um relacionamento
em um objeto versionado, é acrescentado com uma das opções, quando uma nova versão do
objeto é criada, a ação correspondente é tomada.
(1) Move: a referência tem de ser movida para a nova versão do objeto, e deve ser
alterada para “nil” na versão antiga;
(2) Drop: a referência tem de permanecer com a versão antiga, e tem de ser alterada
para “nil” na nova versão; e
(3) Copy: as versões nova e antiga devem possuir a mesma referência.
Existem diferenças na funcionalidade provida pelos SGBDOOs. Por exemplo, ORION
provê somente “move e drop” semânticos para referência e VERSANT (VERSANT,1990)
não tem objetos compostos. No entanto, a filosofia geral destes sistemas é a mesma: usuários
definem seus próprios gerenciamentos de configurações sobre primitivas providas.
Uma alternativa para configurações é construir o gerenciamento dentro do SGBDOO.
Existem algumas formas pelas quais isto pode ser feito, dependendo da política de tratamento
36
para versões, referência ou “queries”. Provavelmente, a alternativa adotada pelo
OBJECTSTORE é a mais simples.
Configurações podem também ter outros usos, elas podem, por exemplo, ser usadas
como uma base para autorizar acessos às diferentes versões de dados, sem a preocupação de
serem providas pelo próprio SGBDOO ou de serem construídas pelo usuário
(CATTELL,1991).
Versões têm sido implementadas em produtos e protótipos, apesar de
diferirem largamente em suas semânticas. ORION, ITASCA, VERSANT, OBJECTSTORE,
OBJECTIVITY/DB, GEMSTONE e outros provêem esta funcionalidade.
Provavelmente, o controle de transações continuará a ser útil em seu objetivo de
recuperação, porém, a utilização de versões com propósito de controle de concorrência está
ganhando popularidade como uma alternativa para transações aninhadas e conversacionais. O
uso de múltiplas versões de objeto, permitindo coordenação entre múltiplos usuários e
diferentes cópias de objetos, tem recebido considerável atenção na literatura (PREVOT,1994)
(FORNARI,1993) (GOLENDZINER,1993) (GOLENDZINER,1995) (KIM,1990) (KATZ,
1990). Com o tempo, possivelmente, um conjunto de características para versões será
definido (CATTELL,1991).
37
CAPÍTULO 3
SIGO
3.1 - UMA VISÃO GERAL
SIGO (Sistema Gerenciador de Objetos) é um protótipo em desenvolvimento no
Instituto Militar de Engenharia - IME/RJ, concebido para suportar aplicações não
convencionais de BDs, provendo um conjunto de ferramentas, em um ambiente amigável e
integrado, para o usuário desenvolver suas aplicações (MOURAa,1995) (MOURAb,1995)
(BARROS,1996).
A Figura 3.1 representa a configuração do sistema em módulos cujas funcionalidades
serão descritas a seguir.
IN T E R F A C E
M A M E
L ID A S
L IM O S
M A CRO
E squ em a
G e re n c ia m e n to d e
O b je to s C o m p le x o s
G e re n c ia m e n to d e
O b je to s M u ltim íd ia
BD
S is te m a d e
H ip e rd o c u m e n to s
FIGURA 3.1 - Arquitetura do SIGO
38
C am pos
Longos
MAME (Módulo de Aquisição e Modelagem de Esquemas) (GUIMARÃES,1995) é o
módulo responsável pelo processo de modelagem de objetos do mundo real, a partir de uma
interface OO amigável. As classes e seus inter-relacionamentos são representados por um
modelo de rede semântica OO (XAVIER,1989) (ROSSETI,1991). Os usuários definem os
componentes estáticos a partir da composição dos tipos disponíveis no sistema, tais como:
classes, atributos de classes, restrições e índices; e os componentes dinâmicos: tais como
métodos e regras.
As instâncias são obtidas a partir das aplicações desenvolvidas. Anteriormente a este
trabalho, a manutenção de integridade à parte extensional ainda não era suportada, isto é, após
a criação da primeira instância para uma das classes da base, não havia mais possibilidade de
modificação do esquema definido. A manutenção de integridade do esquema conceitual é
mantida, dinamicamente, pelo sistema durante as operações de evolução.
Uma vez construído, o esquema é traduzido em código na linguagem C++, gerando,
automaticamente, métodos genéricos para a construção de classes, a recuperação e
manipulação dos objetos das classes, além de outros. Esta funcionalidade é atribuição do
módulo LIDAS (Linguagem para o Desenvolvimento de Aplicações), também responsável em
prover ao usuário um ambiente para o desenvolvimento de aplicações (ARAÚJO,1993).
MACRO (Módulo de Armazenamento, Criação e Recuperação de Objetos complexos)
corresponde ao gerenciador de objetos no sistema (FREITAS,1991). Ele trata do acesso e do
armazenamento dos objetos, mapeando-os para estruturas em disco e recuperando-os, quando
necessário, para memória principal. O MACRO inclui o Gerenciador de Objetos Multimídia,
que implementa estratégias de armazenamento específicas para campos longos (imagens,
vídeos, sons e textos) (LIMA,1993).
39
De modo a oferecer meios de consulta à base de objetos, o SIGO oferece, através do
módulo LIMOS (Linguagem Interativa para Manipulação de Objetos), uma linguagem de
consulta declarativa, do padrão SQL (COSTA,1992) (COLLYER,1996).
Finalmente, o sistema de hiperdocumentos (QUADROS,1996) é um módulo que
provê a habilidade de produzir hiperdocumentos construídos a partir de componentes do
esquema conceitual ou de componentes multimídia externos.
A interface apresentada na Figura 3.1 possui, de fato, um propósito bem mais amplo
do que a simples modelagem de esquemas realizada pelo MAME. Além da modelagem, são
agregadas as possibilidades de geração das definições em C++, através da chamada à LIDAS,
e acesso ao módulo de consultas interativas (LIMOS) estabelecendo, deste modo, um acesso
único às funcionalidades do sistema.
3.2 - MODELO DE OBJETOS E O ESQUEMA CONCEITUAL
O modelo de objetos no SIGO está fundamentado especificamente na rede semântica
MORSO (Modelo em Rede Semântica Orientada a Objetos) (ROSSETI,1991). Esta
representação é graficamente traduzida por um grafo acíclico orientado, constituído de nós
interligados por arcos. Este grafo expressa em uma parte a classificação e identificação
precisa destes nós e arcos (e eventualmente pelas suas restrições); e em outra parte a definição
de funções de manipulação associadas à rede. A quádrupla - (CN) categoria de nós; (CA)
categoria dos arcos (CR) categoria de restrições e (CO) categoria de operações - define o
modelo.
A Figura 3.2 mostra os componentes de um modelo de objetos através de um esquema
hierárquico, onde o arco g representa uma generalização, o arco a uma agregação e o arco c
40
uma classificação. Objetos no SIGO são tipados e associados a uma classe, sendo
representados por um par (identidade, valor). A classe agrupa objetos com as mesmas
propriedades (estrutura e operações), encapsulando dados e comportamento. Todas as classes
de usuários, definidas em um esquema conceitual, são uma subclasse da metaclasse
CLASSES, que agrupam toda a estrutura de classes no sistema. Cada classe criada no SIGO
possui um único nome e um único identificador “tipo surrogate” gerado pelo sistema.
O modelo prevê a possibilidade de criação de índices sobre os atributos e de restrições
de especialização, definidas obrigatoriamente em uma subclasse. Estas últimas associam uma
condição para um atributo, expressando que o objeto não pode ser criado, durante a
instanciação da subclasse, a menos que a condição seja satisfeita por um dos atributos
herdados.
a
arcos
a: agregação
g: generalização
c: classificação
mandatório
a
não mandatório
nome
restrições
único
não nulo
ambos
nenhuma
c
valor
intervalo
estado
a
a
a
a
tipo basico
g
a
c
valor
classe
a
restrições
características
a
a
a
operações
id
OBJETO
a
a
índices
a
g
c
imagem
som
texto
vídeo
int, real
data
bool
char
operações
construtor
primitivo
c
nome
c
tupla
lista
conj
FIGURA 3.2 - Definição de Objeto no SIGO
41
Similarmente, tipos primitivos e construtores são tipos básicos e representam o
principal componente das classes; além disso, são recursivamente usados para formar os
TAOs (Tipos Abstratos de Objetos). Cada tipo primitivo e construtor (conjunto, lista e tupla)
possui seu próprio grupo de operações. Tipos primitivos (inteiro, real, booleano e data)
possibilitam a inclusão de duas propriedades: características para definir se o atributo é
único (valores iguais não são permitidos), não nulo, ambos ou nenhum (sem características)
e restrições, que são diretamente aplicadas sobre o atributo e, quando necessário, são
concatenadas pelo operador “OU”. O usuário pode definir para um atributo um dos três tipos
de restrições: valor, intervalo e estado.
Os tipos longos também estão disponíveis no sistema e possuem uma lista de funções
intrínsecas, que possibilitam a captura e recuperação de objetos multimídia relativos à
imagem, ao som e ao texto.
A herança no SIGO é total, isto é, as subclasses herdam todas as propriedades de sua
susperclasses. O sistema suporta herança múltipla a partir de regras que resolvem o problema
de conflitos. Além disto, não é disponibilizada qualquer linguagem de definição de dados
específica, de forma que o esquema conceitual é construído a partir do MAME. Este módulo
provê uma valiosa interface que permite ao usuário especificar, explícita e interativamente, as
classes com seus respectivos atributos, métodos, restrições, índices e chaves.
A Figura 3.3 descreve uma aplicação simples - incluindo objetos multimídia representada no modelo de dados do SIGO e traduzida de acordo com a semântica específica.
PESSOA é a generalização de ESTUDANTE e de EMPREGADO (arco g). PESSOA é o
resultado da agregação de nome, foto (tipo imagem) e idade (arco a). Da mesma forma,
EMPREGADO é a agregação de matrícula, de salário, de categoria e de projetos (arco a) que,
42
por sua vez, é formado por uma lista de PROJETO (arco l). Os demais objetos seguem a
mesma semântica.
As Figuras 3.4, Figura 3.5 e Figura 3.6 apresentam alguns detalhes capturados pela
interface, referentes ao exemplo mostrado na Figura 3.3.
A classe EMPREG é selecionada e o atributo PROJETOS é criado. A classe
PROJETO é selecionada como elemento da lista PROJETOS, definida para o máximo de sete
elementos.
a
Categoria
Salário a
a
a
Matrícula
Foto
a
Nome
Idade
PESSOA
g
a
g
EMPREGADO Curso
a
g
Projetos
ESTUDANTE
a
ESTAGIÁRIO
l
PROJETO
Currículo
Categoria
a
a
a
g
Descrição
FIGURA 3.3 - Exemplo de uma aplicação SIGO
Observa-se, no entanto, que os atributos definidos na classe aparecem em letras
maiúsculas e aqueles que foram herdados de uma superclasse em letras minúsculas.
43
FIGURA 3.4 - Seleção da Classe EMPREG e criação do atributo PROJETOS
FIGURA 3.5 - Seleção da Classe PROJETO como elemento da Lista PROJETOS
44
FIGURA 3.6 - Definição da Lista PROJETOS para o máximo de 7 elementos
A manipulação de objetos pode ser feita de duas formas. Primeiro, pela linguagem de
consulta LIMOS e, nesse caso, o encapsulamento de objetos não é preservado e, segundo,
pelo ambiente de programação LIDAS, descrito no item 3.5, que preserva o encapsulamento
(MOURAb,1995).
3.3 - EVOLUÇÃO DE ESQUEMAS
O processo de evolução de esquemas está intimamente ligado ao modelo conceitual de
objetos e inclui alguns aspectos importantes referentes à consistência intencional e extensional
do BD, bem como aos mecanismos que garantem sua integridade. O capítulo 1 descreve de
forma mais detalhada todos estes aspectos e outros conceitos utilizados adiante.
45
Para garantia da integridade estrutural foram definidas algumas invariantes
determinadas de acordo com o modelo de dados do sistema (GUIMARÃES,1995), seguindo a
taxonomia proposta em (BANERJEE,1987). As invariantes, descritas a seguir, determinam as
condições que devem ser satisfeitas para que o esquema seja considerado correto. Deste
modo, constituem parâmetros de comparação que devem ser verificados durante a realização
de cada modificação:
(1)
O grafo que representa o esquema é composto por nós (classes) nomeados e
arcos (conjunto, lista, generalização, etc.) rotulados; ele é acíclico, direcionado, e conexo, isto
é, todas as classes são obrigatoriamente descendentes da metaclasse oferecida pelo sistema;
(2)
Dentro do esquema, todas as classes possuem nomes distintos e, dentro de
cada classe, os nomes das propriedades herdadas ou definidas são necessariamente distintos;
(3)
Todas as propriedades de uma classe possuem origem conhecida, de maneira a
evitar a replicação de propriedades, caso estas sejam herdadas a partir de uma mesma origem
e através de diferentes caminhos;
(4)
Em qualquer caso, uma subclasse herda todas as propriedades de suas
superclasses. Caso se contrarie a propriedade invariante número 2, é observado o previsto na
propriedade número 3, onde ocorrerão conflitos de herança.
O sistema prevê também, para garantir a correção do esquema ao longo da ocorrência
de alterações, um conjunto de regras de manutenção do esquema.
Com base nestas regras foi definido um conjunto de operações para modificação do
esquema. Em (GUIMARÃES,1995) estas operações são descritas detalhadamente, juntamente
com as regras a serem aplicadas para manutenção da integridade estrutural e comportamental
do BD.
46
A integridade comportamental é mantida para os métodos gerados automaticamente
pelo sistema, visto que todos aqueles pertencentes às classes cujas propriedades sofreram
modificação são regerados pela LIDAS (ARAÚJO,1993). Quanto aos demais métodos, cabe
ao usuário a responsabilidade de modificação.
A exemplo de outros SGBDs e anteriormente a este trabalho o SIGO não permitia, até
então, que o esquema fosse modificado uma vez que a base houvesse sido instanciada. Os
capítulos 4 e 5 descrevem as alternativas e mecanismos utilizados para manutenção da
integridade de instanciação, principal objetivo deste trabalho.
3.4 - PERSISTÊNCIA DE OBJETOS
A arquitetura SIGO está baseada no modelo relacional estendido para armazenamento
de objetos. Neste modelo classes e tipos construtores são vistos como objetos, possuem um
identificador tipo “surrogate” e são mapeadas diretamente como relações (ou tabelas). As
ligações entre as classes e as suas superclasses são fisicamente implementadas por seus
identificadores, isto é, o identificador da superclasse é repetido em suas subclasses. Junções
são requeridas para agrupar partes de uma instância oriunda de várias classes. Os atributos
herdados das superclasses são armazenados nas tabelas correspondentes às classes onde foram
definidos. Os subobjetos ou objetos compostos são representados no objeto principal por seus
identificadores e, conseqüentemente, são armazenados na classe tabela a qual pertencem.
A Figura 3.7 mostra um exemplo de tabelas geradas a partir de um esquema conceitual
de uma aplicação. PESSOA é superclasse de EMPREGADO, que é uma agregação dos
atributos: nome, identidade, foto (tipo imagem) e uma lista de dependentes (tipo PESSOA).
47
EMPREGADO é uma agregação de: nível, salário e departamento. DEPARTAMENTO é
constituído por: número e nome do departamento e uma lista de empregados.
Ident
Foto
a
a
Nome
a
Depend
PESSOA
a
g
Nível
a
Salário
a
EMPREGADO
NumDepto
l
a
a
DEPARTAMENTO
NomeDepto
a
PESSOA (Id_Pessoa, Ident, Nome, Id_Foto, Id_Lista_Depend)
DEPARTAMENTO (Id_Depto, NumDepto, NomeDepto, Id_Lista_Emp)
EMPREGADO (Id_Empregado, Nível, Salário)
LISTA_DEPENDENTES (Id_Lista_Depend, Id_Pessoa)
LISTA_EMPREGADOS (Id_Lista_Emp, Id_Empregado)
FIGURA 3.7 - Tabelas representando um esquema conceitual
É importante observar que apesar do atributo “Departamento” ter sido definido no
projeto conceitual, ele não é fisicamente implementado na relação EMPREGADO. Isto
acontece para evitar redundância, como também é o caso da lista de empregados definida na
classe DEPARTAMENTO. O esquema gerou cinco tabelas, conforme as classes descritas no
modelo. Listas e conjuntos também possuem identificadores do tipo surrogate, e são
48
representados de forma similar às classes. Cada tabela de tuplas corresponde a uma lista ou
conjunto de elementos, seguido do identificador de objeto de cada classe ao qual pertencem.
A ordem em uma
lista é definida por um índice secundário, cuja chave é o
identificador da lista. Elementos da mesma lista possuem o mesmo identificador na tupla.
Armazenamento de conjuntos acontece de forma similar, exceto pela ordenação por índice
que não existe.
Os atributos multimídia são representados por seus identificadores de objetos, criados
por uma classe associada a cada mídia. Lista e conjuntos de campos longos (imagem, som,
vídeo e texto) são construídos da mesma forma acima descrita. No exemplo da Figura 3.7 o
Id_Foto é criado pela classe IMAGEM, sempre que um objeto PESSOA é criado.
Além disso, um objeto no SIGO pode ser representado de duas formas: na memória
principal, no mesmo formato de objetos em C++, e na memória secundária, mapeado em
tabelas de acordo com o exemplo mostrado na Figura 3.7. As operações de mapeamento de
objetos entre a memória principal e a memória secundária são feitas através da técnica
“swizzling” (MOSS,1992), que transforma cada identificador em um ponteiro e vice-versa.
As rotinas de acesso as tabelas são feitas através de chamadas para uma camada intermediária
do sistema de armazenamento, que interage diretamente com as funções do PARADOX
ENGINE (BORLAND,1992).
Outro aspecto importante a ser ressaltado é que a persistência de objetos é totalmente
transparente aos usuários. Suas aplicações enxergam os objetos apenas em seu formato C++
(MOURAb,1995).
O processo de mapeamento do esquema conceitual para o C++, bem como seu uso
será descrito a seguir no item 3.5.
49
3.5 - AMBIENTE DE PROGRAMAÇÃO
A Figura 3.8 representa o ambiente de desenvolvimento de aplicações.
Após a definição do esquema conceitual pelo usuário através do módulo MAME, o
módulo LIDAS gera um conjunto de métodos em C++. Estes constituem o conjunto de
operadores à disposição do usuário, provendo a possibilidade de criação e manipulação de
objetos através de programas C++. O arquivo DEFS.H contém, não somente a definição do
esquema da classe em C++, mas também os métodos básicos associados que são
automaticamente gerados para criação, recuperação, exclusão, manipulação e persistência de
objetos. Desta forma, os usuários podem desenvolver suas aplicações através da ativação
destes métodos, sem se preocuparem com suas implementações. Na realidade, estas
definições representam o mapeamento do esquema em estruturas de classes que expressam o
ambiente de aplicações no SIGO.
Adicionalmente, existe uma classe COLEÇÃO para cada classe criada no esquema,
com o propósito de gerenciar as instâncias das classes. Os objetos criados e aqueles existentes
na memória principal são grupados na classe OBJETO. A classe OBJETO é transparente para
o usuário e é superclasse de todas as instâncias da classe no sistema SIGO. Através desta
classe, todos os identificadores são criados e associados aos objetos correspondentes. Os
atributos do tipo conjunto e lista não são incluídos no construtor da classe. Os objetos são
criados com suas listas e conjuntos inicialmente vazios. O processo de instanciação de listas e
conjuntos é feito após a criação do objeto principal. Todo objeto - do tipo lista ou conjunto possui as classes genéricas LISTA ou CONJUNTO, respectivamente, como superclasse. Estas
classes são intrínsecas à estrutura de classes do SIGO e possuem seus próprios métodos
(operações básicas de listas e conjuntos).
50
Quando ocorre o acesso às funções MACRO no processo de persistência, os índices
definidos pelo usuário são atualizados automaticamente com seus novos valores.
MAME
USUÁRIO
LIDAS
MACRO
DEFS.H
(classes e métodos
em C++)
APLICAÇÃO
FIGURA 3.8 - Ambiente de desenvolvimento de aplicações
Durante a especificação do processo de instanciação e recuperação, o principal
problema é a necessidade de fragmentação do objeto C++ em vários registros para serem
mapeados nas respectivas tabelas. Conseqüentemente, no processo de recuperação o problema
é o oposto, ou seja, recuperar o registro físico e construir um objeto C++. Isto é resolvido
porque um objeto C++ possui suas implementações de dados encapsuladas. Assim alguns
métodos foram criados pelo módulo LIDAS buscando acessar individualmente, para cada
classe do esquema conceitual, os valores dos atributos. O usuário necessita apenas dos
métodos de manipulação das classes e suas coleções.
Uma classe específica contém os métodos básicos para instanciar e recuperar objetos
multimídia (som, imagem, texto e vídeo). Estes métodos podem ser utilizados no
51
desenvolvimento de aplicações e são armazenados em estrutura separada no módulo MACRO
como mostrado na Figura 3.1.
52
CAPÍTULO 4
USO DE REGRAS ATIVAS NO TRATAMENTO DE EVOLUÇÃO DE ESQUEMAS
NO SIGO
4.1 - ASPECTOS DE REGRAS ATIVAS
Com o objetivo de garantir a integridade de instanciação do esquema da aplicação no
SIGO, buscou-se aproveitar os conceitos de regras nos BDs Ativos (WIDOM,1996)
(TANAKA,1995) (CERI,1994). Para isto, as efetivas modificações sobre o esquema são
armazenadas numa hierarquia de classes, juntamente com métodos definidos como regras
ativas, responsáveis pela propagação destas modificações aos objetos instanciados. Estas
regras, por sua vez, são automaticamente ativadas por métodos das aplicações que
referenciam objetos e classes durante a manipulação do esquema.
4.1.1 - Uma Visão Geral
BDs Ativos são sistemas com toda a funcionalidade dos BDs convencionais,
estendidos para incluir regras ativas. Regras ativas são estruturas capazes de detectar a
ocorrência de eventos, monitorar condições especificadas sobre o estado do BD e executar
algumas ações, independentemente, de qualquer solicitação externa ao sistema.
Recentemente, sua utilização tem sido estendida além das funcionalidades internas dos
BDs, e aplicadas a uma variedade de problemas, tais como: controle de tráfego aéreo,
planejamento de operações militares, controle de processos e de produção, gerência de redes,
monitoração em hospitais, bolsa de valores, monitoração de objetos móveis, monitoração do
53
meio ambiente, engenharia de software, automação de escritórios, trabalho cooperativo e
outros. Além disso, constituem um mecanismo natural para reforçar a restrição de integridade,
verificação de autorização, manutenção de dados derivados, e etc.
Na realidade, regras de BDs Ativos são estruturas definidas pelos usuários e
aplicações para especificação de um comportamento ativo desejado. Em sua forma mais geral,
estas regras, são constituídas de três partes (EVENTO / CONDIÇÃO / AÇÃO (ECA)) e
suas semânticas de execução são as seguintes:
(1) EVENTO
Especifica o que causa o disparo da regra (“triggered”). Os eventos de disparos
podem ser dos seguintes tipos:
•
Modificação de dados: um evento de modificação de dados pode ser especificado
como uma criação, exclusão ou modificação de um objeto particular, ou qualquer
objeto em uma classe particular. Também pode ser especificado como uma
chamada a um método particular que modifica objetos;
•
Recuperação de dados: um evento de recuperação de dados pode ser especificado
como uma busca a um objeto, ou como chamada a um método particular que
recupera objetos;
•
Tempo: um evento temporal pode especificar que uma regra deve ser disparada em
um tempo absoluto (ex: “26 abr 96 às 09:00h”), em um tempo repetido (ex: “todo
dia às 12:00h”), ou em intervalos periódicos (ex: “a cada dez minutos”); e
•
Definido por aplicação: eventos definidos por aplicações podem ser especificados,
permitindo que uma aplicação declare seus próprios eventos (ex: “temperatura
muito alta” ou “motor principal parou”). Portanto, uma aplicação pode notificar ao
54
sistema de BD a ocorrência de um evento, disparando deste modo todas as regras
associadas.
Estes exemplos são de eventos simples. Eventos também podem ser compostos, isto é,
combinações de eventos simples ou outros eventos compostos. Para combinação de eventos
são usados operadores lógicos, seqüência ou composições temporais. Eventos compostos
muito complexos são possíveis se uma linguagem de especificação de eventos for baseada em
expressões regulares, ou numa gramática livre de contexto.
(2) CONDIÇÃO
Especifica uma condição adicional a ser verificada, uma vez que uma regra é
disparada antes da ação ser executada. As condições podem ser dos seguintes tipos:
•
Predicados do BD: a condição pode especificar um predicado simples ou
composto por operações lógicas, relativo ao estado do BD (ex: “quantidade de
estoque menor que 10”);
•
Consultas do BD: a condição pode especificar uma consulta a partir de uma
linguagem de consulta do SGBD. Por exemplo, uma condição especificada como
uma consulta para recuperar todos os dados, cujos valores estão abaixo de certo
limite, expressando a condição verdadeira para execução da ação. Como
predicados, as condições, que são consultas, podem usar uma linguagem restrita
para garantir uma avaliação eficiente; e
•
Procedimentos de aplicações: a condição pode ser especificada como uma
chamada a um procedimento escrito, em uma linguagem de programação de
aplicação (ex: “máximo_excedido ( )”), onde o procedimento pode ou não acessar
o BD. Este procedimento retorna uma condição “verdadeira” ou “falsa”
determinando as ações a serem executadas sobre o BD.
55
Em todos esses casos, se a linguagem de regras permite eventos parametrizados, então
a linguagem de condição, provavelmente, incluirá um mecanismo para referenciar o valor
ligado aos parâmetros dos eventos.
(3) AÇÃO
Em uma regra de BD Ativo, a ação é executada quando a regra é disparada e o
resultado de sua condição é verdadeiro. As ações podem ser dos seguintes tipos:
•
Operações de modificações de dados: são ações que especificam a criação ou
exclusão de objetos;
•
Operações de recuperação de dados: são ações que especificam a busca de objetos;
•
Outros comandos de BD: adicionalmente para operações de recuperação e
modificação de dados. Muitos sistemas de BD suportam operações para definição
de dados, operações para controle de transações (ex: “commit”, “roolback”) e
operações para conceder e revogar privilégios, etc.;
•
Procedimentos de aplicações: a ação da regra pode ser especificada como uma
chamada a um procedimento escrito em uma linguagem de programação de
aplicação, onde o procedimento pode ou não acessar o BD.
Se a linguagem de regras permitir valores a serem passados da condição para ação,
então a linguagem de ação, provavelmente, incluirá um mecanismo para referenciar estes
valores. Algumas linguagens de regras de BDs Ativos permitem que uma regra especifique
um conjunto de ações, usualmente com uma ordenação, de forma que múltiplas ações sejam
seqüencialmente executadas (CERI,1994) (WIDOM,1996).
As pesquisas na área de BDs Ativos estão divididas em tecnologias baseadas em BDs
Relacionais e em BDOOs. Estes últimos também estão sendo estendidos com a capacidade de
56
regras ativas. Além disso, estas pesquisas têm caminhado no sentido de prover métodos e
ferramentas de projeto que facilitem o uso efetivo desta tecnologia (CERI,1994).
4.1.2 - Semântica de Regras Ativas
O paradigma geral usado por todos os SGBDs Ativos é o seguinte:
Uma vez que um conjunto de regras é definido, o SGBD Ativo monitora os eventos
relevantes e, para cada evento ocorrido, armazena a(s) regra(s) correspondente(s) num “pool”
de regras disparadas. Há um processo de escolha da regra a ser tratada e, uma vez escolhida a
regra, o SGBD avalia a condição da regra. Se sua condição for verdadeira, a ação da regra é
executada. Este algoritmo é mostrado na Figura 4.1.
ENQUANTO existirem regras disparadas FAÇA
1. Encontre uma regra disparada R
2. Avalie a condição de R
3. SE a condição de R é verdadeira
ENTÃO execute a ação de R
FIGURA 4.1 - Algoritmo para o processamento de regras
O algoritmo para o processamento de regras mostrado na Figura 4.1 caracteriza um
simples modelo de execução iterativo de regras, no qual estas são selecionadas e processadas
uma de cada vez. Este modelo não considera:
57
(1) O processamento recursivo das regras, em que a ação de uma regra pode causar um
evento que dispara outra regra; e
(2) A interação entre as transações “ordinárias” do BD e aquelas geradas pela ação das
regras.
Estes dois aspectos do processamento de regras são problemas importantes a serem
cobertos pela pesquisa de BDs Ativos, já que tanto o processamento recursivo, quanto à
interação transações/regras, podem levar a um comportamento consideravelmente diferente
do simples processamento iterativo (TANAKA,1995).
4.1.3 - Seleção da Regra e o Modo de Acoplamento
A maioria do BDs Ativos permite que várias regras sejam disparadas ao mesmo
tempo. Conseqüentemente, um processo de seleção sobre o conjunto de regras disparadas,
pode tornar-se necessário. Este processo é similar à resolução de conflitos utilizada em
linguagens de IA. Existem numerosas possibilidades para resolução de conflitos; a mais
simples consiste em deixar a escolha aleatória para o próprio sistema, o que introduz um grau
não determinístico total no processo. Geralmente, a regra é escolhida com base em prioridades
especificadas na definição da regra, no caso de regras com igual prioridade, o sistema utiliza a
seleção aleatória.
O controle sobre a execução das regras disparadas acomoda o conceito de modos
distintos de acoplamento, que especificam o relacionamento entre o evento disparador da
regra e a avaliação da condição, ou entre esta e a execução da ação. Os seguintes modos de
acoplamento são possíveis:
•
Imediato
58
A avaliação da condição (ou a execução da ação) ocorre imediatamente quando,
dentro da transação, o evento é sinalizado (ou a condição é avaliada como verdadeira);
•
Retardado
A avaliação da condição (ou a execução da ação) é adiada até o ponto de término da
transação, mas antes que a transação termine (“commit”);
•
Desacoplado, mas dependente da causa
A avaliação da condição (ou a execução da ação) ocorre depois do ponto de término
da transação (“commit”). Se o término da transação não ocorre, a condição não é avaliada (ou
a ação não é executada);
•
Desacoplado, mas independente da causa
A avaliação da condição (ou a execução da ação) é feita numa transação separada. Ela
é realizada, independentemente, do término ou não da transação original.
Os modos de acoplamento dependem de outro aspecto importante do processamento
de regras: a granularidade da mudança de estado do BD, que deve ser considerada na
execução das regras (TANAKA,1995) (CERI,1994). Este aspecto será visto a seguir.
4.1.4 - Granularidade do Processamento de Regras Ativas
A granularidade do processamento de regras especifica com que freqüência ocorrem
pontos nos quais as regras podem ser processadas, isto é, com que freqüência o algoritmo da
Figura 4.1 é chamado. Três níveis úteis de granularidade são os seguintes:
Cada ocorrência de uma operação trivial do BD (ex: em um SGBDR Ativo, pode
corresponder às operações de inserção, exclusão, ou alteração de uma tupla);
59
Começo ou fim de uma operação coletiva do BD (ex: o fim de todas as sentenças SQL
para inserção, exclusão ou alteração de várias tuplas); e
•
Fim de uma transação.
A execução de regras em BD Ativos é dita “orientada à instâncias” se a regra é
executada uma vez para cada instância do BD que dispara a regra, ou que satisfaça às suas
condições. Por outro lado, a execução é “orientada a conjunto”, se a regra é executada uma
vez para todas as instâncias que disparam a regra, ou que satisfaçam às suas condições.
É possível observar que as questões de execução orientada à instância, versus
orientada a conjunto podem ser relacionadas com a granularidade para o processamento de
regras (WIDOM,1996).
4.1.5 - Arquiteturas e Técnicas para Monitoramento de Condições
Existem basicamente duas abordagens para lidar com regras e tornar ativo um BD
passivo. A primeira é executar, através de um programa de aplicação especial, uma sondagem
(“polling”) periódica do BD para determinar a ocorrência de uma situação monitorada e, em
caso positivo, desencadear a ação correspondente. A principal deficiência desta abordagem é
que o programa de aplicação não sabe quando, exatamente, deve realizar a sondagem, porque
desconhece as mudanças de estado do BD. Em conseqüência, ele tem de sondar em intervalos
regulares, se os intervalos são muito longos, o programa pode perder algumas situações
críticas em que deveria reagir, se são muito curtos, ele pode inundar o sistema com consultas
que, invariavelmente, retornam respostas negativas, causando degradação do sistema. A outra
abordagem é inserir, nos programas de aplicação normais que modificam o BD, o código
específico para verificar a condição monitorada e desencadear a ação correspondente, no caso
60
da situação ser verdadeira. A deficiência desta abordagem é a falta de modularidade de
software, isto é, quando a situação, ou regra, precisa ser alterada por alguma razão, todas as
aplicações que modificam o BD terão de ser também alteradas.
A P L IC A Ç Ã O
U S U Á R IO / A P L IC A Ç Ã O
O O / R e la c io n a l (p a s s iv o )
+
G e re n cia m e n to d e T ra n sa çõ e s E s te n d id o
G e re n cia m e n to d e R e g ra s (E C A ):
• D e te c çã o e p ro c e ss a m e n to d e E V E N T O S
• M o n ito ra m e n to d e C O N D IÇ Õ E S
S u p o rte à c o m u n ic a ç ã o e n tre a p lic a ç õ e s
BD
BD
FIGURA 4.2 - Arquitetura Integrada para BDs Ativos
O objetivo principal da pesquisa em BDs Ativos tem sido obter respostas apropriadas
a situações pré-especificadas sem sacrificar a modularidade do software. Os BDs Ativos
tendem a realizar isto através de um modelo de conhecimento, em que as regras ECA são
especificadas num nível de abstração, com uma semântica bem definida e dentro de um
modelo de execução em que a monitoração de situações, isto é, os eventos, as condições, e o
desencadeamento das ações decorrentes, sejam feitos sem a intervenção dos usuários ou das
aplicações.
61
Outro aspecto a considerar é a arquitetura dos sistemas de BDs Ativos. Embora, seja
compreensível que a maioria dos esforços de pesquisa e de desenvolvimento nesta área
tenham optado por uma arquitetura integrada, em que uma funcionalidade ativa plena é
incorporada ao núcleo de um SGBD. A Figura 4.2 ilustra esta arquitetura.
A P L IC A Ç Ã O
C A M A D A D A A P L IC A Ç Ã O
In te rfa ce d o U s u á rio
A rm a z e n a m e n to , A n á lise , T ra d u çã o
M o n ito r / In te rfa ce co m S G B D
In te rfa ce d o
U su á rio
(O p cio n a l)
C a m a d a d o M o n ito r d e S itu a ç ã o
SG BD
(N ã o -A tiv o )
BD
FIGURA 4.3 - Arquitetura de Camadas para BDs Ativos
Do ponto de vista prático, é improvável que SGBDs não ativos atualmente usados
sejam substituídos por sistemas ativos num futuro próximo. Com o objetivo de atender a
necessidade da funcionalidade ativa nas novas aplicações, uma arquitetura em camadas como
mostra a Figura 4.3 pode exercer um papel significativo na migração entre os SGBDs atuais e
os sistemas que têm, ou terão, alguma funcionalidade ativa. O acesso ao sistema pode ser feito
através de uma ferramenta que transforma o projeto de BD Ativo em construções de
62
linguagens, ou através de uma interface acoplada à camada ativa. Todas as aplicações que
requeiram capacidade ativa têm de interagir com o sistema através desta camada
(CHAKRAVARTHY,1992) (TANAKA,1995).
O presente trabalho, implementa uma arquitetura integrada para incorporação e
emprego de regras ativas no processo de evolução dinâmica de esquemas. A propagação dos
efeitos das modificações sobre métodos e instâncias são descritos no item 4.2 a seguir.
4.2 - EFEITOS DAS MODIFICAÇÕES DO ESQUEMA SOBRE OS OBJETOS E
MÉTODOS
As modificações dinâmicas nos esquemas são capturadas através de um conjunto de
operações que atuam sobre o esquema, caracterizando assim sua evolução. Além das
operações executadas diretamente sobre os objetos instanciados, esse conjunto de operações
pode ser classificado basicamente em duas categorias: operações sobre os atributos e métodos
e operações sobre as classes (MORSI,1992).
As operações de evolução de esquemas sobre os atributos, métodos e classes
modificam o conjunto de características a estes associadas.
Para cada esquema de BD criado, o SIGO mantém identificadores de objetos (Id_Obj)
associados às suas classes e aos objetos correspondentes. Estes objetos são manipulados,
conseqüentemente, à propagação das operações sobre o esquema.
As operações de evolução de esquema habilitam o usuário a modificar o esquema do
BD, podendo resultar na criação, na retirada ou na modificação dos objetos instanciados.
Estas operações podem ainda tornar inconsistentes os métodos existentes, ou por erros de
63
execução, ou por estados indesejados para os objetos, haja vista a ocorrência de uma das
seguintes condições:
(1) Referência a uma classe inexistente;
(2) Referência a um objeto inexistente;
(3) Referência a um método inexistente;
(4) Referência a um método existente com parâmetros incompatíveis;
Para o tratamento destas inconsistências, três alternativas podem ser adotadas: a
primeira seria rejeitar todas as modificações que invalidassem as assinaturas dos métodos ou
suas implementações. A segunda alternativa seria propagar, automaticamente, os efeitos das
modificações sobre as referências aos atributos, às classes, aos objetos e aos métodos nas
assinaturas, ou nas implementações dos métodos inconsistentes. Para isto, deve ser mantida
uma estrutura de gerenciamento em todas as referências às definições implementadas no
esquema do BD. Na terceira alternativa, todas as operações são aceitas e as inconsistências,
temporariamente, admitidas. Neste caso, a responsabilidade de manipulação dos métodos
inconsistentes recai sobre o usuário, embora o sistema possa fornecer algum tipo de
ferramenta de auxílio para este tratamento. Esta alternativa é mais flexível que as outras,
tendo em vista
que o objetivo das operações de evolução de esquemas é suportar as
modificações sobre uma hierarquia de classes (MORSI,1992).
Neste trabalho são adotadas, basicamente, a segunda e terceira alternativas. No
conjunto de métodos inconsistentes, aqueles que são gerados automaticamente pelo sistema
são regerados pela LIDAS. A responsabilidade de reavaliar e corrigir os outros métodos
específicos, definidos no contexto de uma aplicação, cabe ao usuário. Neste caso, o mesmo
recebe, como forma de auxílio, todas as informações sobre as modificações ocorridas para a
classe na qual o método foi definido.
64
Portanto, a consistência do BD não pode ser garantida apenas pelos seus componentes
estruturais, mas também pelos seus componentes comportamentais (métodos).
Em (GUIMARÃES,1995) foram tratados os aspectos dinâmicos de um esquema no
SIGO, inerentes à integridade estrutural. Estes foram definidos de forma coerente com a ótica
do modelo utilizado (XAVIER,1989). Para isto, foram especificadas algumas propriedades
invariantes, e a maneira como é feita a manutenção da integridade da parte intencional do
esquema, frente a ocorrência de alterações em suas definições.
Porém, a capacidade de evolução envolve tanto a manutenção das instâncias, quanto à
manutenção dos métodos criados sobre as classes, a despeito das alterações introduzidas na
definição do esquema.
Reiterando a descrição do capítulo 3, anteriormente a este trabalho e a exemplo de
outros SGBDOOs, o SIGO ainda não suportava a manutenção de integridade da parte
extensional, isto é, após a criação da primeira instância de uma das classes da base não era
mais possível modificar o esquema definido.
Os efeitos das modificações previstas sobre os métodos e objetos instanciados no
SIGO serão descritos adiante.
4.2.1 - Modificações de Atributos
As operações de evolução de esquemas sobre atributos habilitam o usuário a modificar
quaisquer propriedades de um atributo. As propriedades de um atributo incluem:
1.
Nome
2.
Classe de origem
3.
Tipo de domínio (primitivo, construtor, classe ou longo)
65
4.
Atributo de relacionamento
5.
Mecanismo de indexação
6.
Contador de referências
7.
Restrições de acesso
8.
Restrições e características sobre o atributo
As características de um atributo são estendidas para incluir propriedades e restrições
físicas, tais como: índices, relacionamentos, restrições e contadores de referências.
As operações de evolução de esquemas sobre os atributos suportam o acréscimo, e a
remoção, bem como habilitam o usuário a modificar as características acima mencionadas:
1.
Acrescentar um atributo à classe
Esta operação habilita o usuário a definir um atributo adicional em uma classe. Este
será incluído no conjunto de atributos da classe especificada, bem como em suas subclasses.
nom e
a
d t_ n a sc
a
a
P e ss o a
g
F u n c io n á rio
a
se x o
e n d e re ç o
g
(0 1 0 2 )
a
a
d a ta _ a d m issã o
m a tr_ fu n c
A lu n o
a
m a tr_ a lu n o
a
d a ta _ m a tr
(0 5 )
(0 3 0 4 )
FIGURA 4.4 - Inclusão do atributo dt_nasc para a classe Pessoa
Efeitos sobre os objetos
66
Cada objeto na extensão da classe e respectivas subclasses será acrescido de um valor
para o atributo recentemente especificado. O valor inicial deste atributo pode ser constante ou
nulo, se nenhum valor for especificado. O exemplo mostrado na Figura 4.4 ilustra o efeito
desta operação. O esquema do BD mostra a inclusão do atributo dt_nasc para a classe Pessoa.
Este atributo é incluído para objetos 01 e 02 da classe Pessoa, bem como para os objetos 03 e
04 da classe Funcionário e 05 da classe Aluno.
Efeitos sobre os métodos
Podem ocorrer inconsistências temporárias, ou erros de execução para os métodos
definidos nas aplicações dos usuários, caso o atributo acrescido, ou métodos correspondentes,
ainda não tenham sido gerados automaticamente pela LIDAS (item 3.5). O usuário será
informado desta situação.
2.
Remover um atributo da classe
Esta operação resulta em remover o atributo especificado de sua classe de origem e
suas subclasses.
a
a
a
dt_nasc
nome
Pessoa
g
(0 1 0 2)
a
Funcionário
a
a
sexo
endereço
g
data_admissão
matr_func
Aluno
a
matr_aluno
a
data_matr
(0 5 )
(0 3 0 4 )
FIGURA 4.5 - Exclusão do atributo dt_nasc da classe Pessoa
Efeitos sobre os objetos
67
Cada objeto, na extensão da classe e respectivas subclasses, perde o valor associado ao
atributo removido. O exemplo mostrado na Figura 4.5 ilustra o efeito desta operação. O
esquema do BD mostra a exclusão do atributo dt_nasc da classe Pessoa. Este atributo é
excluído dos objetos 01 e 02 da classe Pessoa, bem como dos objetos 03 e 04 da classe
Funcionário e 05 da classe Aluno.
Efeitos sobre os métodos
Os métodos existentes que referenciem os atributos removidos tornam-se inválidos, a
exemplo dos métodos construtores e destrutores de classe. O usuário será informado desta
situação.
3.
Renomear um atributo da classe
Esta operação habilita o usuário a modificar o nome de um atributo.
Efeitos sobre os objetos
Esta operação não tem efeito sobre os objetos na extensão da classe e subclasses. No
entanto, em conseqüência das limitações impostas pelo modelo de armazenamento utilizado
no sistema (BORLAND,1992), a classe do atributo modificado é recriada com o atributo
renomeado.
Efeitos sobre os métodos
O resultado desta operação é similar ao resultado da operação (2) para os métodos que
referenciem os atributos renomeados. O usuário será informado desta situação.
4.
Modificar o domínio de um atributo da classe
Esta operação habilita o usuário a modificar o domínio de um atributo.
68
a
d t_ n asc
n om e
sexo
end ereço
a
a
a
P esso a
g
a
F uncion ário
(0 3 0 4 )
g
(0 1 0 2 )
d ata_ adm issão
m atr_ fu nc
a
a p rojeto (ch ar)
A lu no
a
m atr_alu no
a
data_ m atr
(0 5 )
l
a
P ro jeto
a
cod _ projeto
n o m e_ projeto
(0 6 0 7 )
FIGURA 4.6 - Modificação do domínio do atributo projeto da classe Funcionário
Efeitos sobre os objetos
Como resultado desta operação, os objetos na extensão da classe e subclasses são
acrescidos dos valores correspondentes ao novo domínio do atributo especificado. No caso de
atributos que referenciem objetos, através do seu identificador (Id_Obj do tipo “surrogate”),
cada objeto na extensão da classe recebe um valor nulo para o atributo modificado, cabendo
ao usuário, a atualização destes valores pela aplicação. Caso a modificação de domínio seja de
uma classe para outra e se a classe correspondente ao novo domínio for subclasse ou
superclasse da classe domínio de origem, os objetos mantêm seus valores. Para um atributo
baseado-em-valor, a conversão precisa ser explicitamente especificada. Similarmente à
operação (1), se um valor não for especificado, os objetos na extensão da classe recebem um
valor nulo para o atributo modificado. Estas modificações obedecem aos critérios
69
estabelecidos na Tabela de Conversões Possíveis de Domínio apresentada na Tabela 5.1 do
capítulo 5.
O exemplo mostrado na Figura 4.6 ilustra o efeito desta operação. O esquema do BD
mostra a modificação do domínio do atributo projeto da classe Funcionário de caractere para
lista, permitindo que um funcionário participe de vários projetos. Os objetos 03 e 04 recebem
valores nulos e serão modificados pela aplicação.
Efeitos sobre os métodos
O resultado desta operação é similar ao resultado da operação (2) para os métodos que
referenciem os atributos que tiveram seus domínios modificados. O usuário será informado
desta situação.
5.
Modificar a restrição de um atributo da classe
Esta operação permite que o usuário modifique uma das restrições que tenha sido
definida para um atributo da classe. Estas restrições foram descritas no item 3.2.
Efeitos sobre os objetos
Como resultado desta operação, os objetos na extensão da classe e subclasses obtêm
um novo valor para o atributo especificado. Os objetos mantêm seus valores se estes
satisfizerem a nova restrição, caso contrário, um novo valor para conversão precisa ser
explicitamente especificado pelo usuário. Similarmente à operação (1), se um valor não for
especificado, os objetos na extensão da classe recebem um valor nulo para o atributo, cuja
restrição foi modificada. Estas modificações obedecem aos critérios estabelecidos na Tabela
de Modificações Possíveis de Restrições apresentada na Tabela 5.2 do capítulo 5. O exemplo
mostrado na Figura 4.7 ilustra o efeito desta operação. O esquema do BD mostra uma
modificação de restrição de valor sobre atributo salário da classe Funcionário, onde todos os
70
salários devem ser maiores que 100 (salário > 100). Esses valores são modificados para os
objetos 03 e 04, quando estes forem referenciados por algum método da aplicação, caso não
satisfaçam a nova restrição.
Efeitos sobre os métodos
Esta operação não tem efeito sobre os métodos definidos para as classes.
a
dt_nasc
no m e
a
a
Pessoa
g
Funcionário
sexo
en dereço
a
g
(0 1 0 2 )
a
a
a
(0 3 0 4 )
data_adm issão
A luno
m atr_func
a
m atr_ alu no
a
data_m atr
sa lário
R estrição:
salário > 100
(0 5 )
FIGURA 4.7 - Modificação de restrição sobre atributo salário da classe Funcionário
6.
Modificar a característica de um atributo da classe
Esta operação permite que o usuário modifique uma das características que tenha sido
definida para um atributo da classe. Estas características foram descritas no item 3.2.
Efeitos sobre os objetos
Como resultado desta operação, os objetos na extensão da classe e subclasses têm seus
valores atualizados conforme a característica modificada. Os objetos mantêm seus valores se
estes valores satisfizerem a nova característica, caso contrário, um novo valor para conversão
precisa ser explicitamente especificado pelo usuário. Estas modificações obedecem aos
critérios estabelecidos na Tabela de Modificações Possíveis de Características apresentada
71
na Tabela 5.3 do capítulo 5. O exemplo mostrado na Figura 4.8 ilustra o efeito desta operação.
O esquema do BD mostra uma modificação de característica para não nulo, sobre o atributo
endereço da classe Pessoa. Os objetos 01 e 02 se forem nulos, recebem estes valores quando
forem referenciados por algum método da aplicação.
Efeitos sobre os métodos
Esta operação não tem efeito sobre os métodos definidos para as classes.
a
dt_ nasc
no m e
a
a
a
P esso a
g
F u ncio nário
g
(0 1 0 2 )
a
a
a
se xo
en dere ço
C aracterístic a:
n ão n u lo
da ta _ad m issão
A lun o
m atr_fu nc
a
m a tr_ aluno
a
da ta _m atr
sa lá rio
(0 5 )
(0 3 0 4 )
FIGURA 4.8 - Modificação de característica sobre o atributo endereço da classe Pessoa
7.
Acrescentar um índice à classe
Esta operação habilita o usuário a criar um índice para a classe especificada. Como
resultado desta operação, é criada uma estrutura de índice sobre os objetos na extensão da
classe e suas subclasses especificadas, conforme o(s) atributo(s) definidos como índice.
Efeitos sobre os objetos
Esta operação não tem efeito sobre os objetos na extensão da classe e subclasses.
Efeitos sobre os métodos
Esta operação não tem efeito sobre os métodos definidos para as classes.
72
8.
Retirar um índice da classe
Esta operação habilita o usuário a remover a estrutura de índice criada para a classe
especificada.
Efeitos sobre os objetos
Esta operação não tem efeito sobre os objetos na extensão da classe e subclasses.
Efeitos sobre os métodos
Esta operação não tem efeito sobre os métodos definidos para as classes.
9.
Modificar o nome do índice de uma classe
Esta operação habilita o usuário a modificar o nome de um índice da classe
especificada. Como resultado desta operação, devido as estruturas de acesso e armazenamento
utilizadas no sistema (BORLAND,1992), o índice modificado é removido. Em seguida, é
criado um índice com o novo nome, para o(s) mesmo(s) atributo(s) definido(s) no índice
removido, sobre os objetos na extensão da classe especificada e suas subclasses. Este
resultado é similar à conjunção das operações (7) e (8), respectivamente.
Efeitos sobre os objetos
Esta operação não tem efeito sobre os objetos na extensão da classe e subclasses.
Efeitos sobre os métodos
Esta operação não tem efeito sobre os métodos definidos para as classes.
10.
Acrescentar um atributo ao índice de uma classe
Esta operação habilita o usuário a acrescentar um atributo à estrutura de um índice
existente, para classe especificada. O resultado desta operação é similar ao resultado da
operação (9).
73
Efeitos sobre os objetos
Esta operação não tem efeito sobre os objetos na extensão da classe e subclasses.
Efeitos sobre os métodos
Esta operação não tem efeito sobre os métodos definidos para as classes.
11.
Retirar um atributo do índice de uma classe
Esta operação habilita o usuário a remover um atributo da estrutura de um índice
existente, referente a uma classe especificada. O resultado desta operação é similar ao
resultado da operação (9).
Efeitos sobre os objetos
Esta operação não tem efeito sobre os objetos na extensão da classe e subclasses.
Efeitos sobre os métodos
Esta operação não tem efeito sobre os métodos definidos para as classes.
4.2.2 - Modificações de Classes
As operações de evolução de esquemas sobre uma classe habilitam o usuário a
modificar qualquer propriedade de uma classe. As propriedades de uma classe incluem:
1.
Nome
2.
Conjunto de superclasses
3.
Conjunto de subclasses
4.
Um conjunto ordenado de atributos
5.
Restrições e características sobre os atributos
6.
Indexadores de classes
74
Algumas características foram mencionadas apenas porque são referenciadas nos
métodos de modificação de classe. Além disso, as operações de modificação habilitam o
usuário a modificar uma ou mais propriedades de uma classe:
12.
Tornar uma classe S superclasse de uma classe S1
Esta operação permite ao usuário tornar uma classe S em superclasse de uma classe
S1, podendo resultar em atributos e métodos adicionais, herdados da classe S pela classe S1.
nom e
a
dt_nasc
a
a
Pessoa
g
a
sexo
endereço
g
(0 1 0 2 )
a
Funcionário
(0 3 0 4 )
data_adm issão g
a m atr_func
a departam ento
dt_nasc
a
nom e a
a
sexo
endereço
A luno
m atr_aluno
a
data_m atr
(0 5 )
a
Professor
a
a
titulação
(0 6 0 7 )
FIGURA 4.9 - Inclusão da classe Pessoa como superclasse da classe Professor
Efeitos sobre os objetos
Os objetos na extensão da classe S1 recebem um valor nulo para cada atributo herdado
da classe S. Os valores para estes atributos herdados serão definidos similarmente a operação
(1).
75
O exemplo mostrado na Figura 4.9 ilustra o efeito desta operação. O esquema do BD
mostra a inclusão da classe Pessoa como superclasse da classe Professor. Os atributos
dt_nasc, nome, sexo, endereço da classe Pessoa são incluídos para os objetos 06 e 07 da
classe Professor.
Efeitos sobre os métodos
Esta operação não tem efeito sobre os métodos definidos para as classes S e S1.
13.
Remover uma classe S da lista de superclasses de uma classe S1
Esta operação permite ao usuário remover uma classe S da lista de superclasses de
uma classe S1, podendo resultar em atributos ou métodos perdidos pela classe S1. O efeito é
inverso ao da operação (12) descrita anteriormente.
nom e
a
a
dt_nasc
a
Pessoa
g
g
(0 1 0 2 )
a
Funcionário
(0 3 0 4 )
sexo
a endereço
data_adm issão g
a m atr_func
a departam ento
Aluno
a
m atr_aluno
a
data_m atr
(0 5 )
dt_nasc
a
nom e a
sexo a
endereço
a
Professor
a
titulação
(0 6 0 7 )
FIGURA 4.10 - Retirada da classe Pessoa da lista de superclasses da classe Professor
76
Efeitos sobre os objetos
O efeito desta operação sobre os objetos na extensão da classe S1 é similar ao da
operação (2), para os atributos herdados da classe S. O exemplo mostrado na Figura 4.10
ilustra o efeito desta operação. O esquema do BD mostra a retirada da classe Pessoa da lista
de superclasses da classe Professor. Os atributos dt_nasc, nome, sexo, endereço da classe
Pessoa são removidos dos objetos 06 e 07 da classe Professor.
Efeitos sobre os métodos
Podem ocorrer inconsistências temporárias, ou erros de execução, para os métodos
definidos nas aplicações dos usuários que referenciem os métodos, ou atributos herdados da
classe S e foram perdidos pela classe S1. O usuário será informado desta situação.
14.
Criar uma nova classe no esquema
Esta operação habilita o usuário a definir novas classes para o esquema do BD na
hierarquia de classes.
Efeitos sobre os objetos
Esta operação não tem efeito sobre os objetos na extensão da classe e subclasses.
Efeitos sobre os métodos
Esta operação não tem efeito sobre os métodos definidos para as classes.
15.
Retirar uma classe no esquema
Esta operação habilita o usuário a retirar uma classe do esquema do BD na hierarquia
de classes. O efeito é inverso ao da operação (14). Convém lembrar que, de acordo com as
regras associadas aos métodos para manutenção das invariantes do esquema (item 3.3), uma
classe somente é removida se estiver desconectada do esquema.
77
Efeitos sobre os objetos
Esta operação resulta na exclusão dos objetos existentes na extensão da classe retirada.
O exemplo mostrado na Figura 4.11 ilustra o efeito desta operação. O exemplo mostra a
retirada da classe Funcionário do esquema do BD. Os objetos 03 e 04 são excluídos.
Efeitos sobre os métodos
O resultado desta operação é similar ao resultado da operação (13) para os métodos
que referenciem os atributos ou métodos da classe removida. O usuário será informado desta
situação.
nome
a
dt_nasc
a
a
Pessoa
g
(0 1 0 2)
g
a
Funcionário
sexo
a endereço
data_admissão
a matr_func
a departamento
Aluno
a
matr_aluno
a
data_matr
(0 5)
(0 3 0 4)
FIGURA 4.11 - Retirada da classe Funcionário do esquema do BD
16.
Modificar o nome de uma classe
Esta operação permite que o usuário modifique o nome de uma classe no esquema do
BD.
Efeitos sobre os objetos
78
Esta operação não tem efeito sobre os objetos na extensão da classe e subclasses. No
entanto, em conseqüência das limitações impostas pelo modelo de armazenamento utilizado
no sistema (BORLAND,1992), a classe renomeada é recriada.
Efeitos sobre os métodos
Esta operação não tem efeito sobre os métodos definidos para as classes.
4.2.3 - Modificações de Objetos
A modificação dinâmica de objetos abrange a exclusão de um objeto, inclusão de um
novo objeto e modificação de um objeto instanciado. Com este propósito, algumas operações
foram definidas nos módulos MACRO e LIDAS (MOURAa,1995) (MOURAb,1995).
A operação descrita a seguir modifica a classe de origem de um objeto.
17. Migrar um objeto de uma classe origem O para uma classe destino D
Esta operação habilita o usuário a modificar a classe origem de um objeto
especificado, com as seguintes restrições: nenhum objeto que esteja sendo referenciado
poderá migrar para outra classe; a classe destino deverá ser uma subclasse da classe origem
independentemente de seu nível na hierarquia de classes; e a classe destino deverá possuir, no
mínimo, uma superclasse em comum com a classe origem.
Efeitos sobre os objetos
O efeito desta operação é similar à exclusão e inclusão de um objeto, embora os
objetos afetados mantenham seus Id_Obj. Os objetos migrados retêm seus valores, recebem
um valor inicial constante, ou podem ser nulos se nenhum valor for especificado. O mesmo
tratamento é dado aos novos atributos oriundos da classe destino, herdados pelo efeito da
79
migração. Outrossim, os objetos perdem todos aqueles atributos, anteriormente herdados na
classe de origem, e que não pertençam à hierarquia da classe destino. O exemplo mostrado na
Figura 4.12 ilustra o efeito desta operação. O esquema do BD mostra a migração do objeto 04
da classe Funcionário para a classe Aluno. Serão perdidos os valores dos atributos
data_admissão, matr_func e salário da classe origem Funcionário e acrescidos valores para
os atributos matr_aluno e data_matr da classe destino Aluno. O objeto 04 mantém seu
Id_Obj.
Efeitos sobre os métodos
Esta operação não tem efeito sobre os métodos definidos para as classes.
a
dt_nasc
a
a
Pessoa
g
Funcionário
nom e
a
g
(0 1 0 2 )
a
a
a
sexo
endereço
data_admissão
matr_func
Aluno
a
m atr_aluno
a
data_matr
salário
(0 4 ) (0 5 )
(0 3 0 4 )
FIGURA 4.12 - Migração do objeto 04 da classe Funcionário para a classe Aluno
4.2.4 - Modificações de Métodos
As operações de evolução de esquemas sobre os métodos suportam o acréscimo, a
remoção, bem como habilitam o usuário a modificar o nome de um método:
80
18. Acrescentar um método à classe
Esta operação habilita o usuário a definir um método adicional para uma classe, que é
incluído no conjunto de métodos da classe especificada, bem como em suas subclasses.
Efeitos sobre os objetos
Esta operação não tem efeito sobre os objetos na extensão da classe e subclasses.
Efeitos sobre os métodos
Esta operação não tem efeito sobre os métodos definidos para as classes.
19. Remover um método da classe
Esta operação resulta em remover um método especificado de sua classe de origem e
suas subclasses.
Efeitos sobre os objetos
Esta operação não tem efeito sobre os objetos na extensão da classe e subclasses.
Efeitos sobre os Métodos
O resultado desta operação é similar ao resultado da operação (13) para os métodos
que referenciem o método removido. O usuário será informado desta situação.
20. Renomear um método da classe
Esta operação resulta em renomear um método especificado de sua classe de origem e
de suas subclasses.
Efeitos sobre os objetos
Esta operação não tem efeito sobre os objetos na extensão da classe e subclasses.
Efeitos sobre os Métodos
81
O resultado desta operação é similar ao resultado da operação (13) para os métodos
que referenciem o método renomeado. O usuário será informado desta situação.
4.3 - ESPECIFICAÇÃO DAS ALTERNATIVAS E MECANISMOS UTILIZADOS
PARA EVOLUÇÃO DA BASE DE OBJETOS
O principal objetivo deste trabalho é garantir a integridade de instanciação do esquema
da aplicação, através da utilização de regras de BDs Ativos. Observa-se, no entanto, que esta
especificação trata objetos complexos não contemplando os objetos multimídia. Estes últimos
possuem armazenamento, acesso e gerenciamento próprios (QUADROS,1996), como pode
ser visto na Figura 4.13. As alternativas e mecanismos utilizados para obtenção deste
resultado serão descritos a seguir.
IN T E R F A C E
M AM E
L ID A S
L IM O S
E v o lu çã o d in â m ica d e
E s q u e m a s e O b je to s
M ACRO
E sq u em a
G e re n c ia m e n to d e
O b je to s C o m p le x o s
G e re n c ia m e n to d e
O b je to s M u ltim íd ia
R e g ra s
A tiv a s
BD
S is te m a d e
H ip e rd o c u m e n to s
C am pos
Longos
FIGURA 4.13 - Arquitetura do SIGO com suporte à evolução da base de objetos
82
As efetivas modificações sobre o esquema da aplicação são armazenadas numa
hierarquia de classes denominada Repositório de Regras Ativas Orientado a Objetos (R2O2),
e, conseqüentemente, propagadas aos objetos instanciados, podendo resultar na criação,
retirada ou modificação destes objetos. O R2O2 é descrito adiante no item 4.3.3.
A propagação aos objetos instanciados é feita através de métodos associados às classes
do R2O2. Estes métodos são definidos como regras ativas, automaticamente disparadas por
outros métodos pertencentes às aplicações, que referenciem objetos e classes durante a
manipulação do esquema. A Figura 4.13 representa a arquitetura do SIGO, acrescida dos
módulos de suporte à evolução da base de objetos, estes são responsáveis por tornar o sistema
ativo para esta funcionalidade.
4.3.1 - Semântica de Regras Ativas no SIGO
A partir do paradigma ECA, o suporte à evolução da base de objetos no SIGO é
viabilizado mediante o seguinte desenvolvimento:
•
Especificação das regras ativas referentes às modificações de objetos;
•
Associação das regras ativas criadas com suas classes no R2O2 ;
•
Armazenamento das efetivas modificações sobre o esquema da aplicação no
R2O2, a partir de um arquivo gerado pelo MAME, com todas as modificações
sobre o esquema da aplicação efetuadas pelo usuário. A estrutura e todas as
características do arquivo com as modificações estão descritas no Apêndice A;
•
Geração dos métodos básicos de atualização, ou recuperação dos objetos das
classes da aplicação pela LIDAS, com chamada ao método de varredura do R2O2,
para verificação da existência de modificações não propagadas;
83
•
A manutenção de instâncias executada no momento da propagação é feita de
forma “immediate update” ou “lazy update”, conforme foram descritas no capítulo
2. Estas são acionadas conforme a operação de modificação executada. Quando as
operações afetam diretamente a estrutura de armazenamento do objeto em disco,
as efetivas atualizações de objetos de uma classe são propagadas imediatamente a
todos os objetos. Caso contrário, cada objeto será posteriormente atualizado, no
momento em que forem referenciados pela ativação de qualquer método de
atualização, ou de recuperação, pertencentes às classes da aplicação. Esta diferença
de tratamento deve-se às limitações do modelo relacional disponibilizado pelo
PARADOX ENGINE (BORLAND,1992), que é adotado pelo SIGO como
estrutura de armazenamento.
A Figura 4.14 ilustra a semântica de execução de regras ativas, através do algoritmo
para processamento de regras, adaptado ao contexto do SIGO.
ENQUANTO existirem chamadas a métodos de atualização ou recuperação de objetos
FAÇA
1. Encontre uma regra disparada R (chamada a um método de atualização ou
recuperação de objetos);
2. Avalie a condição de R (objeto referenciado pertence ao conjunto de classes que
possuem modificações ainda não propagadas);
3. SE a condição de R é verdadeira
ENTÃO execute a ação de R (modificar efetivamente o objeto, conforme ação
definida);
FIGURA 4.14 - Algoritmo para processamento de regras no SIGO
84
4.3.2 - Aderência Conceitual ao Modelo de Execução de Regras em BDs Ativos
O item 4.1 descreve as diferentes alternativas para implementação dos principais
aspectos de regras ativas. Serão descritas a seguir aquelas que foram consideradas mais
adequadas e adotadas para o SIGO, no tratamento de evolução de esquemas pelo uso desta
tecnologia:
•
O item 4.3.1 mostra a semântica de execução de regras ativas no contexto do
SIGO, pelo paradigma ECA. De acordo com o algoritmo mostrado na Figura 4.14,
o modelo de execução para o processamento das regras ativas é iterativo e sem
recursividade;
•
A modificação e recuperação de dados foram escolhidas dentre os tipos de
eventos de disparos, isto é, a ativação de um dos métodos de atualização, ou de
recuperação pertencentes às classes de aplicação é, de fato, o EVENTO que
dispara as REGRAS DE AÇÃO armazenadas no R2O2;
•
A consulta do BD foi adotada como tipo de condição especificada, isto é, pela
ativação do método de varredura do R2O2, são avaliadas as CONDIÇÕES da
regra disparada, ou seja, se aquele objeto referenciado pertence ao conjunto de
classes que possuem modificações ainda não propagadas. Além disso, a chamada
ao método de varredura do R2O2 foi inserida nos programas de aplicação que
manipulam o BD para sondagem da situação monitorada. Esta inserção é feita
automaticamente pela LIDAS;
•
Se a CONDIÇÃO for verdadeira, o objeto é efetivamente modificado conforme a
AÇÃO definida pela regra disparada, caracterizando a execução da regra pelo tipo
operações de modificações de dados;
85
•
Visto que as regras são disparadas e executadas seqüencialmente, não é necessário
o tratamento para seleção e resolução de conflitos;
•
O modo de acoplamento imediato é adotado para o controle de execução das
regras disparadas;
•
As regras são executadas a cada ocorrência de uma operação trivial do BD
(chamada a um método de atualização ou recuperação de objetos), caracterizando
o nível de granularidade utilizado. Esta execução é orientada à instâncias ou a
conjunto, dependendo do tipo de operação de modificação que incorpora a regra
disparada, conforme o efeito sobre a estrutura de armazenamento do objeto
descrito no item 4.3.1.
4.3.3 - O Repositório de Regras Ativas Orientado a Objetos (R2O2)
As Figuras 4.15 e 4.16 mostram, conceitualmente, a estrutura de classes referente ao
Repositório de Regras Ativas Orientado a Objetos (R2O2). Estas classes possuem como
propriedades: as regras de ação definidas como métodos; e os atributos referentes às
modificações executadas sobre o esquema da aplicação. Estas modificações correspondem às
instâncias das classes na estrutura e serão propagadas sobre os métodos e objetos. As regras
de ação, quando disparadas, propagarão os efeitos das modificações ocorridas aos objetos do
esquema. Para cada uma das operações de modificação especificadas no item 4.2, existe uma
classe com seus respectivos atributos e métodos.
Além disso, o R2O2 é extensível, isto é, novas subclasses podem ser criadas. Esta
extensibilidade permite incorporar à estrutura outras operações de modificação, ou mesmo
outras regras de ação que venham a ser definidas (SILVA,1996).
86
As classes e atributos do R2O2 são descritos a seguir:
REPREGRAS: classe Repositório de Regras Ativas Orientado
a Objetos cujos
atributos são herdados por suas subclasses para propagação dos efeitos das operações aos
objetos instanciados;
REPREGRAS
Base (char)
Tipo_Evolução (char)
Operação (char)
Classe (char)
Lidas (bool)
Propagação (bool)
Objetos (set)
int Instancia Rep_Regras (alt.txt)
int Condição Rep_Regras (base, classe, id_obj, tipo_evol, operação)
RR1OBJ
Valor (char)
Atributo (char)
Domínio (char)
Tamanho (int)
Característica (char)
Restrição (char)
int Insere_Atributo (valor,
atributo, domínio, tamanho,
caracteristica, restrição )
RR2OBJ
RR4OBJ
Valor (char)
Atributo (char)
Novo_Domínio(char)
Novo_Tamanho_Atrib (int)
int Modifica_Dom(atributo,
valor, novo_dom, novo_tam)
RR7OBJ
Nome_Índice (char)
Atributos (set)
Nome_Índice (char)
Atributos (set)
int Insere_Indice
(nome_ind, atributos)
int Insere_Atributo_Indice
(nome_ind, atributo)
RR8OBJ
RR5OBJ
Atributo (char)
Nova_Restrição (char)
Nome_Índice (char)
int Retira_Indice (nome_ind )
RR3OBJ
int Modifica_Rest (atributo,
nova_rest)
RR6OBJ
Atributo (char )
Novo_Nome_Atrib (char )
Atributo (char)
Nova_Característica (char)
int Renomeia_Atributo
(atributo, novo_nome )
int Modifica_Carac (atributo,
nova_carac)
RR9OBJ
Nome_Índice (char)
Nome_Índice _Atual (char)
Atributos (set)
int Modifica_Nome_Indice
(nome_ind, nome_ind_atual,
atributos)
RR13OBJ
Superclasse (char)
int Remove_Superclasse
(superclasse)
RR15OBJ
RR11OBJ
Nome_Índice (char)
Atributos (set)
int Retira_Atributo_Indice
(nome_ind, atributo)
Atributo (char)
int Exclui_Atributo (atributo )
RR10OBJ
RR12OBJ
Superclasse (char)
int Insere_Superclasse
(superclasse)
int Retira_Classe (classe)
RR16OBJ
Novo_Nome_Classe (char)
int Modifica_Nome_Classe
(classe, novo_nome_classe)
RR17OBJ
Classe_Destino (char)
Id_Obj (double)
int Migrar_Objeto (id_obj)
FIGURA 4.15 - Hierarquia de classes do R2O2 para operações sobre objetos
Base (char): base modificada;
Tipo_Evolução (char): determina se a operação propaga efeitos sobre métodos, objetos
ou ambos (m/o/a);
87
Operação (char): operação de modificação (1 a 20);
Classe (char): classe sobre a qual foi operada a modificação;
Lidas (bool): atributo lógico que determina se o código C++ foi gerado pela LIDAS
após a modificação;
Propagação (bool): atributo lógico que determina se houve propagação para todos os
objetos da classe;
Objetos (set): conjunto de identificadores de objetos (id_obj) instanciados no
momento da modificação. Tem por finalidade controlar a propagação das operações “lazy
update”. Os objetos que ainda não foram atualizados permanecem no conjunto, enquanto que
os outros são retirados após suas atualizações.
RR1OBJ: subclasse para tratamento dos efeitos da operação (1) sobre objetos;
RR2OBJ: subclasse para tratamento dos efeitos da operação (2) sobre objetos;
RR3OBJ: subclasse para tratamento dos efeitos da operação (3) sobre objetos;
RR4OBJ: subclasse para tratamento dos efeitos da operação (4) sobre objetos;
RR5OBJ: subclasse para tratamento dos efeitos da operação (5) sobre objetos;
RR6OBJ: subclasse para tratamento dos efeitos da operação (6) sobre objetos;
RR7OBJ: subclasse para tratamento dos efeitos da operação (7) sobre objetos;
RR8OBJ: subclasse para tratamento dos efeitos da operação (8) sobre objetos;
RR9OBJ: subclasse para tratamento dos efeitos da operação (9) sobre objetos;
RR10OBJ: subclasse para tratamento dos efeitos da operação (10) sobre objetos;
RR11OBJ: subclasse para tratamento dos efeitos da operação (11) sobre objetos;
RR12OBJ: subclasse para tratamento dos efeitos da operação (12) sobre objetos;
RR13OBJ: subclasse para tratamento dos efeitos da operação (13) sobre objetos;
RR15OBJ: subclasse para tratamento dos efeitos da operação (15) sobre objetos;
88
RR16OBJ: subclasse para tratamento dos efeitos da operação (16) sobre objetos;
RR17OBJ: subclasse para tratamento dos efeitos da operação (17) sobre objetos;
RR1MET: subclasse para tratamento dos efeitos da operação (1) sobre métodos;
RR2MET: subclasse para tratamento dos efeitos da operação (2) sobre métodos;
RR3MET: subclasse para tratamento dos efeitos da operação (3) sobre métodos;
RR4MET: subclasse para tratamento dos efeitos da operação (4) sobre métodos;
RR13MET: subclasse para tratamento dos efeitos da operação (13) sobre métodos;
RR15MET: subclasse para tratamento dos efeitos da operação (15) sobre métodos;
RR19MET: subclasse para tratamento dos efeitos da operação (19) sobre métodos;
RR20MET: subclasse para tratamento dos efeitos da operação (20) sobre métodos.
As classes referentes às operações (14) e (18) não foram definidas visto que, nestes
casos, não existem efeitos à serem propagados tanto para objetos, quanto para métodos.
A seguir serão descritos os atributos pertencentes a uma classe ou a um conjunto de
classes:
Atributo (char): atributo modificado, inserido ou excluído da classe;
Atributos (set): conjunto de atributos pertencentes ao índice inserido ou modificado;
Característica_Atributo (char): característica do atributo inserido na classe;
Classe_Destino (char): classe destino do objeto migrado;
Domínio_Atributo (char): domínio do atributo inserido;
Id_Obj (double): identificador do objeto migrado de classe;
Método (char): método removido ou renomeado;
Nome_Índice
(char) : nome do índice inserido, excluído ou modificado;
Nome_Índice_Atual (char) : novo nome do índice renomeado;
Nova_Característica (char): nova característica para o atributo modificado na classe;
89
Nova_Restrição (char): nova restrição para o atributo modificado na classe;
Novo_domínio (char): novo domínio para o atributo modificado na classe;
Novo_Nome_Atributo (char): novo nome do atributo renomeado;
Novo_Nome_Classe (char): novo nome da classe renomeada;
Novo_Nome_Método (char): novo nome do método renomeado;
Novo_Tamanho_Atributo (int): novo tamanho para o atributo modificado na classe;
Restrições_Atributo (char): restrições do atributo inserido na classe;
Superclasse (char): superclasse inserida ou removida da classe;
Tamanho_Atributo (int): tamanho do atributo inserido na classe;
Valor (char): valor constante definido pelo usuário, assumido para todos os objetos
quando o atributo é inserido, ou nos casos necessários da modificação;
REPREGRAS
Base (char)
Tipo_Evolução (char)
Operação (char)
Classe (char)
Lidas (bool)
Propagação (bool)
Objetos (set)
int Instancia Rep_Regras (alt.txt)
int Condição Rep_Regras (base, classe, id_obj, tipo_evol, operação)
RR1MET
Atributo (char)
int Insere_Atributo (classe )
int Exclui_Atributo (classe)
int Retira_Classe (classe)
Valor (char)
Atributo (char)
Novo_Domínio (char)
Atributo (char)
Novo_Nome_Atributo (char)
Atributo (char)
RR15MET
RR4MET
RR3MET
RR2MET
int Renomeia_Atributo (classe)
RR19MET
int Modifica_Dom (classe)
RR13MET
Superclasse (char)
int Remove_Superclasse
(classe)
RR20MET
Método (char)
Novo_Nome_Método (char)
Método (char)
int Remove_Método (classe)
int Renomeia_Método (classe )
FIGURA 4.16 - Hierarquia de classes do R2O2 para operações sobre métodos
90
CAPÍTULO 5
DESCRIÇÃO FUNCIONAL DOS MÉTODOS E FUNÇÕES
5.1 - OPERAÇÕES DE MODIFICAÇÃO SOBRE OBJETOS E MÉTODOS
A seguir, serão descritas as funcionalidades de métodos e funções utilizadas para
propagar os efeitos das modificações, sobre os objetos instanciados num esquema SIGO.
1.
Acrescentar um atributo à classe
Int Insere_atributo (classe, atributo, domínio, valor)
Descrição: insere um atributo na classe informada como parâmetro e em todos os seus
objetos, com valor especificado, ou nulo, conforme o caso.
Entradas:
classe: classe do atributo inserido;
Atributo: atributo inserido;
domínio: domínio do atributo inserido;
valor: valor para atualização do objeto, que pode ser nulo;
Saída:
retorna o inteiro 1, caso a operação tenha sido efetuada com sucesso e
0 (zero), caso algum erro tenha ocorrido.
Especificação Funcional:
INÍCIO (Int Insere_atributo)
ENQUANTO existirem acréscimos de atributos para a classe no R2O2 FAÇA
INSERIR o atributo na classe
ENQUANTO existirem objetos na classe FAÇA
91
INSERIR um valor do atributo acrescentado para cada objeto da
classe
FIM-ENQUANTO
ATUALIZAR o controle de objetos modificados na lista de Id_Obj
ATUALIZAR o atributo propagação na classe REPREGRAS
FIM-ENQUANTO
FIM (Int Insere_atributo)
2.
Remover um atributo da classe
Int Exclui_atributo (classe, atributo)
Descrição: remove um atributo da classe informada como parâmetro, bem como de
todos os seus objetos.
Entrada:
classe: classe do atributo excluído;
atributo: atributo excluído;
Saída:
retorna o inteiro 1, caso a operação tenha sido efetuada com sucesso e
0 (zero), caso algum erro tenha ocorrido.
Especificação Funcional:
INÍCIO (Int Exclui_atributo)
ENQUANTO existirem exclusões de atributos para a classe no R2O2 FAÇA
EXCLUIR o atributo da classe
ENQUANTO existirem objetos na classe FAÇA
EXCLUIR o valor do atributo removido para cada objeto da classe
FIM-ENQUANTO
92
ATUALIZAR o controle de objetos modificados na lista de Id_Obj
ATUALIZAR o atributo propagação na classe REPREGRAS
FIM-ENQUANTO
FIM (Int Exclui_atributo)
3.
Renomear um atributo da classe
Int Renomeia_atributo (classe, atributo, novo_nome_atributo)
Descrição: renomeia um atributo na classe informada como parâmetro. Esta operação
não tem efeito sobre os objetos na extensão da classe e subclasses. No entanto, em
conseqüência das limitações impostas pelo modelo de armazenamento, conforme foi descrito
no subitem 4.3.1, a classe modificada é recriada com o atributo renomeado.
Entradas:
classe: classe do atributo renomeado;
atributo: atributo renomeado;
novo_nome_atributo: novo nome atributo do atributo renomeado;
Saída:
retorna o inteiro 1, caso a operação tenha sido efetuada com sucesso e
0 (zero), caso algum erro tenha ocorrido.
Especificação Funcional:
INÍCIO (Int Renomeia_atributo)
ENQUANTO existirem renomeações de atributos para a classe no R2O2 FAÇA
RENOMEAR o atributo na classe
FIM-ENQUANTO
FIM (Int Renomeia_atributo)
93
4.
Modificar o domínio de um atributo da classe
Int Modifica_dom_atributo (classe, atributo, novo_dom, valor)
Descrição: modifica o domínio de um atributo na classe informada como parâmetro e
em todos os seus objetos, convertendo o valor existente, assumindo o valor especificado, ou
nulo, conforme o caso.
Entradas:
classe: classe do atributo modificado;
atributo: atributo modificado;
novo_dom: novo domínio para conversão;
valor: valor para modificação de domínio de objeto, que pode ser nulo;
Saída:
retorna o inteiro 1, caso a operação tenha sido efetuada com sucesso e
0 (zero), caso algum erro tenha ocorrido.
Especificação Funcional:
INÍCIO (Modifica_dom_atributo)
ENQUANTO existirem modificações de domínio de atributos da classe no R2O2
FAÇA
SE o atributo for baseado-em-objeto (Id_Obj) e os valores existentes
satisfazem o novo domínio previsto em novo_dom ENTÃO
CASO
(1):
SE a modificação for de classe para classe E a classe novo
domínio for subclasse ou superclasse da classe domínio
ENTÃO: manter o valores existentes FIM-SE
(2):
SE a modificação for de lista para conjunto ENTÃO: manter
os valores existentes e remover as instâncias repetidas FIM-SE
94
(3):
SE a modificação for de conjunto para lista ENTÃO: manter
e ordenar os valores existentes FIM-SE
OUTROS:
ENQUANTO existirem objetos na classe FAÇA
ATRIBUIR valor nulo para o atributo
modificado em cada objeto da classe
FIM-ENQUANTO
FIM-CASO
SENÃO {atributo for baseado-em-valor}
VERIFICAR conversões permitidas conforme Tabela de conversões
possíveis de domínio (Tabela 5.1)
MODIFICAR o domínio do atributo para novo_dom
ENQUANTO existirem objetos na classe FAÇA
CONVERTER para o novo domínio o valor do atributo
modificado de cada objeto da classe, usando o próprio
valor existente no objeto, ou valor, conforme o caso
FIM-ENQUANTO
ATUALIZAR o controle de objetos modificados na lista de Id_Obj
ATUALIZAR o atributo propagação na classe REPREGRAS
FIM-SE
FIM-ENQUANTO
FIM (Modifica_dom_atributo)
5.
Modificar a restrição de um atributo da classe
Int Modifica_rest_atributo (classe, atributo, Id_Obj, nova_rest)
95
Descrição: modifica as restrições de um atributo da classe informada como parâmetro,
assumindo o valor, especificado pelo usuário, para cada objeto existente que for referenciado
por algum método da aplicação e que não satisfaça a nova restrição.
Entradas:
classe: classe do atributo cuja restrição foi modificada;
atributo: atributo cuja restrição foi modificada;
Id_Obj: identificador do objeto referenciado;
nova_rest: nova restrição para conversão;
Saída:
retorna o inteiro 1, caso a operação tenha sido efetuada com sucesso e
0 (zero), caso algum erro tenha ocorrido.
Especificação Funcional:
INÍCIO (Modifica_rest_atributo)
OBTER o objeto Id_Obj da classe classe
ENQUANTO existirem modificações de restrição da classe no R2O2 FAÇA
SE o valor do objeto (Id_Obj) satisfaz a nova_rest ENTÃO
manter o valor existente
SENÃO
VERIFICAR conversões permitidas conforme Tabela de modificações
possíveis de restrições (Tabela 5.2)
EXIBIR ao usuário “O VALOR DO OBJETO (Id_Obj) ESTÁ
INCONSISTENTE COM A NOVA RESTRIÇÃO ESTABELECIDA.
INFORME O NOVO VALOR PARA MODIFICAÇÃO “
OBTER o novo valor
96
MODIFICAR valor do objeto (Id_Obj)
ATUALIZAR o controle de objetos modificados na lista de Id_Obj
ATUALIZAR o atributo propagação na classe REPREGRAS
FIM-SE
FIM-ENQUANTO
FIM (Modifica_rest_atributo)
6.
Modificar a característica de um atributo da classe
Int Modifica_carac_atributo (classe, atributo, Id_Obj, nova_carac)
Descrição: modifica a característica de um atributo da classe informada como
parâmetro, assumindo o valor, especificado pelo usuário, para cada objeto existente que for
referenciado por algum método da aplicação e que não satisfaça a nova característica.
Entradas:
classe: classe do atributo cuja característica foi modificada;
atributo: atributo cuja característica foi modificada;
Id_Obj: identificador do objeto referenciado;
nova_carac: nova restrição para conversão;
Saída:
retorna o inteiro 1, caso a operação tenha sido efetuada com sucesso e
0 (zero), caso algum erro tenha ocorrido.
Especificação Funcional:
INÍCIO (Modifica_carac_atributo)
OBTER o objeto Id_Obj da classe classe
ENQUANTO existirem modificações de características da classe no R2O2 FAÇA
97
SE o valor do objeto (Id_Obj) satisfaz a nova_carac ENTÃO
manter o valor existente
SENÃO
VERIFICAR conversões permitidas conforme Tabela de modificações
possíveis de características (Tabela 5.3)
EXIBIR ao usuário “O VALOR DO OBJETO (Id_Obj) ESTÁ
INCONSISTENTE COM A NOVA CARACTERÍSTICA
ESTABELECIDA. INFORME O NOVO VALOR PARA
MODIFICAÇÃO ”
OBTER o novo valor
MODIFICAR valor do objeto (Id_Obj)
ATUALIZAR o controle de objetos modificados na lista de Id_Obj
ATUALIZAR o atributo propagação na classe REPREGRAS
FIM-SE
FIM-ENQUANTO
FIM (Modifica_carac_atributo)
7.
Acrescentar um índice numa classe
Int Insere_indice (classe, nome_indice, *atributos)
Descrição: cria um índice para a classe informada como parâmetro. Esta operação não
tem efeito sobre os objetos na extensão da classe e subclasses.
Entradas:
classe: classe do índice inserido;
nome_indice: nome do índice inserido;
*atributos: lista de atributos componentes do índice;
98
Saída:
retorna o inteiro 1, caso a operação tenha sido efetuada com sucesso e
0 (zero), caso algum erro tenha ocorrido.
Especificação Funcional:
INÍCIO (Insere_indice)
ENQUANTO existirem inserções de índices para classe no R2O2 FAÇA
CRIAR índice para classe com atributos especificados
CARREGAR estrutura de ordenação com objetos existentes
FIM-ENQUANTO
FIM (Insere_indice)
8.
Retirar um índice da classe
Int Retira_indice (classe, nome_indice)
Descrição: retira um índice da classe informada como parâmetro. Esta operação não
tem efeito sobre os objetos na extensão da classe e subclasses.
Entradas:
classe: classe do índice retirado;
nome_indice: nome do índice retirado;
Saída:
retorna o inteiro 1, caso a operação tenha sido efetuada com sucesso e
0 (zero), caso algum erro tenha ocorrido.
Especificação Funcional:
INÍCIO (Retira_indice)
ENQUANTO existirem retiradas de índices para classe no R2O2 FAÇA
REMOVER índice para classe
99
FIM-ENQUANTO
FIM (Retira_indice)
9.
Modificar o nome de um índice de uma classe
Int Modifica_nome_indice (classe, nome_indice, nome_indice_atual)
Descrição: modifica o nome de um índice da classe informada como parâmetro. Esta
operação não tem efeito sobre os objetos na extensão da classe e subclasses. No entanto, em
conseqüência das limitações impostas pelas estruturas de acesso e armazenamento utilizadas
no sistema (BORLAND,1992), o índice modificado é removido. Em seguida, é criado um
índice com o novo nome, para o(s) mesmo(s) o(s) atributo(s) definido(s) no índice removido,
sobre os objetos na extensão da classe especificada e suas subclasses.
Entradas:
classe: classe do índice modificado;
nome_indice: nome do índice modificado;
nome_indice_atual: novo nome do índice modificado;
Saída:
retorna o inteiro 1, caso a operação tenha sido efetuada com sucesso e
0 (zero), caso algum erro tenha ocorrido.
Especificação Funcional:
INÍCIO (Modifica_nome_indice)
ENQUANTO existirem modificações de nomes de índices para classe no R2O2
FAÇA
OBTER a lista de atributos do indice_atual
Retira_indice (classe, nome_indice)
Insere_indice (classe, nome_indice_atual, *atributos)
100
FIM-ENQUANTO
FIM (Modifica_nome_indice)
10.
Acrescentar um atributo a um índice de uma classe
Int Insere_atributo_indice (classe, nome_indice, atributo)
Descrição: insere um atributo no índice da classe informada como parâmetro. Esta
operação não tem efeito sobre os objetos na extensão da classe e subclasses. De forma similar
a operação (9) o índice modificado é removido. Em seguida, é criado um novo índice, com o
novo atributo e o(s) atributo(s) definido(s) no índice removido, sobre os objetos na extensão
da classe especificada e suas subclasses.
Entradas:
classe: classe do índice modificado;
nome_indice: nome do índice modificado;
atributo: atributo inserido no índice;
Saída:
retorna o inteiro 1, caso a operação tenha sido efetuada com sucesso e
0 (zero), caso algum erro tenha ocorrido.
Especificação Funcional:
INÍCIO (Insere_atributo_indice)
ENQUANTO existirem inserções de atributos em índices para classe no R2O2 FAÇA
OBTER a lista de atributos do índice
INCLUIR o novo atributo na lista
Retira_indice (classe, nome_indice)
Insere_indice (classe, nome_indice, *atributos)
FIM-ENQUANTO
101
FIM (Insere_atributo_indice)
11.
Retirar um atributo do índice de uma classe
Int Retira_atributo_indice (classe, nome_indice, atributo)
Descrição: retira um atributo no índice da classe informada como parâmetro. Esta
operação não tem efeito sobre os objetos na extensão da classe e subclasses. De forma similar
a operação (9) o índice modificado é removido. Em seguida, é criado um novo índice, para
o(s) atributo(s) definido(s) no índice removido, menos o atributo retirado, sobre os objetos na
extensão da classe especificada e suas subclasses.
Entradas:
classe: classe do índice modificado;
nome_indice: nome do índice modificado;
atributo: atributo retirado do índice;
Saída:
retorna o inteiro 1, caso a operação tenha sido efetuada com sucesso e
0 (zero), caso algum erro tenha ocorrido.
Especificação Funcional:
INÍCIO (Retira_atributo_indice)
ENQUANTO existirem retiradas de atributos de índices para classe no R2O2 FAÇA
OBTER a lista atributos do índice
RETIRAR o atributo na lista
Retira_indice (classe, nome_indice)
Insere_indice (classe, nome_indice, *atributos)
FIM (Retira_atributo_indice)
102
12.
Tornar uma classe S superclasse de uma classe S1
Int Insere_superclasse (classe, superclasse)
Descrição: insere valor(es) para os objetos da classe informada como parâmetro
referente(s) ao(s) atributo(s) herdado(s) da superclasse S.
Entradas:
superclasse: superclasse S;
classe: classe S1;
Saída:
retorna o inteiro 1, caso a operação tenha sido efetuada com sucesso e
0 (zero), caso algum erro tenha ocorrido.
Especificação Funcional:
INÍCIO (Insere_superclasse)
ENQUANTO existirem modificações para tornar a classe S superclasse de uma classe
S1 no R2O2 FAÇA
ENQUANTO existirem atributos da superclasse para inserção na
classe FAÇA
Insere_atributo (classe, atributo, domínio, valor)
FIM-ENQUANTO
FIM-ENQUANTO
FIM (Insere_superclasse)
13.
Remover uma classe S da lista de superclasses da classe S1
Int Remove_superclasse (superclasse, classe)
Descrição: remove os valor(es), referente(s) ao(s) atributo(s) herdado(s) da
superclasse S, para os objetos da classe informada como parâmetro.
103
Entradas:
superclasse: superclasse S;
classe: classe S1;
Saída:
retorna o inteiro 1, caso a operação tenha sido efetuada com sucesso e
0 (zero), caso algum erro tenha ocorrido.
Especificação Funcional:
INÍCIO (Remove_superclasse)
ENQUANTO existirem modificações para remover a classe S da lista de
superclasses de uma classe S1 no R2O2 FAÇA
ENQUANTO existirem atributos da classe superclasse para serem
retirados da classe no R2O2 FAÇA
Exclui_atributo (classe, atributo)
FIM-ENQUANTO
FIM-ENQUANTO
FIM-SE
FIM (Remove_superclasse)
14.
Criar uma nova classe no esquema
Int Cria_classe (classe, *atributos, *domínios)
Descrição: cria uma classe. Esta operação não tem efeito sobre os objetos das classes e
das subclasses existentes.
Entradas:
classe: nome da classe criada;
*atributos: lista de atributos da classe criada;
*domínios: lista de domínios de atributos da classe criada;
104
Saída:
retorna o inteiro 1, caso a operação tenha sido efetuada com sucesso e
0 (zero), caso algum erro tenha ocorrido.
Especificação Funcional:
INÍCIO (Int Cria_classe)
Cria_classe (classe, *atributos, *domínios)
FIM (Int Cria_classe)
15.
Retirar uma classe no esquema
Int Retira_classe (classe)
Descrição: exclui uma classe informada como parâmetro. Esta operação resulta na
exclusão dos objetos existentes na extensão da classe retirada.
Entradas:
classe: classe retirada;
Saída:
retorna o inteiro 1, caso a operação tenha sido efetuada com sucesso e
0 (zero), caso algum erro tenha ocorrido.
Especificação Funcional:
INÍCIO (Retira_classe)
OBTER número_referência dos objetos da classe
SE número_referência for zero ENTÃO
Retira_classe (classe)
FIM-SE
FIM (Retira_classe)
105
16.
Modificar o nome de uma classe
Int Modifica_nome_classe (classe, novo_nome_classe)
Descrição: modifica o nome da classe informada como parâmetro. Esta operação não
tem efeito sobre os objetos na extensão da classe e das subclasses. No entanto, em
conseqüência das limitações impostas pelo modelo de armazenamento, conforme foi descrito
no subitem 4.3.1, a classe modificada é recriada com o novo nome.
Entradas:
classe: nome da classe modificada;
novo_nome_classe: novo nome da classe modificada;
Saída:
retorna o inteiro 1, caso a operação tenha sido efetuada com sucesso e
0 (zero), caso algum erro tenha ocorrido.
Especificação Funcional:
INÍCIO (Modifica_nome_classe)
OBTER número_referência dos objetos da classe
SE número_referência for zero ENTÃO
OBTER as listas de atributos e domínios da classe modificada
Cria_classe (novo_nome_classe, *atributos, *domínios)
ENQUANTO existirem objetos na classe FAÇA
Migrar_objeto (classe, novo_nome_classe, Id_Obj)
FIM-ENQUANTO
Retira_classe (classe)
FIM-SE
FIM (Modifica_nome_classe)
106
17. Migrar um objeto de uma classe origem O para uma classe destino D
Int Migrar_objeto (classe_origem, classe_destino, Id_Obj)
Descrição: exclui da extensão da classe classe_origem o objeto (Id_Obj) informado
como parâmetro e o inclui na classe classe_destino, mantendo o mesmo identificador.
Entradas:
classe_origem: classe origem do objeto migrado;
classe_destino: classe destino do objeto migrado;
Id_Obj: identificador do objeto referenciado; e
Saída:
retorna o inteiro 1, caso a operação tenha sido efetuada com sucesso e
0 (zero), caso algum erro tenha ocorrido.
Especificação Funcional:
INÍCIO (Migrar_objeto)
OBTER número_referência do objeto (Id_Obj) da classe
SE número_referência for zero ENTÃO
SE a classe classe_destino for superclasse da classe classe_origem ENTÃO
ENQUANTO o objeto Id_Obj possuir atributo específico da classe_origem
FAÇA
Exclui_atributo (classe, atributo) para o objeto referenciado
(Id_Obj)
FIM-ENQUANTO
SENÃO
SE a classe classe_destino for subclasse da classe classe_origem OU a
classe classe_destino possua no mínimo uma superclasse em
comum com a classe classe_origem ENTÃO
107
ENQUANTO houver atributo específico da classe_destino FAÇA
Insere_atributo (classe, atributo, domínio, valor) para o
objeto referenciado (Id_Obj)
FIM-ENQUANTO
FIM-SE
FIM-SE
ATUALIZAR o controle de objetos modificados na lista de Id_Obj
ATUALIZAR o atributo propagação na classe REPREGRAS
FIM-SE
FIM (Migrar_objeto)
As atualizações dos códigos C++ provenientes das operações: (18) Acrescentar um
método à classe, (19) Remover um método da classe e (20) Renomear um método da
classe são de responsabilidade do usuário que, auxiliado pelo sistema, tem acesso a estas
modificações realizadas sobre os métodos.
5.2 - OPERAÇÕES ESPECÍFICAS DE MANIPULAÇÃO DO R2O2
A seguir serão descritas as funcionalidades de métodos e funções específicas para
instanciação e varredura do R2O2.
21. Instanciar o R2O2
Int Intancia_R2O2 (arq: alt.dat)
108
Descrição: instancia o R2O2, a partir do arquivo alt.dat, gerado pelo MAME e
informado como parâmetro. Cada ocorrência do arquivo corresponde a uma operação de
modificação, executada sobre o esquema da aplicação. Estas ocorrências são instanciadas
como objetos nas classes do R2O2 e, posteriormente, propagadas aos objetos das classes da
aplicação, conforme descrito no item 4.3.
Entradas:
arq: alt.dat: arquivo gerado pelo MAME com as operações de
modificação executadas sobre o esquema da aplicação;
Saída:
retorna o inteiro 1, caso a operação tenha sido efetuada com sucesso e
0 (zero), caso algum erro tenha ocorrido.
Especificação Funcional:
INÍCIO (Int Intancia_R2O2)
ENQUANTO existirem ocorrências no arquivo alt.dat FAÇA
OBTER tipo de operação
INSTANCIAR a classe do R2O2 conforme o tipo de operação
ATUALIZAR o controle de objetos modificados na lista de Id_Obj
FIM-ENQUANTO
FIM (Int Intancia_R2O2)
22. Verificar a existência de modificações para uma classe no R2O2
Int Condição_R2O2 (classe, Id_Obj)
Descrição: conforme a descrição apresentada no item 4.3, este método é ativado por
quaisquer métodos básicos de atualização, ou de recuperação dos objetos das classes da
aplicação, gerados pela LIDAS. Varre o R2O2 e verifica se existem modificações não
109
propagadas para a classe informada como parâmetro; em seguida ativa o método de
propagação sobre o objeto (Id_Obj) ou objetos, de acordo com o tipo correspondente de
operação obtida.
Entradas:
classe: classe do atributo inserido; e
Id_Obj: identificador do objeto referenciado
Saída:
retorna o inteiro 1, caso a operação tenha sido efetuada com sucesso e
0 (zero), caso algum erro tenha ocorrido.
Especificação Funcional:
INÍCIO (Int Condição_R2O2)
VARRER R2O2
ENQUANTO existirem modificações para a classe no R2O2 FAÇA
OBTER tipo de operação
ENQUANTO existirem objetos na classe FAÇA
PROPAGAR modificação aos objetos da classe conforme o tipo de
operação obtido
FIM-ENQUANTO
FIM-ENQUANTO
FIM (Int Condição_R2O2)
5.3 - TABELAS DE CONVERSÃO PARA MODIFICAÇÕES DE ATRIBUTOS
As tabelas mostradas a seguir têm por objetivo estabelecer as possíveis conversões de
domínios, de restrições e de características definidas para os atributos das classes,
provenientes destes tipos de operação.
110
TABELA 5.1 - Conversões possíveis de domínio
DOMÍNIO
NOVO
DOMÍNIO
INT
REAL
BOOL
CHAR
DATA
LISTA
TUPLA
CONJ
CLASSE
INT
REAL
//////
SIM
NÃO
SIM
SIM 1
SIM 2
SIM 2
SIM 2
SIM 2
SIM
//////
NÃO
SIM 1
SIM 1
SIM 2
SIM 2
SIM 2
SIM 2
PRIMITIVOS
BOOL CHAR
SIM
SIM
//////
SIM
NÃO
NÃO
NÃO
NÃO
NÃO
SIM
SIM
NÃO
//////
SIM 1
SIM 2
SIM 2
SIM 2
SIM 2
DATA
CONSTRUTORES
LISTA TUPLA
CONJ
SIM 1
SIM 1
NÃO
SIM
//////
SIM 2
SIM 2
SIM 2
SIM 2
NÃO
NÃO
NÃO
NÃO
NÃO
SIM 2
SIM 2
SIM 3
SIM 2
NÃO
NÃO
NÃO
NÃO
NÃO
SIM 2
SIM 2
SIM 2
SIM 2
NÃO
NÃO
NÃO
NÃO
NÃO
SIM 4
SIM 2
SIM 2
SIM 2
TABELA 5.2 - Modificações possíveis de restrições
RESTRIÇÃO
NOVA
RESTRIÇÃO
NENHUMA
VALOR
INTERVALO
ESTADO
NENHUMA
VALOR
INTERVALO
ESTADO
//////
SIM 7
SIM 7
SIM 7
SIM 6
SIM 7
SIM 5
SIM 5
SIM 6
SIM 7
SIM 7
SIM 7
SIM 6
SIM 7
SIM 7
SIM 7
TABELA 5.3 - Modificações possíveis de características
CARACTERÍSTICA
NOVA
CARACTERÍSTICA
NÃO NULO
ÚNICO
AMBAS
NENHUMA
NÃO NULO
ÚNICO
AMBAS
NENHUMA
//////
NÃO
NÃO
SIM 6
SIM
//////
SIM
SIM 6
SIM
SIM
//////
SIM 6
SIM 8
NÃO
NÃO
//////
111
CLASSE
NÃO
NÃO
NÃO
NÃO
NÃO
SIM 2
SIM 2
SIM 2
SIM 5
Os detalhes de implementação e mecanismos de tratamentos diferenciados para os
objetos pertencentes à extensão das classes em alguns casos específicos de conversão, são
descritos a seguir:
(1)
Nestas conversões de domínio, os valores assumidos para atualizar os atributos
dos objetos da classe serão aqueles informados como parâmetro nas chamadas às operações
de modificação. Caso contrário, os objetos assumirão valores nulos;
(2)
Nestas conversões de domínio, os objetos instanciados são inicializados com
valores nulos e, posteriormente, especificados pelo usuário a partir das aplicações. As
estruturas correspondentes aos novos domínios, que não existirem por ocasião da
modificação, serão criadas pela LIDAS;
(3)
Nas conversões de domínio de lista para conjunto, os objetos duplicados são
removidos da classe, a critério do usuário;
(4)
Nas conversões de domínio de conjunto para lista, os objetos instanciados são
ordenados, caso contrário, a lista será inicializada com valores nulos e, posteriormente,
especificados pelo usuário a partir das aplicações;
(5)
Nestas conversões de domínio, se a classe correspondente ao novo domínio for
subclasse ou superclasse da classe domínio atual, os objetos instanciados mantêm seus
valores. Caso contrário, valores nulos serão assumidos e, posteriormente, especificados pelo
usuário a partir das aplicações;
(6)
Nestas modificações, os objetos existentes mantêm seus valores para os
atributos modificados;
112
(7)
A tabela mostra que todas modificações são possíveis, porém, se os valores
dos objetos instanciados não satisfizerem as novas restrições, o usuário informará os novos
valores a partir das aplicações;
(8)
Para esta modificação de característica, o usuário deverá informar os novos
valores para os objetos que possuírem valor nulo.
113
CAPÍTULO 6
AMBIENTE DO PROTÓTIPO DE IMPLEMENTAÇÃO
6.1 - CONTEXTO DA APLICAÇÃO
Neste capítulo, os efeitos de propagação das operações de evolução de esquemas sobre
uma base de objetos são apresentados através de alguns exemplos implementados sobre o
protótipo da aplicação SCH - Sistema de Controle Hospitalar definida no ambiente SIGO.
A Figura 6.1 mostra as classes e as tabelas geradas a partir do esquema conceitual da
aplicação SCH. Este esquema é representado seguindo as seguintes definições:
•
PESSOA - superclasse de MÉDICO e PACIENTE e uma agregação dos atributos:
Foto (tipo imagem), Sexo (char), Idade (int), Nome (char) e Endereço (char);
•
MÉDICO - subclasse de PESSOA e uma agregação dos atributos: CRM (char) e
Escala (char);
•
PACIENTE - subclasse de PESSOA e uma agregação de: Prontuário (char),
Anamnese (tipo texto) e Consulta (lista de CONSULTA);
•
CONSULTA - é uma agregação dos atributos: Médico (classe de MÉDICO),
Data_Hora (char), Diagnóstico (tipo texto), Queixa (tipo voz) e Exame (conjunto
de EXAME); e
•
EXAME - é uma agregação de: Nome_Exame (char), Preço (Real) e Requisitos
(tipo texto).
114
Endereço
Idade Foto a
a
a
a
Diagnóstico
Médico Data_Hora
a
Nome
a
Queixa
a
a
Sexo
a
CONSULTA
l
PESSOA
g
CRM
a
MÉDICO
g
Consulta
a
Escala
a
a
Prontuário
a
PACIENTE
Exame
Anamnese
a
s
Nome_Exame
a Preço
EXAME
a
Requisitos
a
PESSOA (Id_Pessoa, Id_Foto, Sexo, Idade, Nome, Endereço)
MÉDICO (Id_Médico, CRM, Escala)
PACIENTE (Id_Paciente, Prontuário, Id_Anamnese, Id_Lista_Consulta)
CONSULTA
(Id_Consulta,
Id_Médico,
Data_Hora,
Id_Diagnóstico,
Id_Queixa,
Id_Conjunto_Exame)
EXAME (Id_Exame, Nome_Exame, Preço, Id_Requisitos)
LISTA_CONSULTA (Id_Lista_Consulta, Id_Consulta)
CONJUNTO_EXAME (Id_Conj_Exame, Id_Exame)
FIGURA 6.1 - Esquema conceitual e tabelas da aplicação SCH
6.2 - OPERAÇÕES DE EVOLUÇÃO DA BASE DE OBJETOS NO SCH
Um subconjunto de operações de evolução de esquemas foi selecionado como base
para criação de alguns exemplos de propagação dos efeitos destas modificações às instâncias
das classes. Estes exemplos serão descritos a seguir:
•
Exemplo no 1
115
Operação: Insere_atributo (MÉDICO, Especialidade, A20, “clínica”), inclusão do
atributo “Especialidade” do tipo alfanumérico, com 20 posições para classe MÉDICO, o valor
“clínica” será assumido na inclusão do atributo para os objetos instanciados;
Estrutura da tabela antes da operação: MÉDICO (Id_Médico, CRM, Escala);
A Figura 6.2 mostra os objetos instanciados antes da operação;
Estrutura da tabela após a operação: MÉDICO (Id_Médico, CRM, Escala,
Especialidade);
A Figura 6.3 mostra os objetos instanciados após a operação.
•
Exemplo no 2
Operação: Exclui_atributo (EXAME, Preço), exclusão do atributo “Preço” da classe
EXAME;
Estrutura da tabela antes da operação: EXAME (Id_Exame, Nome_Exame, Preço,
Id_Requisitos);
A Figura 6.4 mostra os objetos instanciados antes da operação;
Estrutura da tabela após a operação: EXAME (Id_Exame,
Nome_Exame,
Id_Requisitos);
A Figura 6.5 mostra que após a operação, os objetos instanciados perderam os valores
do atributo excluído.
•
Exemplo no 3
Operação: Renomeia_atributo (MÉDICO, Escala, Plantão), renomeação para
“Plantão” do atributo “Escala” da classe MÉDICO;
Estrutura da tabela antes da operação: MÉDICO (Id_Médico, CRM, Escala);
116
A Figura 6.6 mostra os objetos instanciados antes da operação;
Estrutura da tabela após a operação: MÉDICO (Id_Médico, CRM, Plantão);
A Figura 6.7 mostra que após a operação, os objetos instanciados não sofreram
qualquer modificação. No entanto, em conseqüência das limitações impostas pelo modelo de
armazenamento, conforme foi descrito no subitem 4.3.1, a classe modificada foi recriada com
o atributo renomeado.
•
Exemplo no 4
Operação: Modifica_dom_atributo (PACIENTE, Prontuário, “inteiro”), modificação
de domínio do atributo “Prontuário” da classe PACIENTE, de caracter para inteiro;
Estrutura da tabela antes da operação: PACIENTE (Id_Paciente, Prontuário,
Id_Anamnese, Id_Lista_Consulta);
A Figura 6.8 mostra os objetos instanciados antes da operação;
Estrutura da tabela após a operação: PACIENTE (Id_Paciente, Prontuário,
Id_Anamnese, Id_Lista_Consulta);
A Figura 6.9 mostra que após a operação os objetos instanciados tiveram o domínio
dos valores do atributo “Prontuário” modificado de caracter para inteiro.
•
Exemplo no 5
Operação: Modifica_dom_atributo (PACIENTE, Consulta, “conjunto”), modificação
de domínio do atributo “Consulta” da classe PACIENTE, de lista para conjunto;
Estrutura da tabela antes da operação: PACIENTE (Id_Paciente, Prontuário,
Id_Anamnese, Id_Lista_Consulta);
A Figura 6.10 mostra os objetos instanciados antes da operação;
117
Estrutura da tabela após a operação: PACIENTE (Id_Paciente, Prontuário,
Id_Anamnese, Id_Conjunto_Consulta);
A Figura 6.11 mostra que após a operação, os objetos instanciados tiveram o domínio
dos valores do atributo “Consulta” modificado de lista para conjunto. Além disto, um valor
nulo foi assumindo, cabendo ao usuário suas atualizações pela aplicação.
•
Exemplo no 6
Operação: Modifica_dom_atributo (PESSOA, Endereço, “tupla”), modificação de
domínio do atributo “Endereço” da classe PESSOA, de caracter para tupla;
Estrutura da tabela antes da operação: PESSOA (Id_Pessoa, Id_Foto, Sexo, Idade,
Nome, Endereço);
A Figura 6.12 mostra os objetos instanciados antes da operação;
Estrutura da tabela após a operação: PESSOA (Id_Pessoa, Id_Foto, Sexo, Idade,
Nome, Id_tupla_Endereço);
A Figura 6.13 mostra que após a operação, os objetos instanciados tiveram o domínio
dos valores do atributo “Endereço” modificado de caracter para tupla. Além disto, um valor
nulo foi assumindo, cabendo ao usuário suas atualizações pela aplicação.
•
Exemplo no 7
Operação:
Modifica_rest_atributo
(EXAME,
Preço,
777777,
“≤
450.00”),
modificação de restrição sobre o atributo Preço da classe EXAME, de “nenhuma” para “≤
450.00”, estabelecendo o maior preço possível para um exame;
Estrutura da tabela antes da operação: EXAME (Id_Exame, Nome_Exame, Preço,
Id_Requisitos);
118
A Figura 6.14 mostra os objetos instanciados antes da operação;
Estrutura da tabela após a operação: EXAME (Id_Exame,
Nome_Exame,
Id_Requisitos);
A Figura 6.15 mostra os objetos instanciados após a operação. O usuário informou o
novo valor 449.99 para o objeto acessado “Id_Exame = 777777”, uma vez que o valor
anterior não atendia a nova restrição definida.
•
Exemplo no 8
Operação: Modifica_carac_atributo (EXAME, Requisitos, 777777, “não nulo”),
modificação de característica sobre o atributo Requisitos da classe EXAME, de “nenhuma”
para “não nulo”, estabelecendo que todos os exames têm requisitos;
Estrutura da tabela antes da operação: EXAME (Id_Exame, Nome_Exame, Preço,
Id_Requisitos);
A Figura 6.16 mostra os objetos instanciados antes da operação;
Estrutura da tabela após a operação: EXAME (Id_Exame, Nome_Exame, Preço,
Id_Requisitos);
A Figura 6.17 mostra os objetos instanciados após a operação. O usuário informou o
novo texto “não ter feito abreugrafia nos últimos seis meses” para o objeto acessado
“Id_Exame = 777777”, uma vez que o valor anterior “nulo” não atendia a nova restrição
definida, o texto recebeu o “Id_Requisitos = 444444”.
•
Exemplo no 9
119
Operação: Cria_classe (RESIDENTE, Responsável, “classe PESSOA”), criação da
classe RESIDENTE, com o atributo “Responsável” do tipo “classe PESSOA”, que define o
responsável pelo médico residente;
Estrutura da tabela antes da operação: não há;
Objetos instanciados antes da operação: não há;
Estrutura da tabela após a operação: RESIDENTE (Id_Residente, Id_Pessoa).
•
Exemplo no 10
Operação: Insere_superclasse (RESIDENTE, MÉDICO, 888888), torna a classe
MÉDICO superclasse da classe RESIDENTE criada no exemplo no 9;
Estrutura da tabela PESSOA: PESSOA (Id_Pessoa, Id_Foto, Sexo, Idade, Nome,
Endereço) ;
Estrutura da tabela MÉDICO: MÉDICO (Id_Médico, CRM, Escala);
Estrutura da tabela RESIDENTE antes da operação: RESIDENTE (Id_Residente,
Id_Pessoa);
A Figura 6.18 mostra os objetos instanciados na tabela RESIDENTE antes da
operação;
Estrutura da tabela RESIDENTE após a operação: RESIDENTE (Id_Residente,
Id_Pessoa). O mecanismo de herança faz com que a tabela RESIDENTE herde todos os
atributos de MÉDICO e PESSOA, assumindo, numa visão lógica, a seguinte estrutura:
RESIDENTE (Id_Pessoa, Id_Foto, Sexo, Idade, Nome, Endereço, CRM, Escala, Id_Pessoa);
A Figura 6.19 mostra os objetos instanciados na tabela RESIDENTE após a operação.
Todos os atributos de MÉDICO e PESSOA são inseridos com valores “nulos” para o objeto
acessado “Id_Residente = 444444”.
120
•
Exemplo no 11
Operação: Remove_superclasse (MÉDICO, RESIDENTE, 888888), remove a classe
MÉDICO do conjunto de superclasses da classe RESIDENTE. Esta operação tem efeito
inverso ao exemplo no 10, isto é, os atributos de médicos serão removidos da classe
RESIDENTE.
•
Exemplo no 12
Operação: Migrar_objeto (MÉDICO, PACIENTE, 123456), migração do objeto
“Id_Pessoa = 123456” da classe MÉDICO para a classe PACIENTE;
Estrutura da tabela MÉDICO antes da operação: MÉDICO (Id_Médico, CRM,
Escala);
A Figura 6.20 mostra os objetos instanciados na tabela MÉDICO antes da operação;
Estrutura da tabela PACIENTE antes da operação: PACIENTE (Id_Paciente,
Prontuário, Id_Anamnese, Id_Lista_Consulta);
A Figura 6.21 mostra os objetos instanciados na tabela PACIENTE antes da operação;
Estrutura da tabela MÉDICO após a operação: MÉDICO (Id_Médico, CRM, Escala);
A Figura 6.22 mostra os objetos instanciados na tabela MÉDICO após a operação. O
objeto “Id_Pessoa = 123456” foi removido da tabela;
Estrutura da tabela PACIENTE após a operação: PACIENTE (Id_Paciente,
Prontuário, Id_Anamnese, Id_Lista_Consulta);
A Figura 6.23 mostra os objetos instanciados na tabela PACIENTE após a operação.
O objeto “Id_Pessoa = 123456” é inserido na tabela, preservando seu identificador e os seus
atributos oriundos da classe PESSOA. Além disso, perde os atributos CRM e Escala da classe
121
MÉDICO e ganha os atributos Prontuário, Id_Anamnese, Id_Lista_Consulta da classe
PACIENTE, que são inicializados com valor nulo.
999999 888888
m 12 Ricardo Tijuca 111 0800 1200
777777 666555
f
26 Ana
Leblon 222 1200 1600
555555 444444
f
15 Aline
Grajaú 333 1600 1200
Id_Pessoa
Sexo
Id_Foto
Nome
Idade
CRM
Endereço
Escala
FIGURA 6.2 - Objetos instanciados na classe MÉDICO (Exemplo no 1)
999999 888888
m 12 Ricardo Tijuca 111 0800 1200 clínica
777777 666666
f 26 Ana
Leblon 222 1200 1600 clínica
555555 444444
f 15 Aline
Grajaú 333 1600 1200 clínica
Id_Pessoa
Id_Foto
Sexo
Nome
Idade
CRM
Endereço
Especialidade
Escala
FIGURA 6.3 - Objetos instanciados na classe MÉDICO (Exemplo no 1)
122
999999 hemograma
250.00 555555 (jejum)
888888 abreugrafia
128.00 nulo (nenhum)
777777 eletrocardiograma 455.00 nulo (nenhum)
Id_Exame
Preço
Nome_Exame
Id_Requisitos
FIGURA 6.4 - Objetos instanciados na classe EXAME (Exemplo no 2)
999999 hemograma
555555 (jejum)
888888 abreugrafia
nulo (nenhum)
777777 eletrocardiograma nulo (nenhum)
Id_Exame
Id_Requisitos
Nome_Exame
FIGURA 6.5 - Objetos instanciados na classe EXAME (Exemplo no 2)
123
999999 888888
m 12 Ricardo Tijuca 111 0800 1200
777777 666666
f 26 Ana
Leblon 222 1200 1600
555555 444444
f 15 Aline
Grajaú 333 1600 1200
Id_Pessoa
Sexo
Id_Foto
Nome
Idade
CRM
Endereço
Escala
FIGURA 6.6- Objetos instanciados na classe MÉDICO (Exemplo no 3)
999999 888888 m 12 Ricardo Tijuca 111 0800 1200
777777 666666
f
26 Ana
Leblon 222 1200 1600
555555 444444
f
15 Aline
Grajaú 333 1600 1200
Id_Pessoa
Id_Foto
Sexo
Nome
Idade
CRM
Endereço
Escala
Plantão
FIGURA 6.7 - Objetos instanciados na classe MÉDICO (Exemplo no 3)
124
999999 9876 555555 (texto1) 123456
888888 5432 444444 (texto2) 789012
777777 1098 333333 (texto3) 345678
Id_Paciente
Id_Anamnese
Prontuário (caracter)
Id_Lista_Consulta
FIGURA 6.8 - Objetos instanciados na classe PACIENTE (Exemplo no 4)
999999 9876 555555 (texto1) 123456
888888 5432 444444 (texto2) 789012
777777 1098 333333 (texto3) 345678
Id_Paciente
Id_Anamnese
Prontuário (caracter) Id_Lista_Consulta
(inteiro)
FIGURA 6.9 - Objetos instanciados na classe PACIENTE (Exemplo no 4)
125
999999 9876 555555 (texto1) 123456
888888 5432 444444 (texto2) 789012
777777 1098 333333 (texto3) 345678
Id_Paciente
Id_Anamnese
Prontuário
Id_Lista_Consulta
FIGURA 6.10 - Objetos instanciados na classe PACIENTE (Exemplo no 5)
999999 9876 555555 (texto1) nulo
888888 5432 444444 (texto2) nulo
777777 1098 333333 (texto3) nulo
Id_Paciente
Id_Anamnese
Prontuário
Id_Lista_Consulta
Id_Conjunto_Consulta
FIGURA 6.11 - Objetos instanciados na classe PACIENTE (Exemplo no 5)
126
999999 888888 m 12 Ricardo Tijuca
777777 666555 f 26
Ana
Leblon
555555 444444 f 15
Aline
Grajaú
Id_Pessoa
Sexo
Id_Foto
Nome
Idade
Endereço
(caracter)
FIGURA 6.12 - Objetos instanciados na classe PESSOA (Exemplo no 6)
999999 888888 m 12 Ricardo
nulo
777777 666666 f
26 Ana
nulo
555555 444444 f
15 Aline
nulo
Id_Pessoa
Id_Foto
Sexo
Nome
Idade
Endereço (caracter)
(Id_tupla_Endereço)
FIGURA 6.13 - Objetos instanciados na classe PESSOA (Exemplo no 6)
127
999999 hemograma
250.00 555555 (jejum)
777777 eletrocardiograma 455.00 nulo (nenhum)
Id_Exame
Preço
Nome_Exame
Id_Requisitos
FIGURA 6.14 - Objetos instanciados na classe EXAME (Exemplo no 7)
999999 hemograma
250.00 555555 (jejum)
777777 eletrocardiograma 449.99 nulo (nenhum)
455.00
Id_Exame
Preço
Nome_Exame
Id_Requisitos
FIGURA 6.15 - Objetos instanciados na classe EXAME (Exemplo no 7)
999999 hemograma
250.00 555555 (jejum)
777777 eletrocardiograma 455.00 nulo (nenhum)
Id_Exame
Preço
Nome_Exame
Id_Requisitos
FIGURA 6.16 - Objetos instanciados na classe EXAME (Exemplo no 8)
128
999999 hemograma
250.00 555555 (jejum)
777777 eletrocardiograma 455.00 444444 (não ter feito....)
Id_Exame
Preço
Nome_Exame
Id_Requisitos
FIGURA 6.17 - Objetos instanciados na classe EXAME (Exemplo no 8)
222222 999999
333333 777777
444444 555555
Id_Residente
Id_Pessoa
FIGURA 6.18 - Objetos instanciados na classe RESIDENTE (Exemplo no 10)
444444 nulo nulo nulo nulo nulo nulo nulo 555555
Id_Pessoa
Sexo
Id_Foto
Nome
Idade
CRM
Endereço
Id_Pessoa
Escala
FIGURA 6.19 - Objetos instanciados na classe RESIDENTE (Exemplo no 10)
129
999999 888888 m 12 Ricardo Tijuca 111 0800 1200
123456 666555
f 26 Ana
Leblon 222 1200 1600
555555 444444 f 15 Aline
Id_Pessoa
Sexo
Id_Foto
Grajaú 333 1600 1200
Nome
Idade
CRM
Endereço
Escala
FIGURA 6.20 - Objetos instanciados na classe MÉDICO (Exemplo no 12)
222222 222777 m 58 Luís
copa
9876 555555 (texto1) 123456
777777 777333 f 32 Mônica Grajaú 5432 444444 (texto2) 789012
333333 333000 f 33 Eduarda Urca 1098 333333 (texto3) 345678
Id_Pessoa
Sexo
Nome
Id_Foto Idade
Prontuário
Endereço
Id_Lista_Consulta
Id_Anamnese
FIGURA 6.21 - Objetos instanciados na classe PACIENTE (Exemplo no 12)
130
999999 888888 m 12 Ricardo Tijuca 111 0800 1200
123456 666555 f
26 Ana
Leblon 222 1200 1600
555555 444444 f
15 Aline
Grajaú 333 1600 1200
Id_Pessoa
Sexo
Id_Foto
Nome
Idade
CRM
Endereço
Escala
FIGURA 6.22 - Objetos instanciados na classe MÉDICO (Exemplo no 12)
222222 222777 m 58 Luís
copa
9876 555555 (texto1) 123456
777777 777333 f 32 Mônica Grajaú 5432 444444 (texto2) 789012
333333 333000 f 33 Eduarda Urca 1098 333333 (texto3) 345678
123456 666555 f 26 Ana
Id_Pessoa
Sexo
Id_Foto
Leblon nulo
Nome
Idade
nulo
Prontuário
Endereço
nulo
Id_Lista_Consulta
Id_Anamnese
FIGURA 6.23 - Objetos instanciados na classe PACIENTE (Exemplo no 12)
131
CAPÍTULO 7
CONCLUSÃO
7.1 - CONTRIBUIÇÕES
Este trabalho apresenta o resultado da pesquisa de vários aspectos e de alternativas
sobre evolução dinâmica de esquemas num ambiente de BDOOs, através do uso efetivo de
regras ativas inseridas no gerenciador do BD. O principal objetivo foi gerenciar e realizar o
tratamento da propagação dos efeitos das operações de modificação, sob o ponto de vista
estrutural e comportamental, em relação à base de objetos instanciada, pertencente a uma
aplicação definida no Sistema Gerenciador de Objetos - SIGO.
Visando viabilizar e disponibilizar ao usuário esta funcionalidade, os resultados
obtidos foram implementados em um protótipo e incorporados à aplicação SCH - Sistema de
Controle Hospitalar.
A pesquisa desenvolvida abrangeu o estudo dos vários aspectos relativos à
consistência intencional e extensional de BDs e às alternativas para manutenção de instâncias,
no processo de evolução de esquemas em SGBDOOs. Estes aspectos foram investigados nos
seguintes SGBDOOs: O2, ORION, GEMSTONE e OBJECTSTORE. Paralelamente, também
foram pesquisadas a semântica, bem como as estruturas e mecanismos de utilização de regras
em BDs Ativos.
De uma forma objetiva, a principal contribuição deste trabalho foi garantir a
integridade de instanciação do esquema da aplicação, pela extensão da utilização de regras
ativas, no tratamento da evolução da base de objetos. Este tratamento possibilita a
modificação do esquema após a instanciação da base. Outra importante contribuição foi a
132
definição conceitual e implementação de uma estrutura hierárquica de classes denominada
R2O2, para armazenamento e propagação das efetivas modificações efetuadas sobre um
esquema de aplicação. O R2O2 é extensível, o que permite incorporar à estrutura, outras
operações de modificação, ou mesmo outros tipos de regras de ação que venham a ser
definidas.
Além disso, podem ainda ser ressaltadas algumas contribuições intermediárias, como
por exemplo:
•
Especificação e descrição funcional dos efeitos sobre os métodos e objetos das
operações de modificação de atributos, de classes, de objetos e de métodos numa
hierarquia de classes;
•
Auxílio ao usuário no processo de evolução dos métodos, através da
disponibilização das informações, referentes a todas modificações operadas sobre
os métodos e os atributos das classes da aplicação;
•
Implementação de um subconjunto de modificações selecionado sobre o protótipo
da aplicação SCH, definida no ambiente SIGO. O objetivo é mostrar a propagação
dos efeitos destas operações sobre uma base de objetos pertencentes à extensão das
classes.
7.2 - SUGESTÕES PARA TRABALHOS FUTUROS
Existem várias funcionalidades avançadas que estão sendo pesquisadas e
desenvolvidas, todas elas motivadas pelas necessidades dos SGBDOOs. Um dos objetivos
mais importantes é a extensibilidade que pode ser suportada através de diversos mecanismos,
além da alternativa de evolução apresentada nesta tese.
133
Com base no trabalho realizado, algumas sugestões para trabalhos futuros são
apresentadas a seguir:
(1)
Desenvolvimento e implementação do versionamento de esquemas descrito no
item 2.2. O principal objetivo desta funcionalidade é prover ao usuário a habilidade de
manipular múltiplas versões do esquema, além de manter um acompanhamento histórico das
modificações ocorridas. É desejável ainda que este acompanhamento alcance o esquema
conceitual e as instâncias para possibilitar, indistintamente, o correto funcionamento de novas
e antigas aplicações;
(2)
Desenvolvimento e implementação de visões, sujeitas a modificações,
relevantes a um grupo de usuários. Esta alternativa provê um conjunto de operações, através
do qual as visões podem ser definidas e manipuladas numa hierarquia de classes;
(3)
Análise de desempenho e de complexidade assintótica das operações
desenvolvidas para operar a varredura e a propagação dos efeitos das modificações sobre a
base de objetos. Estas implementações foram feitas em C++, utilizando a biblioteca de
funções do PARADOX ENGINE. A sugestão apresentada se justifica porque, em alguns
casos, os tempos de resposta mostraram-se extremamente ineficientes, mesmo quando a
manipulação das estruturas envolviam um pequeno número de instâncias. Este trabalho,
portanto, teria por objetivo a otimização destas operações, devendo-se incluir o estudo de
outros métodos de acesso e de estruturas de armazenamento, além do sistema atual adotado
pelo SIGO (BORLAND,1992);
(4)
Extensão da definição conceitual e implementação do R2O2 para o tratamento
de regras semânticas de aplicação;
(5)
Inclusão no R2O2 de uma classe DICIONÁRIO para o armazenamento dos
valores dos objetos, dos atributos e das classes modificadas ou retiradas do esquema. Este
134
gerenciamento visa atender a uma possível necessidade de recuperação ou de retorno a
estados anteriores do esquema da aplicação. Além disso, a ativação ou não desta facilidade
seria opcionalmente expressa pelo usuário, como um parâmetro de “retenção” nas operações
de evolução de esquemas.
7.3 - CONSIDERAÇÕES FINAIS
A evolução natural da tecnologia de BDs, visando prover o suporte necessário às
aplicações não convencionais, voltou-se para o desenvolvimento de SGBDs mais poderosos,
os SGBDOOS, incluindo-se modelos, linguagens e capacitação para definição de novos tipos
de dados (KHOSHAFIAN,1993).
Um dos aspectos em destaque nos SGBDOOs, diz respeito à modelagem conceitual
de BDs. É imprescindível que tais sistemas ofereçam ambientes simples e amigáveis que
disponibilizem, ao usuário, as abstrações necessárias para modelar suas aplicações.
Além disso, o tratamento de esquemas complexos, a herança múltipla, as modificações
dinâmicas durante a execução de programas são também aspectos a serem avaliados. Em
particular, observa-se que a realidade de interesse das aplicações não convencionais está
sujeita a freqüentes alterações. Estas se refletem diretamente na modelagem das aplicações, e
devem acompanhar este aspecto dinâmico.
O capítulo 2 descreve algumas propostas de evolução de esquemas, envolvendo o
tratamento por versionamento ou sobre um esquema único. Estas propostas foram
consideradas para a adoção daquela mais adequada ao ambiente SIGO. Porém, conforme a
especificação contida no item 4.3, o tratamento de evolução de esquemas no SIGO pelo uso
135
de regras ativas constitui, de fato, uma proposta original, visto que, no contexto da literatura
pesquisada, nenhuma outra sugeriu abordagem semelhante.
As novas capacidades embutidas nos SGBDOOs representam, efetivamente, a
perspectiva de processamento de uma extensa gama de operações consideradas de nova geração
de SGBDs. O tratamento de evolução de esquemas no SIGO, com garantia de integridade
intencional e extensional, acompanha a tendência das pesquisas realizadas na área e incorpora
aspectos particulares específicos do protótipo em desenvolvimento (BARROS, 1995).
136
REFERÊNCIAS BIBLIOGRÁFICAS
ABITEBOUL, 1988 - ABITEBOUL, R. H.; IFO: A Formal Semantic Database Model; ACM
Transactions on Database Systems, dezembro 1988.
ARAUJO, 1993 - ARAUJO, G. M. Linguagem de Métodos para um Ambiente de Banco de
Dados Orientado a Objetos. Tese de Mestrado, IME, Rio de Janeiro, março 1993.
ATKINSON, 1990 - ATKINSON, M. et al., The Object-Oriented Database Systems
Manifesto. Proceedings of the 1990 ACM SIGMOD International Conference on
Management of Data, Atlantic City, NJ, maio 1990.
BANERJEE, 1987 - BANERJEE et al., Semantics and Implementation of Schema Evolution
in Object-Oriented Database, ACM Sigmod Record vol 16 nº 93 1987.
BARROS, 1995 - BARROS, R.O.; MOURA, A.M.C; Uso de Regras Ativas no Tratamento de
Evolução de Esquemas em BDOOs, II Wokshop de Bancos de Dados Não Convencionais - UFF,
Rio de Janeiro - RJ, dezembro 1995.
BARROS, 1996 - BARROS, R.O.;MOURA, A.M.C., Use of Active Rules in the Schema
Evolution Process of an Object Manager System, submetido à XXII Conferência
Latinoamericana de Informática, Bogotá, Colômbia, junho 1996.
BORLAND, 1992 - BORLAND INTERNATIONAL INC.; Borland Paradox Engine Version 3.0; C Reference; and User’s Guide, 1992.
BUTTERWORTH, 1991 - BUTTERWORTH, P.; OTIS, A.; STEIN, J., The GemStone Object
Database System. Communications of ACM, Oct 1991.
CATTELL, 1991 - CATTELL, R.G.G., Sun Microsystems Inc. Object Data Management
Object-Oriented and Extended Relational Database System, 1991.
CATTELL, 1994 - CATTELL, R.G.G. et al., Object Database Standard ODMG 93, 1994.
CERI, 1994 - CERI, S.; et al.; Active Databases Systems, PUC-Rio DB Workshop on New
Databases Research Challenges, setembro 1994.
CHAKRAVARTHY, 1992 - CHAKRAVARTHY, S.; Architectures and Monitoring
Techniques for Active Databases: An Evaluation. Technical Report UF-CIS-TR-92-041,
1992.
CODD, 1970 - CODD, E. Relational Model of Data for Large Shared Data Bank,
Comunications of the ACM, Junho 1970.
COLLYER, 1996 - COLLYER, C.S.G.; Linguagem de Consulta ao SIGO: Um Sistema
Gerenciador de Objetos. Tese de Mestrado, IME, Rio de Janeiro, 1996 (em
desenvolvimento).
137
COSTA, 1992 - COSTA, M. R. Uma Linguagem de Consulta para um Banco de Dados
Orientado a Objetos. Tese de Mestrado, IME, Rio de Janeiro, 1992.
DATE, 1987 - DATE, C.J., Introducion to Database Systems, Ed. Campus, 1987.
DEUX, 1991 - DEUX, O. et al. The O2 System. Communications of the ACM, vol 34 nº 10
Oct 1991.
FERRANDINA, 1995 - FERRANDINA, F. et al.; Schema and Database Evolution in the O2
Object Databse System, Proceedings of the 21th VLDB Conference Zurich, Switzerland,
1995.
FREITAS, 1991 - FREITAS, L. Esquema Físico para Armazenamento de Objetos
Complexos. Tese de Mestrado, IME, Rio de Janeiro, 1991.
FORNARI, 1993 - FORNARI, M. RODRIGUES et al., Evolução de Esquemas Utilizando
Versões em BDOOs, Anais do 8º SBBD, João Pessoa - PB, 1993 pp 115-127.
GEMSTONE, 1995 - GEMSTONE SYSTEMS, INC., Introduction to Gemstone; Object
Server Version 4.1, Internet, homepage gemstone, http://www.gemstone.com/, 1995.
GOLENDZINER, 1993 - GOLDSTEIN, LIA G. GOLENDZINER, Um estudo sobre Versões
em Bancos de Dados Orientados a Objeto, exame de qualificação no CPGCC/UFRGS, março
1993.
GOLENDZINER, 1995 - GOLDSTEIN, LIA G. GOLENDZINER et el., Definição e
Manipulação de Configurações em BDOOs, X SBBD - Simpósio Brasileiro de Banco de
Dados, Recife, Outubro 1995, pp 335-349.
GUIMARÃES, 1995 - GUIMARÃES, A. R. N., Interface Orientada a Objetos para Criação
e Manipulação de Esquemas Conceituais no SIGO. Tese de Mestrado, IME, Rio de Janeiro,
março 1995.
HARRUS, 1990 - HARRUS, G.F., et al., Implementing Schema Upadates in an Objectoriented Databases System: Acost Analisys, Technical Report, GIP Altair, Le Chesnay Cedex,
France, 1990.
ITASCA, 1990 - ITASCA SYSTEMS INC., ITASCA System Overview, Unisys, Mineapolis,
Minesota, 1990.
KATZ, 1990 - KATZ, R.H. Towards a Unified Framework for Version Modeling in
Engineering Databases. ACM Computing Surveys, Dec 1990.
KHOSHAFIAN, 1993 - KHOSHAFIAN, S. et al., Object Orientation Databases, John Wiley
& Sons Inc, 1993.
138
KIM, 1987 - KIM, W. et al., Features of the ORION Object-oriented Databases System,
Proceedings of the Very Large Databases Endowment, 1987.
KIM, 1990 - KIM W., Introducion to Object-oriented Databases, The MIT Press, 1990.
KIM, 1995 - KIM W., Modern Databases Systems, The Object Model, Interoperability and
Beyond, ACM Press, Addison Wesley Publishing Company, 1995.
LAMB, 1991 - LAMB, C.; LANDIS, G.; ORENSTEIN, J.; and WEINREB, D. The Object
Store Database System. Communications of the ACM, Oct 1991.
LÈCLUSE, 1989 - C.LÈCLUSE; et al., The O2 Data Model, Altair Technical Report 39,
França, 1989.
LIMA, 1993 - LIMA, C. A. A. Tratamento de Dados Multimídia num Ambiente de Banco de
Dados Orientados a Objeto. Tese de Mestrado, IME, Rio de Janeiro, 1993.
MORSI, 1992 - MORSI, MAGDI M.A., Extensible Object-Oriented Databases with
Dynamic Schemas, tese de doutorado, Georgia Institute Technology, agosto 1992.
MOSS, 1992 - MOSS, J.E.; Working with Persistent Object: to Swizzle or not Swizzle, IEEE
Transactions on Software Engineering, vol. 18, agosto 1992.
MOURA, 1994 - MOURA, A.M.C. et al., Ambiente para Desenvolvimento de Aplicações
não Convencionais em BDs, Relatório Técnico de Pesquisa, FAPERJ, 1994.
MOURAa, 1995 - MOURA, A.M.C. et al.., Exploring Aspects of Schema Evolution and
Persistence in a Object Manager System, Relatório Técnico nº 009/DE9/95, Instituto Militar
de Engenharia / Departamento de Engenharia de Sistemas, dezembro, 1995.
MOURAb, 1995 - MOURA, A.M.C. et al., Dealing with Persistence in an Object
Management System Using Relational Implementation, XV Internacional Conference of the
Chilean Computer Science Society, Arica, Chile, novembro 1995.
NAVATHE, 1994 - NAVATHE S.B.; ELMASRI R., Fundamentals of Database Systems, 2nd
edition, Benjamin/Cunnings, 1994.
OBJECTIVITY, 1990 - OBJECTIVITY INC., Objectitity Database Reference, Menlo Park,
California, 1990.
OBJECTDESIGN, 1990 - OBJECT DESIGN INC., ObjectStore Reference, Burlington, 1990.
QUADROS, 1996 - QUADROS, J.R.T.; Modelagem Hiperdocumentos em um Sistema
Gerenciador de Objeto. Tese de Mestrado, IME, Rio de Janeiro, abril 1996.
PENNEY, 1987 - PENNEY, J.STEIN, Class Modification in the GemStone Object-Oriented
Database Systems, in Proceedings of de Second International Conference on Object-Oriented
Programming Systems, Languages and Applications (OOPSLA), 1987.
139
PREVOT, 1994 - PREVOT, M.PREVOT; LANZELOTE R. S. G., Formalizando a Evolução
de Esquemas em SGBDOOs, Anais do 9º SBBD, São Carlos -SP, 1994 pp 157-172.
ROSSETI, 1991 - ROSSETI, L. C. Linguagem de Definição e Manipulação de Esquema num
Banco de Dados Orientado a Objetos. Tese de Mestrado, IME, Rio de Janeiro, 1991.
SILBERCHATZ, 1994 - SILBERCHATZ, A. et al. Database Systems Concepts, McGraw
Hill, 1994.
SILVA, 1996 - ANDRÉA, T.S.; Implementação de Regras Ativas em um Sistema
Gerenciador de Objetos. Tese de Mestrado, IME, Rio de Janeiro, 1996 (em
desenvolvimento).
SOLOVIEV, 1992 - SOLOVIEV, V. et al.;An Overview of Three Commercial ObjectOriented Database Management Systems: ONTOS, ObjectStore, and O2. SIGMOD Records,
March 1992.
TANAKA, 1995 - TANAKA, A.K., BDs Ativos, Anais do 10º SBBD, Recife -PE, outubro
1995, pp 29-53.
ULLMAN, 1989 - ULLMAN, J.D., Principles of Database Systems, Computer Science
Press, 1989.
VELEZ, 1989 - VELEZ, F. et al.; The O2 Manager: an Overview, Rapport Technique, Altair,
Fevereiro 1987.
VERSANT, 1990 - VERSANT OBJECT TECHNOLOGY INC., Versant Reference Manual,
Menlo Park, California, 1990.
WIDOM, 1996 - WIDOM, J.; CERI, S.; Active Databases Systems Triggers and Rules for
Advanced Database Processing, Morgam Kaufmann Publishers, Inc., 1996.
XAVIER, 1989 - MAGNO, C. M. S. Modelagem Conceitual Orientada a Objetos para Banco
de Dados. Tese de Mestrado, IME, Rio de Janeiro, 1989.
XIDAK , 1990 - XIDAK INC., Orion System Overview, Palo Alto, California, 1990.
ZICARI, 1991 - ZICARI, ROBERTO; A Framework for Schema Updates in an ObjectOriented Database System, 7 º IEEE International Conference on Data Engineering Kobe,
Japão, Abril 1991.
140
APÊNDICE A
ESTRUTURA DO ARQUIVO DE MODIFICAÇÕES DO ESQUEMA ALT.DAT
141
APÊNDICE A - ESTRUTURA DO ARQUIVO DE MODIFICAÇÕES DO ESQUEMA
ALT.DAT
Arquivo texto gerado pelo MAME para leitura e instanciação dos objetos no R2O2.
Este arquivo possui a seguinte estrutura:
•
Atributos comuns a todos os registros:
Base (char) 7
Operação (char) 2
Classe (char) 24
•
Para registros referentes às operações 1, 2, 3, 4, 5 e 6:
Atributo (char) 24
•
Para registros referentes à operação 1
DomínioAtrib (char) 8
TamanhoAtrib (int)
CaracterísticaAtrib (char) 7
RestriçãoAtrib (char) 32
•
Para registros referentes à operação 3
NovoNomeAtrib (char) 24
•
Para registros referentes à operação 4
NovoDom (char) 8
NovoTamanhoAtrib (int)
•
Para registros referentes à operação 5
NovaRest (char) 32
•
Para registros referentes à operação 6
NovaCarac (char) 7
142
•
Para registros referentes às operações 7, 8, 9, 10 e 11
NomeIndice (char) 24
•
Para registros referentes às operações 7, 9, 10 e 11 (tantos quantos forem os atributos
componentes do índice conforme NumeroAtrib)
NumeroAtrib (int)
Atributos (char) 24
•
Para registros referentes à operação 9
NomeIndatual (char) 24
•
Para registros referentes às operações 12 e 13
Superclasse (char) 24
•
Para registros referentes à operação 16
NovoNomeClasse (char) 24
•
Para registros referentes à operação 17
ClasseDestino (char) 24
Id_obj (double)
•
Para registros referentes às operações 18 e 19
Método (char) 32
•
Para registros referentes à operação 19
NovoNomeMétodo (char) 32
143
Exemplos:
aplica; 1; pessoa; telefone; caracter; 7; nenhuma;;;; 0; ;;;;;;;;;0; 0;
Id_Obj
Número_Atributo
Tamanho_Atributo
Característica_Atributo
Tamanho_Atributo
Domínio_Atributo
Atributo
Classe
Operação
Base
aplica;2;pessoa;endereço;;0;;;;;0;;;;;;;;;;0;0;
aplica;3;pessoa;matricula;;0;;;;;0;;;;;;;inscricao;;;0;0;
aplica;4;medico;crm;;0;;;;caracter;8;;;;;;;;;;0;0;
aplica;5;paciente;idade;;0;;;;;0;>=18;;;;;;;;;0;0;
aplica;6;medico;especialidade;;0;;;;;0;;naonula;;;;;;;;0;0;
aplica;7;medico;;;0;;;;;0;;;;;indcrm;;;;;0;2;crm;nome;
aplica;8;pessoa;;;0;;;;;0;;;;;indcrm;;;;;0;0;
aplica;9;pessoa;;;0;;;;;0;;;;;indcrm;indmatr;;;;0;2;crm;idt;
aplica;10;pessoa;;;0;;;;;0;;;;;indcrm;;;;;0;2;crm;nome;
aplica;11;pessoa;;;0;;;;;0;;;;;indcrm;;;;;0;2;crm;nome;
aplica;12;medico;;;0;;;;;0;;;pessoa;;;;;;;0;0;
144
aplica;13;medico;;;0;;;;;0;;;pessoa;;;;;;;0;0;
aplica;15;medico;;;0;;;;;0;;;;;;;;;;0;0;
aplica;16;paciente;;;0;;;;;0;;;;associado ;;;;;;0;0;
aplica;17;medico;;;0;;;;;0;;;;paciente;;;;;;9612011645301915;0;
aplica;19;paciente;;;0;;;;;0;;;;;;;;retirapaciente;;0;0;
aplica;20;paciente;;;0;;;;;0;;;;;;;;retirapaciente;excluipaciente;0;0;
145

Documentos relacionados