Concepção e Administração de Bases de Dados

Transcrição

Concepção e Administração de Bases de Dados
MODELO OBJECTO - RELACIONAL
ORACLE 8
Trabalho realizado no âmbito da cadeira
Concepção e Administração de Bases de Dados
Mestrado em Engenharia Informática
Departamento de Engenharia Informática
Universidade de Coimbra
Filipe Manuel Simões Caldeira, 1999
Oracle 8 – Modelo Objecto - Relacional
Índice
Introdução......................................................................................................................... 3
Bases de Dados Orientadas a Objectos............................................................................. 4
Orientação a Objectos ................................................................................................... 4
O Objecto ................................................................................................................... 4
Hierarquias das Classes ............................................................................................. 6
O Modelo Objecto - Relacional do Oracle 8 .................................................................... 7
Objectos em Oracle ....................................................................................................... 7
Definição de objectos................................................................................................. 7
Métodos ..................................................................................................................... 9
Métodos de comparação ............................................................................................ 9
Tabelas de Objectos (Object Tables) .......................................................................... 10
Referências .................................................................................................................. 10
Tipos de Referências................................................................................................ 11
Dados do Tipo Colecção ............................................................................................. 11
Varray ...................................................................................................................... 11
Nested Tables........................................................................................................... 12
Varrays Vs Nested Tables........................................................................................ 12
Uma estrutura de dados no Modelo Objecto-relacional ................................................. 13
Estrutura de Dados no Modelo Relacional:................................................................. 14
Estrutura de dados no Modelo Objecto - Relacional: ................................................. 16
Conclusão ....................................................................................................................... 20
Bibliografia..................................................................................................................... 20
Pág. 2
Oracle 8 – Modelo Objecto - Relacional
Introdução
Pretende-se com este trabalho, mostrar de uma forma simples a utilização do
“object options pack” do sistema Oracle 8 para implementar o modelo objectorelacional no desenho e estruturação de bases de dados.
É abordada a forma de “pensar” e “programar” orientada a objectos, focando
naturalmente as bases de dados. Apresentam-se também as principais novidades do
Oracle no que se refere a objectos e seu modo de funcionamento e implementação.
Foi introduzido um exemplo que pretende demonstrar a aplicação desta
metodologia a um problema concreto. Este problema é abordado usando o modelo
relacional e posteriormente é usado o modelo objecto-relacioanl, permitindo assim
efectuar uma comparação entre os dois métodos.
Pág. 3
Oracle 8 – Modelo Objecto - Relacional
Bases de Dados Orientadas a Objectos
Uma base de dados orientada a objectos pode ser definida, de um modo geral,
como sendo uma extensão de dois conceitos já bastante conhecidos e divulgados: As
linguagens orientadas a objectos, por exemplo o C++ e um sistema de gestão de bases
de dados.
Um sistema OODBMS, conjuga as principais características destes dois
sistemas, herdando da programação orientada a objectos, as noções de Objecto,
Abstracção de Tipo de Dados, Métodos, Mensagens, Herança e Identidade de cada
Objecto; das bases de dados relacionais, pode usar as características de Persistência,
Transacções, Recuperação, Segurança. Pesquisa, Performance, etc.
Orientação a Objectos
O Objecto
O principal componente do paradigma de orientação a objectos é o objecto. O
Objecto pode ser do tipo primitivo, por exemplo os números inteiros (2,6,8,...),
correspondendo a valores simples, ou do tipo complexo, normalmente definidos pelo
programador, correspondendo a variáveis com uma maior ou menor complexidade
interna, podendo conter vários dados (variáveis), bem como estruturas de programação
no seu interior.
Exemplo de um objecto:
Um objecto que pretende representar a informação respeitante a um aluno:
{Número, Nome, Curso, Morada, telefone, ... }
Cada objecto tem um determinado tipo (Type), denominado class. Sendo que
cada objecto individual de um determinado tipo ou classe é denominado instância. Ao
conjunto de funções e operadores que podem agir sobre uma determinada classe,
chama-se Métodos.
Todos os objectos estão encapsulados, isto é, a estrutura interna de um
determinado objecto não é visível ao utilizador desse objecto, sabendo apenas que o
objecto pode realizar determinadas funções (Métodos). Por exemplo, podem ser
aplicados os seguintes métodos ao objecto alunos: Aprovar_Aluno, Matricular_Aluno
Pág. 4
Oracle 8 – Modelo Objecto - Relacional
etc. O código que implementa os métodos está contido dentro do próprio objecto e pode
utilizar a representação interna do objecto para efectuar a sua função.
A principal vantagem do encapsulamento é permitir alterações na representação
interna dos objectos, sem implicar que se tenha que alterar as aplicações que usem esses
mesmos objectos. Obviamente que uma alteração na representação interna de um
determinado objecto, implicará as alterações correspondentes no código que implementa
os métodos existentes para esse objecto. O conceito de encapsulamento, permite ver o
objecto como tendo duas componentes: Memória Privada e Interface Publico:
A memória privada é constituída pelas variáveis ou atributos do objecto que
representam o seu estado interno. Estas variáveis estão escondidas do utilizador, mas
visível para o código que implementa os diversos métodos desse objecto. Este conceito
aplica-se aos sistemas Orientados a Objectos Puros. Quer dizer que a maior parte dos
sistemas orientados a objectos permitem que o programador veja alguns dos atributos
do objecto partindo do seu exterior.
O Interface Publico consiste na definição da interface entre o objecto e o
programador, basicamente entrada e saída de dados de e para os métodos existentes no
objecto. O código que implementa este interface (implementa os métodos) também não
é visível ao programador. O interface Publico faz parte da definição da classe do
objecto, estando presente apenas no objecto que define a classe e não em cada uma das
instâncias dessa classe.
Os métodos ou acções sobre objectos, são activados usando um sistema de
mensagens, funcionando estas como chamadas a funções ou procedimentos em que o
alvo é identificado. Por exemplo, suponha-se que se pretende escrever o aluno A na
cadeira X, então poderia existir uma mensagem (com uma sintaxe hipotética) para o
alunos X, fazendo com que ele passe a estar matriculado nem uma determinada cadeira :
A Matricular (X) ou Matricular(A,X)
Cada objecto definido tem uma identidade ou identificação única, a que
podemos chamar “Object ID” ou identificador de objecto. O identificador do objecto
poderá ser usado na base de dados como sendo um ponteiro para o objecto a que se
refere. Nesta abordagem, não é necessário que cada objecto tenha uma chave candidata
ou primária, pelo que podem existir dois objectos virtualmente iguais, sendo apenas
distinguidos pelo seu identificador de objecto.
Pág. 5
Oracle 8 – Modelo Objecto - Relacional
A utilização do identificador de objecto, permite criar no modelo objectorelacional, a noção de hierarquia, podendo então um determinado objecto ter um ou
mais atributos que são referências a outros objectos.
Hierarquias das Classes
Nesta abordagem, existe o que podemos chamar hierarquia de classes, sendo esta
hierarquia definida por:
Por exemplo, podemos dizer que a classe de objectos Y é uma subclasse de X, se
e só se todos os objectos de Y forem objectos de X. Do mesmo modo podemos dizer
que X é uma superclasse de Y. Neste caso, os objectos da classe Y, vão herdar (Noção
de herança) as variáveis e métodos que se aplicam á classe X. Como consequência deste
facto, podemos utilizar um objecto do tipo Y sempre que é permitido o uso de um
objecto do tipo X. A herança pode ser simples ou múltipla, isto é, uma determinada
classe pode ser a subclasse de várias superclasses em simultâneo. A herança de
variáveis é denominada herança estrutural; a herança de métodos é denominada
herança comportamental. A possibilidade de aplicar os mesmos métodos a diferentes
classes (desde que uma seja superclasse da outra) é chamada de polimorfismo.
Pág. 6
Oracle 8 – Modelo Objecto - Relacional
O Modelo Objecto - Relacional do Oracle 8
Sendo um dos principais sistemas de gestão de bases de dados existente no
mercado, o Oracle na sua versão 8 introduz uma nova abordagem de funcionamento
com vista á implementação do seu novo modelo Objecto – Relacional. Este modelo
pretende ser um sistema de base de dados orientada a objecto, sendo contudo baseado
no actual modelo relacional.
Usando a opção “object option” do Oracle 8, este transforma-se num sistema
Objecto - Relacional (ORDBMS), permitindo ao utilizador definir tipos de dados
complexos – Objectos – definindo a sua estrutura, bem como definindo o seu modo de
funcionamento – Métodos. Estes novos tipos de dados (objectos) podem agora ser
usados no tradicional modelo relacional, praticamente do mesmo modo como são
utilizados os tipos de dados pré definidos do sistema Oracle (Números, Cadeias de
Caracteres, datas, etc).
Objectos em Oracle
Um objecto em oracle é estruturado da mesma forma que os objectos nas linguagens
de programação orientadas a objectos, permitindo que uma entidade real seja
representada por objecto contendo todos os seus atributos. Deste modo podem-se
referenciar três componentes presentes num objecto:
?? Nome: Representa o tipo de dados no modelo da base de dados.
?? Atributos: Todos os dados existentes dentro do objecto, representando a sua
estrutura bem como o seu estado. Os atributos podem ser de tipo de dados
standard do Oracle ou mesmo outros objectos.
?? Métodos: Operações sobre o objecto, que podem ser escritos em PL/SQL sendo
guardados na própria base de dados ou escritos noutra linguagem como por
exemplo o C++ e guardados externamente.
Definição de objectos
Como exemplo pode ser usada um caso concreto de um objecto. Uma entidade
real “aluno”, pode ser representada pela sua informação base:
Pág. 7
Oracle 8 – Modelo Objecto - Relacional
-
Número do Aluno
Nome
BI
Data de Nascimento
.....
Morada
.....
Um objecto deste tipo poderá ser definido como sendo:
CREATE TYPE Morada AS OBJECT (
Rua
VARCHAR(70),
Cidade
VARCHAR(40),
Codigo_Postal
VARCHAR(40),
Pais
VARCHAR(20),
Telefone
VARCHAR(10),
..... );
CREATE TYPE Aluno AS OBJECT (
Numero
NUMBER,
Nome,
BI
VARCHAR(10),
Data_Nascimento
DATE,
... ,
Contacto
MORADA,
.... );
Uma vez criados os objectos, estes podem ser usados de igual modo como os
tipos de dados já existentes no Oracle, para a criação de uma base de dados relacional,
por exemplo uma base de dados de alunos matriculados:
CREATE TABLE Matriculas (
Identificação ALUNO,
Ano_Lectivo NUMBER,
Data_Matricula
DATE );
Neste caso a tabela Matriculas é uma tabela de uma base de dados relacional,
com a particularidade de conter numa das suas colunas um objecto, sendo esta coluna
denominada Coluna Objecto.
Pág. 8
Oracle 8 – Modelo Objecto - Relacional
Métodos
Um tipo especial de método é o Método Construtor, que permite criar novas
instâncias de um determinado tipo de objecto. O método construtor é uma função,
devolvendo como resultado uma nova instância do objecto. Os seus parâmetros são o
nome e tipo dos atributos do objecto a ser criado.
O nome deste método corresponde por defeito ao nome do tipo do objecto a ser
criado. Por exemplo para a criação de um novo aluno teríamos:
Aluno (
12345,
“Filipe Caldeira”
“9267646”,
28/01/1971,
.... ,
Morada ( “Quinta do Bosque Lt 127 5ºDP”, “Viseu”, “3500 Viseu”, ”Portugal”,
“09367065981”, ....);
)
Métodos de comparação
Sendo uma operação fundamental no funcionamento de uma base de dados, o
Oracle já contém funções de comparação para os seus tipos de dados padrão, por
exemplo é possível sem necessidade de nenhuma operação especial, comparar dois
valores numéricos. Com a criação de objectos, surge a necessidade de comparar dois
objectos distintos, sendo necessário neste caso construir um ou mais de métodos que
permitam comparar estes objectos. Para resolver esta situação, o Oracle 8 põe á
disposição do utilizador dois métodos: Métodos do tipo map e do tipo order.
O método do tipo map, usa as funcionalidades já existentes para a comparação
de tipos padrão, usando os atributos do objecto como factores da comparação. O método
order, usa a lógica interna do objecto para efectuar a comparação entre dois objectos
diferentes (do mesmo tipo), devolvendo um valor correspondente ao tipo de ordem, por
exemplo 1 se o segundo objecto for maior que o primeiro. Na definição do objecto,
apenas se pode definir um dos dois tipos de ordenação mencionados. Caso não seja
especificado nenhum método de comparação, o motor de base de dados apenas pode
concluir se dois objecto são iguais, nada podendo dizer sobre a sua ordem de
relacionamento.
Pág. 9
Oracle 8 – Modelo Objecto - Relacional
Tabelas de Objectos (Object Tables)
Na aproximação objecto-relacional do oracle 8, os objecto são guardados no
formato habitual das tabelas relacionais oracle. A uma tabela contendo objecto foi dados
o nome de object table, permitindo aceder aos dados dos objectos de uma forma
relacional, utilizando duas formas distintas:
-
Uma tabela apenas com uma coluna, em que cada registo é um objecto
diferente.
-
Uma tabela com várias colunas, em que cada atributo do objecto ocupa uma
coluna independente.
Os objectos que aparecem numa linha da tabela, são chamados “row objects”,
sendo aqueles que aparecem numa coluna chamados “column objects”.
Referências
Do mesmo modo que no modelo relacional, tem que ser dados algum tipo de
tratamento ás relações “muitos para um”. No modelo relacional, são usadas chaves
estrangeiras para manter a consistência da base de dados. No modelo objecto relacional
o tipo de relação “muitos para um” é tratado usando Referências, isto é, o oracle atribui
a cada objecto (objecto row), um identificador único e inalterável, chamado “object
identifier”. Existe um tipo de dados pré-definido, chamado REF, que permite que um
objecto seja referenciado por outros objecto ou por uma tabela. As referências podem
ser usadas para visualizar ou modificar o objecto a que ela se refere ou para obter uma
cópia desse mesmo objecto. As únicas alterações que podem ser feitas a uma referência
são de a pôr a apontar para outro objecto do mesmo tipo ou para um valor nulo (Null).
Object view:
Como as Vistas (View) do tradicional modelo relacional, podemos agora criar
um tipo diferente de vistas: As vistas objecto (Object view), que como as suas
antecessoras não passam de tabelas virtuais, neste caso, tabelas objecto virtuais. O
oracle 8 usa as referências de cada objecto para criar as vistas de objecto, permitindo
aceder ás tabelas de uma forma mais personalizada. Por exemplo, pode-se usar uma
vista objecto para aceder apenas a um determinado conjunto de atributos de um objecto.
Pág. 10
Oracle 8 – Modelo Objecto - Relacional
Tipos de Referências
Scoped REF’s – Elemento do tipo REF que contém apenas referências para objectos do
tipo object table.
Dangling REF’s – Referência que pode estar a apontar para um objecto que já não
existe ou cujos privilégios foram alterados. Usando a função IS DANGLING o oracle
permite saber se uma determinada referência está nestas condições.
Dereferencing REF’s – Modo de aceder a objectos do Tipo REF. O Operador utilizado
para esta operação é DEREF.
Uma referência para um determinado objecto, pode ser obtida seleccionando
esse objecto da tabela e aplicando o operador REF.
Dados do Tipo Colecção
O Oracle 8 dispõe de um tipo de dados que pode conter um número indefinido
de objectos de um determinado tipo. Os tipos de dados colecção podem ser do tipo array
ou do tipo tabela, correspondendo a tipos de dados Varray ou Nested Tables.
Varray
Um array é um conjunto ordenado de elementos do mesmo tipo, sendo que cada
elemento desse array têm associado um número (index) correspondente á sua posição
nesse mesmo array. O tamanho do array, ou seja o seu número de elementos pode ser
variável, mas é exigido pelo oracle que seja definido o seu número máximo quando da
criação do array.
A seguinte declaração cria um tipo de dados novo, baseado no tipo Array:
CREATE TYPE Lista AS VARRAY(8) OF NUMBER;
Este novo tipo de dados chamado Lista, pode agora ser utilizado, como tipo de dados
para uma qualquer coluna de uma tabela, um tipo de dados para um atributo de um
objecto ou ainda como uma variável em PL/SQL.
Pág. 11
Oracle 8 – Modelo Objecto - Relacional
Nested Tables
Uma tabela do tipo “nested table”, é um conjunto de dados não ordenados, todos
pertencentes ao mesmo tipo de dados. Estas tabelas são constituídas por apenas uma
coluna, que poderá ser de um tipo de dados standard ou mesmo por um tipo de dados
definido pelo utilizador – um objecto. Sendo uma tabela de dados, pode ser visualizada
de duas formas, mostrando apenas o objecto ou mostrando várias colunas cada uma com
seu atributo do objecto presente na tabela.
CREATE TYPE Lista AS TABLE OF NUMBER;
Este tipo de dados pode ser utilizado nas mesmas situações que o VARRAY,
isto é, como tipo de dados de uma coluna de tabela, como atributo de objectos ou como
variável.
Varrays Vs Nested Tables
Existem algumas diferenças entre estes dois tipos de dados dos quais se podem
destacar as seguintes:
-
Os Varrays são estruturas ordenadas e as nested tables não.
-
As nested tables podem conter um conjunto de elementos virtualmente
infinito, podendo crescer ou diminuir consoante as necessidades.
Contrariamente os Varrays são estruturas mais rígidas, isto é, temos que
definir sempre o número máximo de elementos que estes podem conter. Em
contrapartida os Varrays são mais eficientes em termos de ocupação de
espaço, pelo que a sua utilização deverá ser aconselhada sempre que se possa
definir um número de elementos máximo.
-
Os Varrays não podem ser pesquisados, ou seja, não podemos aplicar querys
neste tipo de dados. No caso das nested tables, podemos aplicar querys sobre
os seus elementos o que poderá ser útil em várias situações.
De um modo geral, caso a ordenação e o número máximo de elementos não
sejam condições muito importantes, devem-se usar nested tables sempre que
pretendemos efectuar pesquisas nestes dados e deve-se usar Varrays quanto podemos
tratar a colecção de dados como um todo com índices para cada um dos elementos.
Pág. 12
Oracle 8 – Modelo Objecto - Relacional
Uma estrutura de dados no Modelo Objecto-relacional
Usando um sistema de gestão de bases de dados, pretende-se gerir a inscrição de
alunos nas várias cadeiras ao longo do curso, bem como guardar informação sobre todas
as avaliações realizadas pelo alunos em cada uma dessas cadeiras. O problema em
questão pode ser representado pelo seguinte esquema. Um aluno é identificado
univocamente pelo seu número de alunos, sendo necessário guardar para cada aluno,
vários dados como o seu nome, morada, telefone, etc. Não se pretende com este
exemplo ser muito exaustivo nos dados necessários para a resolução do problema, mas
apenas se pretende mostrar a estrutura das tabelas. Cada aluno poderá estar ou ter estado
inscrito a uma ou mais cadeiras, sendo que para cada cadeira o aluno poderá realizar
várias avaliações que deverão também ser guardadas.
Aluno
{ Dados do Aluno }
Cadeiras
Cadeira 1 – 10-10-1997 – 1 – {Lista de Avaliações}
Cadeira 2 – 10-10-1997 – 0 – {Lista de Avaliações}
Cadeira 3 – 07-10-1997 – 0 – {Lista de Avaliações}
.
.
.
Cadeira n – 04-10-1998 – 1 – {Lista de Avaliações}
Época 1 – 1997 Época 2 – 1997 Época 3 – 1997 Época 1 – 1998 Época 2 – 1998 -
Frequência - 25-01-1998 - 4 val.
Exame Normal - 10-07-1998 - 8 val.
Exame Recurso - 16-09-1998 - 9 val.
Frequência - 12-02-1999 - 7 val.
Exame Normal - 23-07-1999 - 12 val.
Época 1 – 1998 - Frequência - 08-02-1999 - 8 val.
Época 3 – 1998 - Exame Recurso - 03-09-1999 - 14 Val.
Analisando os dados necessários para a resolução deste problema, chega-se a um
conjunto de tabelas organizadas segundo o modelo relacional. Cada tabela poderá estar
relacionada com outra(s), usando o conceito de chave estrangeira.
Pág. 13
Oracle 8 – Modelo Objecto - Relacional
Estrutura de Dados no Modelo Relacional:
A tabela alunos é uma das tabelas base de toda esta estrutura de dados,
fornecendo a sua chave primária (Naluno) a outras tabelas para servir ai de chave
estrangeira.
Tabela de Alunos:
CREATE TABLE Alunos (
NAluno
Nome
Ano_Ingresso
Ano
Rua1
Cpostal1
Cidade1
Telefone11
Telefone12
Rua2
Cpostal2
Cidade2
Telefone21
Telefone22
PRIMARY KEY (Numero)
);
NUMBER,
VARCHAR(100),
NUMBER,
NUMBER,
VARCHAR(100),
VARCHAR(50),
VARCHAR(50),
VARCHAR(12),
VARCHAR(12),
VARCHAR(100),
VARCHAR(50),
VARCHAR(50),
VARCHAR(12),
VARCHAR(12),
É necessário que exista informação sobre quais as cadeiras existentes, isto é,
quais as cadeiras a que o aluno pode estar inscrito. Para resolver esta situação é criada
uma tabela que contém todas as cadeiras existentes.
Tabela de Cadeiras Existentes:
CREATE TABLE Cadeiras (
Cod_Cadeira
NUMBER,
Ano
NUMBER,
Nome
NUMBER,
Creditos
NUMBER,
PRIMARY KEY(Codigo)
);
A relação Alunos<->Cadeiras é implementada usando uma tabela em que é
ligado o Número de Aluno e o código da cadeira como chave primária. Estes valores
são chaves estrangeiras das tabelas Alunos e cadeiras, fazendo com que apenas possa
Pág. 14
Oracle 8 – Modelo Objecto - Relacional
existir uma linha desta tabela se o Aluno indicado existir assim como se existir a cadeira
indicada.
Cadeiras de cada Aluno;
CREATE TABLE Aluno_Cadeira (
NAluno
NUMBER REFERENCES Alunos,
Cod_Cadeira
NUMBER REFERENCES Cadeiras,
DataInsc
DATE,
Aprovado
NUMBER,
PRIMARY KEY (Naluno,Cod_Cadeira)
);
Para definir a relação Alunos<->Cadeira<->Avaliações, é usada uma nova tabela
cuja chave primária é constituída pelo número do aluno, código da cadeira, ano_lectivo
e época de avaliação. As chaves estrangeiras presentes nesta tabela referem-se a dados
existentes na tabela anterior, isto é, apenas permite que seja introduzida uma avaliação a
um aluno/Cadeira que exista na tabela de cadeiras por aluno, ou seja, o aluno está
inscrito a essa cadeira.
Avaliação por cadeira:
CREATE TABLE Cadeira_Avaliacao (
Naluno
NUMBER REFERENCES Aluno_Cadeira,
Cod_Cadeira
NUMBER REFERENCES Aluno_Cadeira,
Ano_Lectivo
NUMBER,
Epoca
NUMBER,
Desc_Aval
VARCHAR(50),
Data
DATE,
Nota
NUMBER,
PRIMARY KEY (Naluno, Cod_Cadeiram, Ano_Lectivo, Epoca)
);
Esta estrutura poderá ser melhorada completando os dados necessários em cada
tabela (informação pertinente a guardar). Por outro lado existe informação que está a ser
duplicada, como por exemplo as épocas de avaliação e a sua descrição. Deveria existir
uma tabela de dados onde fossem guardada essa informação, servindo depois como
chave estrangeira para a tabela Cadeira_Avaliação. Não foram contempladas estas
alterações pois não se pretende resolver completamente o problema mas sim mostrar a
estrutura de dados a implementar e usar esta estrutura como ponto de comparação com o
mesmo problema resolvido usando o método objecto-relacional e implementado no
Oracle 8 usando nested tables, que é apresentado de seguida.
Pág. 15
Oracle 8 – Modelo Objecto - Relacional
Estrutura de dados no Modelo Objecto - Relacional:
Usando uma definição prévia dos tipos de dados a serem usados, permite que se possa
definir objectos que usem este tipo de dados, mesmo antes de eles terem sido
completamente definidos. Funciona basicamente como a declaração forward do C++.
Definição Inicial de Todos os Tipos de dados a serem usados.
CREATE TYPE Aluno ;
CREATE TYPE Endereco ;
CREATE TYPE Telefones ;
CREATE TYPE Cadeira_Disponiveis ;
CREATE TYPE Cadeiras ;
CREATE TYPE Lista_Cadeiras ;
CREATE TYPE Avaliacao ;
CREATE TYPE Lista_Avaliacoes ;
De modo a permitir que cada aluno possa ter definidos até cinco número de
telefone diferentes por cada endereço fornecido, é definido o tipo de dados Telefones
como um array de 5 elementos, sendo cada elemento um campo de texto de
comprimento 12. Definiu-se este tipo de dados utilizando um array, porque o número
máximo de telefones a guardar pode ser claramente definido, assim como não será
necessário efectuar pesquisas nos dados introduzidos.
CREATE TYPE Telefones AS VARRAY(5) OF VARCHAR(12) ;
O objecto endereço, permite uma maior simplicidade na posterior definição do
objecto Aluno pois este objecto irá conter toda a informação necessária a cada um dos
endereços definidos, incluindo uma lista de números de telefone para cada um dos
endereços.
CREATE TYPE Endereco AS OBJECT (
Rua
VARCHAR(100),
Cpostal
VARCHAR(50),
Cidade
VARCHAR(50),
Tel
REF TELEFONES
);
Pág. 16
Oracle 8 – Modelo Objecto - Relacional
É criado um objecto Cadeiras_Disponiveis, contendo a informação necessária á
identificação de cada cadeira que o aluno pode frequentar e propor-se a avaliação. Estes
objectos serão guardados numa tabela a que podemos chamar uma tabela auxiliar, pois
irá permitir por exemplo (na aplicação a desenvolver) escolher a cadeira em que cada
aluno se pretende e pode matricular.
CREATE TYPE Cadeiras_Disponiveis AS OBJECT (
Cod_Cadeira
NUMBER,
Ano
NUMBER,
Nome
NUMBER,
Creditos
NUMBER
);
Com os dois objectos seguintes, Cadeiras e Lista_cadeiras, pretende-se vir a
implementar as relações entre alunos / cadeiras / Avaliações.
O Objecto Lista_cadeiras é definido como sendo uma nested table, pelo que cada
objecto deste tipo irá conter as cadeiras a que cada aluno se matriculou (relação AlunosCadeiras). Do mesmo modo cada Objecto desta lista irá conter no seu interior outra
objecto (Lista_Avaliações), também implementado como uma nested table onde estão
todas as avaliações a que o alunos se foi submetendo para esse objecto (cadeira).
CREATE TYPE Cadeiras AS OBJECT (
Cadeira
REF Cadeiras_Disponiveis,
Data1Insc
DATE,
Aprovado
NUMBER,
Avaliacoes
Lista_Avalicaoes
);
CREATE TYPE Lista_Cadeiras AS TABLE OF Cadeiras ;
O Objecto do tipo Avaliação, irá conter a informação de cada avaliação que o
aluno realizou a uma determinada cadeira. Sendo a lista de avaliações a cada cadeira
implementada como uma nested table.
Pág. 17
Oracle 8 – Modelo Objecto - Relacional
CREATE TYPE Avaliacao AS OBEJCT (
Ano_Lectivo
NUMBER,
Epoca
NUMBER,
Desc_Aval
VARCHAR(50),
Data
DATE,
Nota
NUMBER
);
CREATE TYPE Lista_Avaliacoes AS TABLE OF Avalicao ;
O Objecto do tipo aluno será neste caso o principal objecto de toda esta
estrutura, contendo a informação de cada aluno, salientado que cada endereço é um
objecot definido anteriormente. As cadeiras a que o aluno está matriculado também são
definidas aqui como sendo um objecto do tipo Lista_cadeiras. Portanto podemos ver o
conceito de “objecto dentro de objecto”. Neste caso dentro de cada elemento da Lista de
cadeiras ainda podemos encontrar um novo objecto contendo a lista das avaliações a
essa cadeira. Foi também introduzido um método que irá permitir comparar dois alunos,
neste caso será implementado utilizando o número de alunos nessa comparação,
permitindo então por exemplo ordenar os alunos por ordem numérica.
CREATE TYPE Aluno AS OBJECT (
NAluno
NUMBER,
Nome
VARCHAR(100),
Ano_Ingresso
NUMBER,
End_Aulas
ENDERECO,
End__Ferias
ENDERECO,
Cadeiras_Mat
Lista_Cadeiras,
ORDER MEMBER FUNCTION
Ordena_Alunos (X IN Aluno) RETURN INTEGER,
);
Nesta estrutura de dados poderiam ser implementado vários métodos, como por
exemplo a pesquisa de cadeiras feitas pelo aluno, cadeiras por fazer, média das cadeiras
já feitas, etc. Neste exemplo vou apenas apresentar o método que permite comparar
dois alunos usando o seu número como termo de comparação.
Pág. 18
Oracle 8 – Modelo Objecto - Relacional
Definição do método Ordena_Alunos:
CREATE OR REPLACE TYPE BODY Aluno AS
ORDER MEMBER FUNCTION
Ordena_Alunos (X IN Alunos) RETURN INTEGER IS
BEGIN
RETURN NAluno – X.Naluno
END;
END;
Criação das Tabelas de Suporte:
Uma vez definido o tipo de dados a usar, é necessário criar as tabelas que irão
servir de suporte á informação.
A tabela que irá conter as cadeiras (Objectos do tipo Cadeira) a que o aluno se
poder inscrever é definida do seguinte modo:
CREATE TABLE Tab_Cadeiras OF Cadeiras_Disponiveis
( Cod_Cadeira PRIMARY KEY) ;
Do mesmo modo vamos definir a tabela que irá conter os alunos e as relações
para cadeiras/avaliações.
CREATE TABLE Tab_Alunos OF Alunos (
PRIMARY KEY (Naluno)
)
NESTE TABLE Lista_Cadeiras STORE AS Tab_L_Cadeiras ;
ALTER TABLE Tab_L_Cadeiras ADD (
SCOPE FOR (Cadeira) IS tab_Cadeiras
)
NESTED TABLE Lista_Avaliacoes STORE AS Tab_L_Aval );
A tabela de alunos (Tab_Alunos), irá conter tosos os objecto do tipo aluno,
sendo que uma das suas colunas é um ponteiro para uma nested table (Tab_L_Cadeiras)
que contém as cadeiras a que o aluno está matriculado. Foi feita uma alteração á tabela
Tab_L_Cadeiras, de modo a que esta nested table também contenha uma coluna que
aponte para outra nested table que contem os dados referentes á avaliação dessa cadeira.
Pág. 19
Oracle 8 – Modelo Objecto - Relacional
Conclusão
Podemos verificar que o uso do modelo Objecto - Relacional poderá na grande
maioria dos casos facilitar o desenho da estrutura da base de dados, estando as relações
entre objectos reais, encapsuladas no interior de cada objecto da base de dados. Neste
caso, os dados ficam melhor estruturados que no modelo relacional, pois embora
fisicamente as relações estejam feitas usando tabelas diferentes, o utilizador apenas
poderá utilizar a tabela principal Alunos que contém toda a informação necessária. A
sintaxe da criação de tipos de dados e de tabelas poderá conter algumas falhas, pois não
me foi possível ter acesso a um sistema Oracle 8 com a opção de objectos.
Esta abordagem da Oracle poderá ser considerada como um grande avanço na
área das bases de dados, facilitando o seu desenho e principalmente, facilitando a
posterior construção de aplicações, pois muito código poderá ser embebido no interior
de cada objecto.
Bibliografia
?? Apontamentos das Aulas da Cadeira
?? An Introduction to Database Systems – 6ª Edição
C. J. Date
Addison-Wesley Publishing Company
?? A First Course in Database Systems
Jeffrey D. Velman, Jennifer Widom
Prentice Hall
?? Manuais “On-Line” do Oracle 8
?? Pesquisa na Internet,
Pág. 20

Documentos relacionados