Bonjour,

Une petite question me titille depuis que j'ai commencé le développement web :
L'utilisation d'une seule table pour regrouper plusieurs contenus de type texte publics (articles, posts du forum, commentaires, news...) apporterait-elle plus de performance sur une base de donnée MySQL, PostGreSQL ou un système non relationnel (MongoDB...) ?
Je ne parle pas d'une table avec une trentaine de colonnes, ça j'ai vu que ça ralentissait énormément les requêtes, mais une table avec 3 ou 4 colonnes : id, type, auteur et contenu.

Çelà s'inscrit dans mon projet de réalisation d'un moteur de contenu (CMS) original et innovant.
Merci ;)

8 réponses


Bonjour,

Tu gagnerais en place dans ta base de données oui, mais tu te verrais pas mal limité sur le contenu et les options que tu voudrais apporter à tes articles/posts. Imaginons pour un blog, l'idéal serait d'avoir une colonne pour le status de l'article (en cours de rédactions, en attente de validation, publié, ou supprimé), dans un post de forum cette colonne n'a pas de sens. Et pour alléger les requêtes et avoir un code plus ou moins propre l'idéal reste quand même d'avoir une table dédié pour chaque chose.

Si tu es sur un serveur dédié, que tu peux installer un peu ce que tu veux, installe MongoDB ou Cassandra, un moteur de cache performant comme APC ou Memcache (mais je connais moins memcache je ne saurais te dire ce qu'il vaut en difficulté). MongoDB est exceptionnel niveau performance d'accès et décriture sur la DB vu qu'elle ne se base pas sur un moteur de base de données. Le NoSQL est vraiment impressionnant à voir.

Pour tes requêtes allège au maximum les colonnes que tu souhaites, ne demande que ce que tu as besoin, joue avec les liaisons au lieu de faire des chaînes de requêtes. Normalement avec déjà cette base là tu devrais avoir un site intéressant niveau performance.

Après l'idéal reste aussi d'utiliser un framework qui intègre ces outils et sait les gérer de lui même. Je ne sais pas pour CakePhp (très présent dans les tutoriaux de Grafikart) et MongoDB mais Codeigniter ou Symfony (voir Symfony 2 bien qu'il soit encore en RC il est utilisable aujourd'hui) le font très bien. Mais si tu débutes en Php je te conseille vraiment de te tourner vers Codeigniter qui est plus simple que Symfony (2) à aborder. Après si tu veux vraiment te casser la tête pour faire un truc bien et qui puisse tenir quelques années avec des fonctionnalités importantes tourne toi vers Symfony 2.

Mais faut se dire quand même qu'aujourd'hui en faisant un cMS, ce n'est pas les tout début des sites dynamiques avec juste 3 champs dans un formulaire. Faut rester assez complet dans les options présentes et la personnalisation possible pour l'utilisateur. Donc se baser sur une table unique ne t'apporterait malheureusement que des limitations que tu ne voudrais pas ou qui te bloqueraient en avancant dans ton projet.

Enfin ce n'est que mon avis bien entendu, quelqu'un ici aura peut être un avis contraire ;)

Djul
Auteur

Merci pour cette réponse.
Le truc c'est que je veux justement créer un système avec un champ de texte unique (regroupant articles, posts de forums, commentaires...) dans un sytème transparent pour l'utilisateur. Ç'est peut être un peu déroutant, mais je veux me séparer des systèmes standards de blogs/forums pour avoir vraiment un CMS original. J'aurais bien détaillé plus mon projet, mais j'ai peur de me faire piquer l'idée ;)

Bien vu pour le champ validé/en cours de validation, et pour les commentaires/posts je peux toujours le mettrs à une valeur validé par défaut. Bref il faut vraiment que je pense à tout !

Pour Symphony j'ai déjà essayé la version 1, je n'étais pas vraiment convaincu (usine à gaz, pas forcément pratique à configurer...) ainsi que Zend Framework auquel je reproche un peu la même chose. Je me met actuellement à Django , même si j'ai quelques problèmes de déploiement et de tests en local.
Mais je me rends compte que proposer un CMS Python est peut être un peu restrictif, tout le monde n'ayant pas un serveur supportant Python (le mien supporte MongoDB et CouchDB d'ailleurs), donc je regarde un peu du côté de CakePHP et CodeIgniter. Je ferais plus de détails sur les fonctionnalités que je recherche un peu plus tard.

Django j'avais testé un moment, c'est vrai que c'est assez classe (plus facile à installer que Php ou Ruby sur Linux en plus). La génération de l'admin est bluffante et te permet de gagner énormément de temps. Malheureusement ce qui m'a beaucoup rebuté, c'est qu'il faut obligatoirement passer par un serveur privé pour le faire fonctionner. Donc ce n'est pas réservé à tous les usages et encore moins à un CMS déstiné à un grand public. De même que pour MongoDB, je ne sais pas s'il existe un serveur mutualisé qui le prenne en compte.

