sábado, 26 de septiembre de 2009

db4o

DB4O es un novedoso motor de base de datos orientada a objetos. Sus siglas se corresponden con la expresión "DataBase 4 (for) Objects", que a su vez es el nombre de la compañía que lo desarrolla: db4objects, Inc.

DB4O es:

  • Nativa a Java y .NET

  • 100% orientada a objetos, sin mapeo objeto-relacional

  • Diseñada para uso embebido

  • De código abierto y libre bajo la GPL

Las claves innovadoras de este producto es su alto rendimiento (sobre todo en modo embebido) y el modelo de desarrollo que proporciona a las aplicaciones para su capa de acceso a datos, el cual propugna un abandono completo del paradigma relacional de las bases de datos tradicionales.

De este modo, tenemos las siguientes consecuencias directas resultantes de este nuevo paradigma:

  • Deja de existir un lenguaje SQL de consultas/modificaciones para pasar a crearse sistemas de consulta por métodos delegados y actualización/creación/borrado automático de entidades mediante código compilable.

  • Se elimina la necesidad de representar el modelo de datos de la aplicación en dos tipos de esquemas: modelo de objetos y modelo relacional. Ahora el esquema de datos del dominio viene representado por la implementación que se realice del diagrama de clases.

  • Se consigue evitar el problema del Object-Relational Impedance Mismatch sin sacrificar el rendimiento que los mapeadores objeto-relacionales sufren actualmente para llevar a cabo el mismo objetivo.

La mayor clave del éxito que está teniendo este motor de base de datos frente a otros competidores que han desarrollado tecnologías similares, es que se ha optado por un modelo de licenciamiento idéntico al utilizado por empresas como MySQL: licencia dual GPL/comercial. Es decir, si se quiere desarrollar software libre con esta librería, su uso no conlleva ningún coste por licencia; sin embargo si se desea aplicar a un software privativo, se aplica otro modelo de licenciamiento concreto.

Actualmente este producto funciona como una librería para dos tipos de plataformas de desarrollo: Java y.NET (tanto la implementación de Microsoft como la de Mono).

Dejo unos links que contienen todo lo que hay que saber de este producto:

http://javahispano.org/contenidos/es/db4o/;jsessionid=E73763B425065DA17545394C602338EA

http://www.programacion.com/java/articulo/jap_persis_db4o/

http://developer.db4o.com/forums/storage/15/33746/50-54%20code34%20Architecture.pdf

Y para todos los araganes que no quieren buscar o leer, dejo un ejemplito:

La clase Player

public class Player {         

protected String name;
protected int squadNumber;
protected float battingAverage;
protected Team team;

public Player(String name, int squadNumber, float battingAverage){
this.name = name;
this.squadNumber = squadNumber;
this.battingAverage = battingAverage;
}

//Geters and seters

public String toString() {
return name + ":" + battingAverage;
}
}

La clase Pitcher

public class Pitcher extends Player {

private int wins;

public Pitcher(String name, int squadNumber, float battingAverage, int wins) {
super(name,squadNumber,battingAverage);
this.wins = wins;
}

//Geter y seter para wins

public String toString() {
return name + ":" + battingAverage + ", " + wins;
}
}

La clase Team

import java.util.List;

import java.util.ArrayList;

public class Team {

private String name;
private String city;
private int won;
private int lost;
private List players;

public Team(String name, String city, int won, int lost){
this.name = name;
this.city = city;
this.won = won;
this.lost = lost;
this.players = new ArrayList();
}

public void addPlayer(Player p) {
players.add(p);
}

// Geters y seters

public String toString() {
return name;
}
}

Primero, creamos algunos datos de prueba con los que trabajar:

// Create Players

Player p1 = new Player("Barry Bonds", 25, 0.362f);
Player p2 = new Player("Marquis Grissom", 9, 0.279f);
Player p3 = new Player("Ray Durham", 5, 0.282f);
Player p4 = new Player("Adrian Beltre", 29, 0.334f);
Player p5 = new Player("Cesar Izturis", 3, 0.288f);
Player p6 = new Player("Shawn Green", 15, 0.266f);

// Create Pitchers

Player p7 = new Pitcher("Kirk Rueter",46, 0.131f, 9);
Player p8 = new Pitcher("Kazuhisa Ishii",17, 0.127f, 13);

// Create Teams

Team t1 = new Team("Giants", "San Francisco", 91, 71);
Team t2 = new Team("Dodgers", "Los Angeles", 93, 69);

// Add Players to Teams

t1.addPlayer(p1);
p1.setTeam(t1);
t1.addPlayer(p2);
p2.setTeam(t1);
t1.addPlayer(p3);
p3.setTeam(t1);
t2.addPlayer(p4);
p4.setTeam(t2);
t2.addPlayer(p5);
p5.setTeam(t2);
t2.addPlayer(p6);
p6.setTeam(t2);

// Add Pitchers to Teams

t1.addPlayer(p7);
p7.setTeam(t1);
t2.addPlayer(p8);
p8.setTeam(t2);

Un objeto Team se puede almacenar con una sóla línea de código:

db.set(t1);

db.set(t2);
db.commit();

Donde db es una referencia a un objeto ObjectContainer, que se haya creado abriendo un fichero de base de datos, de esta forma:

ObjectContainer db = Db4o.openFile(filename);

Una base de datos db4o es un único fichero con una extensión .yap, y se utiliza su método set para almacenar objetos.

Observe que está linea almacena el objeto Team y su colección de objetos Player. Se puede probar esto recuperando uno de esos objetos Player. La forma más simple de hacer esto es utilizando QBE.

Player examplePlayer = new Player("Barry Bonds",0,0f);

ObjectSet result=db.get(examplePlayer);
System.out.println(result.size());

while(result.hasNext()) {
System.out.println(result.next());
}