Abstraction de base de données

Certains n'ont toujours pas compris l'intérêt de faire une abstraction de base de données. Non seulement cela rend l'ensemble du projet compatible avec plusieurs moteurs de base de données mais cela peut aussi simplifier la vie du développeur.

Voici un petit exemple pour en comprendre un petit peu mieux l'intérêt ...

Imaginons une table d'une base de données où on stockerait la configuration d'une application. Cette table pourrait avoir la structure suivante :


create table config (
   param varchar(255) not null default '',
   value text
   comment varchar(255) defautl null
)

Pour mettre à jour, une clé de configuration de cette table il faut vérifier si la clé existe ou non pour créer ou mettre à jour l'enregistrement dans la base. Avec MySQL, on peut résoudre ce problème en utilisant la commande REPLACE mais cette commande n'est pas dans le standard SQL. Donc si on veut que cette requête fonctionne avec des moteurs de base de données plus proche du standard, on est obligé de faire deux requête : une pour tester l'existence et une autre pour mettre à jour ou insérer. 

Plutôt que d'avoir un code comme le suivant :

$query = 'SELECT param,value FROM '.CONFIG_TABLE.' WHERE param =\''.$param.'\';';
$params = array_from_query($query, 'param');
if (count($params) == 0) {
   $query = 'INSERT INTO '.CONFIG_TABLE.' (param, value) VALUES(\''.$param.'\', \''.$value.'\');';
   pwg_query($query);
} else {
   $query = 'UPDATE '.CONFIG_TABLE.' SET value =\''.$value.'\' WHERE param =\''.$param.'\';';
   pwg_query($query);
}

En utilisant Doctrine (par exemple)l suffit d'écrire quelque chose comme :

$conf = new Conf();
$conf->param = $param;
$conf->value = $value;
$conf->save();

Haut de page