Pour ce qui est des framework je me suis penché le plus sur CakePhp et Codeigniter jusqu'à présent. Codeigniter est beaucoup plus léger et réactif que CakePhp mais t'impose de coder plus de choses qui sont intégrées de base dans Cake. Symfony 1.4 pour peu que tu y passes un moment est vraiment pratique. Ne serais-ce que le DoctrineRoute qui te change la vie, ou le paramétrgae très poussé des routes. Et Doctrine est tout simplement magique pour le développement. Tu fais ton schéma de données en fichier Yml, et en 1 commande ca te réé les bases, les tables, les models, les relations. Pour peu que tu aies fais le fichier Yml de fixtures, en plus tu peux préremplir ta base avec cette même commande avec des données de test. Donc si tu modifies ta base à cause d'un oubli par exemple, juste avec la console tu recréé tout en 5sec et Doctrine va penser à tout pour toi dans les models et relations. En plus tu as un générateur d'admin, moins poussé que django certes, mais très pratique quand même.
Malheureusement j'ai pas approdonfi le sujet plus en détail à cause de la disponibilité de Symfony 2 et le fait qu'un projet Symfony 1.4 ne se porte pas sur la version 2. Mal pensé pour le coup. Faut tout réécrire. Je me suis tourné vers la nouvelle version, mais je dois avouer avoir un peu de mal à comprendre le fonctionnement de tout, vu qu'elle évolue encore très vite et que ça change pas mal (elle est encore en RC). et il n'y a pas énormément de tutoriels dispo, si ce n'est aucun véritablement à jour. Par contre pour ce qui est de la portrabilité de tes projets... Il n'y a rien de mieux, du peu que j'ai pu en voir. Le principe de Bundle est pas mal pensé. Tu peux ééutiliser ton blog codé pr un projet facilement dans un autre, ton système d'authentification, de forum, de gestion etc... Tout est portable très rapidement en quelques lignes. Et il est toujours basé sur Doctrine, mais cette fois-ci dans sa version 2.

Djul
Auteur

J'ai eu une expérience assez négative avec Symfony, du coup j'en garde un mauvais souvenir mais ce que tu me dis m'invite a retester. Sachant que pour l'instant je n'ai pas énormément de temps pour ce projet, je ne suis même pas sur de choisir un CMS, surtout si c'est trop compliqué ou que ça requiert un apprentissage trop long. Là en plus CakePHP a le "support technique" via les tutos de Grafikart, donc bonus pour ce framework.

Pour reparler MongoDB et autres technologies exotiques, je suis hébergé chez Alwaysdata qui en plus d'un service technique en or, propose énormément de langages et de SGBD : Python, Ruby, Perl, MongoDB, CouchDB... ainsi que des frameworks et CMS préinstallés à la demande. Très sympa, l'interface d'admin est intuitive. Seul point noir : le coût (9€/mois pour un serveur mutualisé). Mais même si pour l'instant je n'héberge qu'un blog Wordpress, je suis amplement satisfait. Et non, je n'ai pas d'actions chez eux...
En bref j'ai les technologies pour héberger mon projet de CMS, mais pour le distribuer il est peut être plus intéressant de le développer en PHP. Après est-ce que ça va intéresser des gens ...

Je vais peut être parler de mon projet finalement, mais dans une autre catégorie.

Ca a l'air sympa, mais 9€ ca fait cher le mutualisé quand pour pas beaucoup plus tu as du dédié :/ Enfin c'est toujours bon à savoir merci !

Djul
Auteur

Amen est très bon aussi à ce qu'on m'a dit, pour du mutualisé à 3€/mois avec Python. Mais bon le support ne doit pas rivaliser à mon avis ;)

salut Djul,
Je te jure que c'est une pure coïncidence mais je me posais la même question car moi aussi je suis en train de développer un pseudo cms et pour le moment je suis partie dans l'utilisation d'une table de contenus générique. Mon projet n'est pas encore assez avancé pour le diffuser mais le sera bientôt en open source, j'espère donc que tu y fera un tour le jour venu. Perso la mono-table pour le contenu a été un choix surtout pour le multilingue car je n'avais pas envie d'utiliser ce que proposait cakephp (ou le contenu est d'ailleurs tout stocker dans une table).

Djul
Auteur

Ah effectivement ça m'intéresse, tu as l'air plus avancé que moi vu que j'en suis encore à la phase de conception. Pour ma part je n'ai pas du tout pensé au multilingue mais en partant d'une idée de site qui fonctionne sur mon modèle (je pense que je vais détailler mon idée dans la section "Echange").
Je pensais aussi distribuer mon projet en Open-source, d'ailleurs c'est une des raisons pour laquelle je fais des recherches sur les frameworks PHP car j'étais parti au départ sur du Django.
Tu peux m'envoyer un mail via mon formulaire de contact pour plus d'infos ou me parler de ton projet.