Constat de départ

J'ai souvent fait remarqué que le CMS eZ publish (comme bien d'autres) stocke les fichiers dans l'arborescence au lieu de les stocker dans la base de données.

Lorsque je commençais à peine à utiliser ce logiciel, il m'est arrivé une fois de perdre tous mes fichiers car je n'avais pas pensé à sauvegarder le répertoire de stockage. Ce répertoire contenait d'ailleurs à la fois les fichiers originaux et les fichiers générés automatiquement ce qui implique finalement de devoir vider les caches avant chaque sauvegarde si l'on ne souhaite pas gaspiller de l'espace.

Explications possibles

A ce sujet j'ai eu l'avis de deux confrères:

Le premier m'a fait remarquer que je jouais à "l'apprenti sorcier". Car il me fallait au moins 2 serveurs dédiés, avec synchronisation et toute l'infrastructure qu'il faut.

Le deuxième soutenait que les fichiers n'avaient pas leur place dans une base de données car "un fichier est un fichier, il doit être géré comme tel". Cet avis est d'ailleurs le même que bon nombre de personnes si l'on cherche un peu sur les forums.

Ce que j'en pense

Ces deux confrères ont plus ou moins raison mais le problème est qu'à aucun moment l'un d'eux ne s'intéresse à l'intégrité des données. L'un se repose sur l'infrastructure tandis que l'autre se trouve une bonne excuse pour ne pas aller plus loin.

Le système de gestion de base de données est supposé garantir la cohérence de ces données! A quoi cela peut-il bien servir que l'on définisse des contraintes d'intégrité référentielle s'il suffit de modifier des fichiers dans un terminal pour introduire des erreurs?

Bien sûr, on pourra dire que si le système est bien conçu alors personne n'est supposé avoir le droit de modifier les fichiers directement sur le serveur. Tout comme une application n'est pas supposée introduire des erreurs référentielles dans une base de données, toujours est-il que cela peut arriver et que c'est pour éviter cela que l'on déclare des contraintes.

Conclusion

Si un fichier fait partie du contenu d'un site web, il doit être stocké en base de données et ce même si cela rend la base de données plus lourde. C'est le seul moyen de garantir l'intégrité des données. Dans le cas contraire il ne s'agirait que d'une base de "méta-données".

Mais ne me faites pas dire ce que je n'ai pas dit! On peut continuer de servir des fichiers sans pour autant faire appel à la base de données systématiquement, c'est ce qu'on appelle généralement : "un cache".