Bases de Datos
Orientadas a Objetos
Videos disponible en:
https://www.youtube.com/playlist?list=PLE52589CB659BD920
Universidad de los Andes
Demián Gutierrez
1
... nuevas Necesidades
Nuevas capas de aplicación
Reglas más complejas asociadas mucho más a nivel
de aplicación (general) que a nivel de tuplas
Mayor interacción (y más compleja) entre el usuario y
la aplicación
Transacciones de larga duración (en parte por el punto
anterior)
2
... nuevas Necesidades
Información más complejas -> Objetos
Comportamiento asociado a la información -> Objetos
Reducir la impedancia entre las nuevas capas de
aplicación (Objetos) y el almacenamiento persistente de
los datos (Relacional)
3
SGBDOOO
Sist. De Gestión de BD Orientados a Objetos
Un Sistema de Gestión de Base de
Datos Orientado a Objetos (SGBDOO) es
un SGBD que integra de forma
transparente características de las
bases de datos (almacenamiento y
acceso a la información, entre otros) con
características de los lenguajes de
programación de aplicación
orientados a objetos.
4
Condiciones en las que nacen los SGBDR
(años 60-70)
Es decir, el SGBDOO se puede ver como
una extensión que le da
características de persistencia a
algunos objetos de un lenguaje orientado
a objetos
O como una extensión que añade
características orientación a objetos a
un Sistema de Gestión de Bases de
Datos 5
¿cuál es la idea?
6
Estructuras
de Datos a Nivel
de Aplicación
(Modelo)
Lenguaje OO
La persistencia
está integrada
por completo
de forma
transparente en
la aplicación
7
Modelo de Datos OO
Base de Datos
OO
Aplicación
Nuestro trabajo es
diseñar e implementar
esto... 8
¿impedancia?
Reducir la impedancia entre las nuevas capas de
aplicación (Objetos) y el almacenamiento persistente de
los datos (Relacional)
9
Desarrollo con SGBDR y SGBDOO
Estructuras
Aquí hay un de Datos a Nivel
problema de de Aplicación
“acoplamiento”
o “impedancia”
(Modelo)
Lenguaje OO
Copia y
Traducción
Transferencia
Representación de Datos
Relacional Transparente
(SGBDOO)
SGBDR
La persistencia
está integrada
por completo
de forma
transparente en
la aplicación
10
Aplicación OO con un SGBDR (1)
(Impedancia o Acoplamiento)
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection( //
"jdbc:mysql://localhost:3306/persona", "root", "");
Statement statement = connection.createStatement();
Persona p = new Persona();
p.setCedula("13556901");
p.setNombre("Pedro Perez");
String sql = "INSERT INTO t_persona VALUES (" + //
getNextId(connection) + ", '" + //
p.getCedula() + "', '" + p.getNombre() + "')";
System.err.println(sql);
statement.execute(sql); Aquí hay que transformar los datos
de un objeto a una sentencia DML
connection.close(); en SQL. En este caso es simple,
pero se puede volver repetitivo y
propenso a errores 11
Aplicación OO con un SGBDR (2)
(Impedancia o Acoplamiento)
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection( //
"jdbc:mysql://localhost:3306/persona", "root", "");
Statement statement = connection.createStatement();
ResultSet rs = statement.executeQuery( //
"SELECT * FROM t_persona WHERE cedula='13556901'");
Persona p = null;
if (rs.next()) {
p = new Persona(rs.getString("cedula"), rs.getString("nombre"));
p.setId(rs.getInt("id"));
} else {
System.err.println("Persona no encontrada");
}
Nuevamente, es necesario
System.err.println(p.getId() + ";" + // transformar los datos
p.getCedula() + ";" + p.getNombre()); resultantes de la consulta a
12
connection.close(); variables u objetos
Aplicación OO con un SGBDOO (3)
(Orientado a Objetos / Mínimo Acoplamiento)
Session session = CledaConnector.getInstance().getSession();
session.beginTransaction();
Persona p = new Persona();
p.setCedula("13556901");
p.setNombre("Pedro Perez");
session.saveOrUpdate(p); ¿Que pasó aquí?
¡No puede ser tan fácil!
session.getTransaction().commit();
session.close();
El la instancia p de tipo persona es persistido automáticamente
13
Aplicación OO con un SGBDOO (4)
(Orientado a Objetos / Mínimo
Acoplamiento)
Session session = CledaConnector.getInstance().getSession();
session.beginTransaction();
Query q = session.createQuery( //
"FROM Persona WHERE cedula=:cedula");
q.setString("cedula", "13556901");
Persona p = (Persona) q.uniqueResult();
La consulta
System.err.println(p.getId() + ";" + // aquí retorna un
p.getCedula() + ";" + p.getNombre()); objeto
session.getTransaction().commit();
directamente
session.close(); (Al contrario
que SQL)
El lenguaje de consulta es “parecido” a SQL, usa principios
similares, pero es orientado a objetos (en este caso es HQL)
14
El Estándar ODMG-93
(más por razones históricas
que prácticas)
15
El Estándar ODMG-93 (Release 1.1)
El release 1.1 del estándar del ODMG (Object
Database Management Group) es un esfuerzo
por estandarizar los conceptos fundamentales
de los SGBDOO
El estandar fue desarrollado entre los años
1993 y 1994 por representantes de un amplio
conjunto de empresas relacionadas al
desarrollo de software y sistemas orientados a
objetos
16
El estandar define:
Condiciones en las que nacen los SGBDR
(con el tiempo...)
Modelo de Objetos
Lenguaje de Definición de Objetos (ODL)
Lenguaje de Consulta de Objetos (OQL)
Enlaces con C++
Enlaces con Smalltalk
Enlaces con... (otros lenguajes OO)
17
El Estándar ODMG-93 (Release 1.1)
(El Modelo de Objetos)
El modelo de objetos incluye y define conceptos de:
Interfaces, Tipos, Implementaciones e Instancias (Objetos).
Atributos / Métodos (Comportamiento).
Representación de Vínculos entre Tipos (Colecciones / Referencias).
Herencia (Jerarquías de Tipos y Clases / Especialización /
Generalización / Supertipos / Subtipos).
Extensiones de Tipos (Listas de objetos de cierto tipo).
Claves de Tipos.
Identidad de los Objetos (OID). 18
El Estándar ODMG-93 (Release 1.1)
(El Modelo de Objetos)
El modelo de objetos incluye y define conceptos de:
Polimorfismo.
Encapsulamiento.
Excepciones.
Estructura de complejidad arbitraria (vs información dispersa a lo
largo de varias relaciones).
Persistencia (Objetos que “existen de forma permanentemente”).
Soporta Transacciones.
19
El Estándar ODMG-93 (Release 1.1)
(El Modelo de Objetos)
Los objetos tienen identidad, que es una
forma de identificarlos de forma inequívoca y Objetos
a lo largo de TODO el ciclo de vida de los Atómicos
mismos. La identidad de un objeto no cambia,
y NO se vuelve a usar para otro objeto aun Objetos
cuando el original haya dejado de existir
Objetos
Estructurados
Objetos Identificables
Objetos
Los objetos tienen propiedades que pueden Atómicos
ser modificadas (Mutables), mientras que Literales
los literales no pueden ser modificados
(Inmutables). Los literales usualmente no
tienen identidad o tienen una identidad muy Objetos
simplificada
Estructurados
Los tipos atómicos no están compuestos de otros objetos, mientras
que los estructurados pueden estar compuestos de otros objetos 20
El Estándar ODMG-93 (Release 1.1)
(El Modelo de Objetos)
21
Tomado de “The Object Database Standar ODMG-93)
El Estándar ODMG-93 (Release 1.1)
Object Definition Language ODL (1)
ODL (Object Definition Language) es un lenguaje
usado para definir las interfaces de tipos de
objetos. Tiene las siguientes características:
Debe ser soportar todos la semántica del modelo de objetos de
la ODMG
No es un lenguaje de programación completo, sólo un lenguaje
de especificación de interfaces (y atributos)
Debe ser independiente de cualquier lenguaje de programación
(independiente de C/C++, Java u otro)
Debe ser compatible con IDL (Interface Definition Language)
Debe ser simple y práctico, brindar valor a los desarrolladores
22
de aplicaciones
Object Definition Language ODL (2)
(Un Ejemplo)
Cuidado
con la
1 (uno) Notación
N (muchos) (pre UML)
23
Tomado de “The Object Database Standar ODMG-93)
Object Definition Language ODL (3)
(Un Ejemplo)
24
Tomado de “The Object Database Standar ODMG-93)
Object Definition Language ODL (4)
(Un Ejemplo)
25
Tomado de “The Object Database Standar ODMG-93)
Object Definition Language ODL (5)
(Un Ejemplo)
26
Tomado de “The Object Database Standar ODMG-93)
Object Definition Language ODL (6)
(Un Ejemplo)
27
Tomado de “The Object Database Standar ODMG-93)
Object Definition Language ODL (7)
(Vínculos)
1-1 Sin relación:
a b
rb ra
1-1 Con relación
a b
rb ra
28
Adaptado de: “The Object Database Standar (ODMG-93)
Object Definition Language ODL (8)
(Vínculos)
1-N Sin relación:
a b4
sb ra
rb1
rb2
rb3
1-N Con relación
a b4
sb ra
rb1
rb2
rb3
rb4
29
Adaptado de: “The Object Database Standar (ODMG-93)
Object Definition Language ODL (9)
(Vínculos)
N-M Sin relación:
a3 b4
sb ra
rb1 ra1
rb2 ra2
rb3
N-M Con relación
a3 b4
sb ra
rb1 ra1
rb2 ra2
rb3 ra3
rb4
30
Adaptado de: “The Object Database Standar (ODMG-93)
OQL (1)
(Características)
OQL (Object Query Language) es un lenguaje de
consulta orientado a objetos simple y completo con
las siguientes características:
Es orientado a objetos
Declarativo / Abstracto
(no es completo desde el punto de vista computacional)
Su sintaxis es similar a SQL (que es uno de los lenguajes de
consulta más usados en la industria)
Acceso declarativo a objetos (propiedades y métodos)
Semántica formal bien definida
Basado en el modelo de objetos de la ODMG
No incluye operaciones de actualización (sólo de consulta)
31
OQL (2)
(Algunos Ejemplos)
select distinct x.edad from x in Personas where x.nombre=”Pedro”
select distinct struct(e : x.edad, s : x.sexo)
from x in Personas where x.nombre=”Pedro”
select distinct struct(nombre : x.nombre,
conjunto_subordinados : (select y
from y in x.subordinados
where y.salario >100000) La sintaxis es
from x in Empleados similar a SQL,
pero en
general,
select struct(e : x.edad, s : x.sexo)
from x in (select y completamente
from y in Empleados orientada a
where y.antiguedad = 10) objetos
where x.nombre=”Pedro”
Empleados
Empleados.subordinados 32
Otros Lenguajes de Consulta OO
(Criteria Query)
ODB odb = ODBFactory.open(ODB_NAME);
IQuery query = new CriteriaQuery( //
Player.class, Where.equal("name", "pedro"));
Objects<Player> players = odb.getObjects(query);
int i = 1;
while (players.hasNext()) {
System.out.println((i++) + "\t: " + players.next());
}
odb.close();
En un query de tipo criteria, la condición se construye encadenando una serie de
“átomos” generados por un conjunto de métodos predefinidos
33
Tomado del tutorial de NeoDatis (http://www.neodatis.org/)
Otros Lenguajes de Consulta OO
(Criteria Query)
ODB odb = ODBFactory.open(ODB_NAME);
IQuery query = new CriteriaQuery( //
Sport.class, Where.equal("name", "volley-ball"));
Sport volleyBall = (Sport) odb.getObjects(query).getFirst();
query = new CriteriaQuery( //
Player.class, Where.equal("favoriteSport", volleyBall));
Objects<Player> players = odb.getObjects(query);
int i = 1;
while (players.hasNext()) {
System.out.println((i++) + "\t: " + players.next());
}
odb.close();
34
Tomado del tutorial de NeoDatis (http://www.neodatis.org/)
Otros Lenguajes de Consulta OO
(Criteria Query)
ODB odb = ODBFactory.open(ODB_NAME);
IQuery query = new CriteriaQuery( //
Player.class, Where.or().add( //
Where.equal("favoriteSport.name", "volley-ball")).add( //
Where.like ("favoriteSport.name", "%nnis")));
Objects<Player> players = odb.getObjects(query);
int i = 1;
while (players.hasNext()) {
System.out.println((i++) + "\t: " + players.next());
}
odb.close();
35
Tomado del tutorial de NeoDatis (http://www.neodatis.org/)
Otros Lenguajes de Consulta OO
(Consultas Nativas)
ODB odb = ODBFactory.open(ODB_NAME);
IQuery query = new SimpleNativeQuery() {
public boolean match(Player player) {
// Se incluye el objeto si retorna true
return player.getFavoriteSport().getName(). //
toLowerCase().startsWith("volley");
}
};
Objects<Player> players = odb.getObjects(query);
int i = 1;
while (players.hasNext()) {
System.out.println((i++) + "\t: " + players.next());
}
odb.close();
36
Tomado del tutorial de NeoDatis (http://www.neodatis.org/)
ODL / OQL / OML
(Integración con un Lenguaje de
Programación)
Código C++
de la aplicación
Código Aplicación
(con OML)
(Encabezados Objeto Ejecutable
y Fuentes) +
ODBMS
Compilador Encadenador Runtime
C++ (Linker)
Código
Declaraciones
C++
en Preprocesador Generado
ODBMS
C++ ODL ODL Runtime
(Encabezados
o ODL
y Fuentes)
Metadata
Base de Datos
ODBMS
La idea es que el acceso al SGBDOO sea una “extensión” del lenguaje nativo en el
que se va a utilizar 37
Algunos SGBDOO
(Comerciales y Free Software)
Caché, ConceptBase, Db4o, eXtremeDB, eyeDB,
Facets (previously known as GemStone-J), FastDB
Main Memory DBMS, Gemstone Database Management
System, Generic Object Oriented Database System
(GOODS), GigaBASE Database Management System,
Haley Systems, JADE programming language, Jasmine
Object Database, JDOInstruments, JODB (Java Objects
Database), Magma Object Database, Matisse,
MyOODB, NeoDatis ODB, ObjectDB, Objectivity/DB,
Objectstore, Virtuoso Universal Server, Orient ODBMS,
Ozone Database Project, Perst, Statice, stSoftware
ODBMS, Versant Object Database, VOSS (Virtual
Object Storage System), Zope Object Database,
JOAFIP object persistence in file 38
Tomado de Wikipedia http://en.wikipedia.org/wiki/Comparison_of_object_database_management_systems
¿que alternativas
hay a los
SGBDOO?
39
Alternativas a los SGBDOO (1)
Persona
-cedula
-nombre
Aquí hay un
problema de
“acoplamiento” Profesor Departamento
o “impedancia” -sueldo 0..* -codigo
-dedicacion 1 -nombre
Transformación
Representación Automática o Manual, pero
Relacional completamente transparente
para la aplicación
Profesor
Base de Datos (cedula, sueldo, dedicación, codigoDpto)
Relacional
Persona Departamento
(cedula, nombre) (codigo, nombre)
40
Alternativas a los SGBDOO (3)
(Object-Relational Mapping / ORM)
Transformación
Automática
(Componente
de Persistencia) Hay un componente que en base a
la descripción de
correspondencia genera de
forma automática todos los SQL
La correspondencia (mapa) entre necesarios para consultar y
las relaciones y los objetos se actualizar la base de datos
describe utilizando:
El cliente utiliza / consulta /
XML actualiza los objetos persistentes
y el ORM se encarga de
XDoclet sincronizar el estado con la Base
Anotaciones (Dependiente del de Datos
Lenguaje) Desde el punto de vista del cliente
Otros es como si usara un SGBDOO
41
Alternativas a los SGBDOO (4)
(ORM Utilizando Hibernate)
Hibernate permite
configurar en un Actualmente,
archivo .properties además de XML
la base de datos a Hibernate permite
la que se desea usar Java
conectar. Nuevas Annotations para
versiones hacen definir la
esto en XML correspondencia
Objeto-Relacional
Vista general de Hibernate
42
Tomado del manual de Hibernate (http://www.hibernate.org/)
Alternativas a los SGBDOO (5)
(ORM Utilizando Hibernate)
Arquitectura “full cream” de Hibernate
43
Tomado del manual de Hibernate (http://www.hibernate.org/)
Alternativas a los SGBDOO (6)
(ORM Utilizando Hibernate)
Ver Ejemplos de Código
44
Alternativas a los SGBDOO (7)
(Data Access Objects / DAO)
Transformación
Manual
(Data Transfer Objects (DAO)
/ Otros) Adicionalmente, la interfaz DAO
implementa métodos para
consultas (Ej: findByXXX(...) /
listByXXX(...))
Se encapsulan las operaciones de Se implementa un TO (Transfer
acceso a la base de datos Object) que contiene la
implementando un objeto información a almacenar y sirve
especial (DAO) para interactuar con el DAO
La clase DAO implementa métodos Se implementa una clase Factory
para hacer CRUD (Create Read que retorna el DAO adecuado
Update Delete) básico. según el tipo de Base de Datos a
la que se desea acceder
45
Alternativas a los SGBDOO (8)
(Data Access Objects / DAO)
Este es el objeto
responsable de
realizar las
consultas y las
operaciones DML
Este es el objeto necesarias para
que contiene los mantener el estado
datos que vienen de la BD
de (o van a) la sincronizado con el
Base de Datos del objeto
46
Tomado de (http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html)
Alternativas a los SGBDOO (9)
(Data Access Objects / DAO)
Este es un caso concreto del patrón de la lámina anterior
(Para un objeto “Cliente” (Customer) y para “Cloudscape” como Base de Datos
(Data Source / Fuente de Datos)
47
Tomado de (http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html)
Alternativas a los SGBDOO (10)
(Data Access Objects / DAO)
Estas son
implementaciones
Esta clase sirve de concretas de la
fábrica para crear Fábrica
los DAOs dependiendo de la
requeridos según fuente de datos
el Modelo a seleccionada
persistir y la fuente
de datos específica
que se necesite
Esta es la interfaz Estas son
que define las implementaciones
operaciones que concretas del DAO
se pueden hacer dependiendo de la
sobre el DAO fábrica usada
cliente (Customer) seleccionada
48
Tomado de (http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html)
Alternativas a los SGBDOO (11)
(Data Access Objects / DAO)
Ver Ejemplos de Código
49
Alternativas a los SGBDOO (12)
(Algunos Productos ORM / DAO Software
Libre)
Lenguaje Nombre
C++ LiteSQL, Debea, dtemplatelib (Database Template Library)
Java Carbonado, Castor, Cayenne, Ebean, EclipseLink, Enterprise
Objects Framework, Hibernate, iBATIS, Java Data Objects (JDO),
JPOX (JDO2), Kodo, OpenJPA, TopLink (Oracle), Torque
.NET ADO.NET Entity Framework (Microsoft), Base One Foundation
Component Library, BCSEi ORM Code Generator, Business Logic
Toolkit for .NET, Castle ActiveRecord, DataObjects.Net v4.0,
DevForce, Developer Express, eXpress Persistent Objects (XPO),
EntitySpaces, Euss, Habanero, iBATIS, Invist, LLBLGen,
LightSpeed, Neo, NConstruct, NHibernate, Opf3, ObjectMapper
.NET, OpenAccess, TierDeveloper, Persistor.NET, Quick Objects,
Sooda, Subsonic
PHP Doctrine, Propel, EZPDO, DABL, Data Shuffler Data mapper
implementation (New BSD), Outlet Open source ORM, Coughphp
Open source ORM
Python Django, SQLAlchemy, SQLObject, Storm
Ruby ActiveRecord, Datamapper, iBATIS 50
Tomado de Wikipedia http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software
Gracias
¡Gracias!
51