samedi 22 août 2009

NeoDatis : une base de données orientée objet pour Java

Dans la plupart des applications de gestion écrites en Java, on utilise pour persister les données une base de données relationnelle, conçue pour recevoir des requêtes au format SQL.
On utilise ensuite des outils comme JPA ou Hibernate pour réaliser un mapping objet/relationnel, permettant de décrire la correspondance entre le modèle objet de l'application et les tables de la base de données, afin de pouvoir manipuler les données de la base dans des objets Java.

Il existe cependant une alternative : utiliser une base de données objet, permettant de stocker directement les objets sans les convertir en lignes à insérer dans des tables et sans SQL.
Ainsi, il n'est plus nécessaire de réaliser un mapping objet/relationnel, le modèle objet et les liens entre les différentes classes suffisent à décrire la façon dont seront stockées les données.

La base de données NeoDatis

Voyons maintenant un exemple d'utilisation d'une base de données objet avec NeoDatis :

1) insertion de données

On suppose qu'on a une classe Film qui contient un nom et un genre de film :


Film rambo = new Film("rambo", "action");

ODB odb = null;

try {
// Open the database
odb = ODBFactory.open("mabase");

// Store the object
odb.store(rambo);
} finally {
if (odb != null) {
// Close the database
odb.close();
}
}


Ce bout de code permet de persister simplement un objet.
On suppose maintenant qu'on a une classe Profil qui contient le nom d'une personne ainsi que la liste de ses films préférés


Film rambo = new Film("Rambo", "action");
Film laCiteDeLaPeur = new Film("La cité de la peur", "comédie");
List<Film> mesFilms = new ArrayList<Film>();
mesFilms.add(laCiteDeLaPeur);

Profil monProfil = new Profile("loic", mesFilms);

ODB odb = null;

try {
// Open the database
odb = ODBFactory.open("mabase");

// Store the object
odb.store(monProfil);
} finally {
if (odb != null) {
// Close the database
odb.close();
}
}


En persistant l'objet 'monProfil' on persiste également toute la grappe d'objets qui lui est associé.

2) récupération des données

Ce bout de code permet de récupérer l'ensemble des objets de type Film :


ODB odb = null;

try {
// Open the database
odb = ODBFactory.open("mabase");
Objects<Film> films = odb.getObjects(Film.class);
}
} finally {
if (odb != null) {
// Close the database
odb.close();
}
}
}


Et celui ci permet de récupérer la liste des films du genre "action", en créant une requête à l'aide de la classe CriteriaQuery :


ODB odb = null;

try {
// Open the database
odb = ODBFactory.open("mabase");
IQuery query = new CriteriaQuery(Film.class, Where.equal("genre", "action"));
Objects<Film> films = odb.getObjects(query);
}
} finally {
if (odb != null) {
// Close the database
odb.close();
}
}
}


Voyons maintenant comment récupérer des objets à partir des objets qu'ils référencent :
On ajoute une données à la classe Film, le réalisateur, qui contient un nom et une nationalité.

Realisateur yates = new Realisateur("David Yates", "UK");
Film harryPotter = new Film("Harry Potter", "Fantastique", yates);

ODB odb = null;

try {
// Open the database
odb = ODBFactory.open("mabase");
odb.store(harryPotter);
IQuery query = new CriteriaQuery(Film.class, Where.equal("realisateur.nom", "David Yates"));
Objects<Film> films = odb.getObjects(query);

} finally {
if (odb != null) {
// Close the database
odb.close();
}
}



On a ainsi pu récupérer une liste de films en fonction d'un nom de réalisateur.

3) visualisation des données

NeoDatis fournit également un outil très pratique de visualisation des données.
Vous pourrez ainsi observer les objets persistés dans la base et la valeur des différents champs : très pratique!





NB: ce screenshot provient du site de NeoDatis, j'espere qu'ils ne m'en voudront pas d'avoir fait un lien vers cette image.

Si ces quelques exemples vous ont donné envie d'aller plus loin avec NeoDatis, je vous conseille de lire la documentation officielle qui est très abordable.

Base de données objet ou relationnelle?

Comment choisir entre une base de données relationnelle ou orientée objet?

Une des questions à se poser est "est ce qu'un système externe viendra analyser ou modifier les données de mon application?".
Si la réponse est oui, on préfèrera garder un bon vieux SGBD relationnel. Imaginez que vous vouliez par exemple brancher un outil d'analyse de données (par exemple Business Objects) sur votre base de données, vous aurez beaucoup plus de facilité à le faire avec une base de données traditionnelle comme MySQL ou Oracle, qui savent facilement dialoguer avec des programmes externes via leurs connecteurs JDBC ou ODBC.

Si la réponse est non, il sera beaucoup plus simple d'utiliser une base de données objet, le mapping objet/relationnel étant souvent couteux dès que le modèle de données devient un peu complexe.

Ensuite viennent les problèmes de performance lors de la montée en charge, de sécurité ... , pour lesquels on aura tendance à faire plus confiance aux bases de données ayant fait leur preuve, comme Oracle ...

Reste que NeoDatis est un très bel outil avec le quel il est très agréable de travailler et que je n'hésiterai pas à utiliser pour des projets de petite ou moyenne envergure!

Dans le prochain billet nous verrons comment travailler avec une base de données relationnel et avec JPA 2 (qui fait partie de la norme Java EE 6) pour la partie mapping.