Quand utiliser MongoDB ou d’autres systèmes de firebase database orientés document?

Nous proposons une plate-forme pour les clips vidéo et audio, les photos et les images vectorielles. Nous avons commencé avec MySQL comme firebase database et avons récemment inclus MongoDB pour stocker toutes les méta-informations des fichiers, car MongoDB répondait mieux aux exigences. Par exemple: les photos peuvent avoir des informations Exif , les vidéos peuvent avoir des pistes audio sur lesquelles vous souhaitez stocker les méta-informations. Les vidéos et les graphiques vectoriels ne partagent aucune méta-information commune, etc. Je sais donc que MongoDB est parfait pour stocker ces données non structurées et les rendre consultables.

Cependant, nous continuons à développer notre plateforme et à append des fonctionnalités. L’une des prochaines étapes consistera à fournir un forum à nos utilisateurs. La question qui se pose maintenant est la suivante: utiliser la firebase database MySQL, ce qui serait un bon choix pour stocker des forums et des messages sur les forums, ou utiliser MongoDB pour cela aussi?

La question est donc de savoir quand utiliser MongoDB et quand utiliser un SGBDR. Que prendriez-vous, mongoDB ou MySQL, si vous aviez le choix et pourquoi le prendriez-vous?

Dans NoSQL: Si seulement c’était aussi facile , l’auteur écrit à propos de MongoDB:

MongoDB n’est pas un magasin clé / valeur, c’est un peu plus. Ce n’est certainement pas un SGBDR non plus. Je n’ai pas utilisé MongoDB en production, mais je l’ai utilisé un peu comme une application de test et c’est un kit très cool. Il semble très performant et a, ou aura bientôt, une tolérance aux fautes et un auto-sharding (alias ça va évoluer). Je pense que Mongo pourrait être la chose la plus proche d’un remplacement de SGBDR que j’ai vu jusqu’à présent. Cela ne fonctionnera pas pour tous les ensembles de données et tous les modèles d’access, mais il est conçu pour vos éléments CRUD classiques. Stocker ce qui est essentiellement un hachage énorme, et pouvoir sélectionner l’une de ces clés, est ce pour quoi la plupart des gens utilisent une firebase database relationnelle. Si votre firebase database est 3NF et que vous ne faites pas de jointures (vous ne faites que sélectionner un groupe de tables et mettre tous les objects ensemble, alias ce que la plupart des gens font dans une application web), MongoDB vous assénera probablement.

Ensuite, dans la conclusion:

La vraie chose à souligner est que si vous êtes empêché de faire quelque chose de super génial parce que vous ne pouvez pas choisir une firebase database, vous le faites mal. Si vous connaissez mysql, utilisez-le simplement. Optimisez quand vous en avez réellement besoin. Utilisez-le comme ak / v store, utilisez-le comme un rdbms, mais pour l’amour de Dieu, construisez votre application géniale! Rien de tout cela n’a d’importance pour la plupart des applications. Facebook utilise toujours beaucoup MySQL. Wikipedia utilise beaucoup MySQL. FriendFeed utilise beaucoup MySQL. NoSQL est un excellent outil, mais ce ne sera certainement pas votre avantage concurrentiel, votre application ne sera pas à la mode et, par-dessus tout, vos utilisateurs ne se soucieront pas de cela.

Comment vais-je construire ma prochaine application? Probablement Postgres. Vais-je utiliser NoSQL? Peut être. Je pourrais aussi utiliser Hadoop et Hive. Je peux tout garder dans des fichiers plats. Peut-être que je vais commencer à pirater Maglev. Je vais utiliser ce qui est le mieux pour le travail. Si j’ai besoin de rapports, je n’utiliserai aucun NoSQL. Si j’ai besoin de la mise en cache, j’utiliserai probablement Tokyo Tyrant. Si j’ai besoin d’ACIDity, je n’utiliserai pas NoSQL. Si j’ai besoin d’une tonne de jetons, je vais utiliser Redis. Si j’ai besoin de transactions, je vais utiliser Postgres. Si j’ai une tonne d’un seul type de documents, je vais probablement utiliser Mongo. Si je dois écrire 1 milliard d’objects par jour, j’utiliserais probablement Voldemort. Si j’ai besoin d’une recherche en texte intégral, j’utiliserais probablement Solr. Si j’ai besoin d’une recherche en texte intégral des données volatiles, j’utiliserais probablement Sphinx.

J’aime cet article, je le trouve très instructif, il donne un bon aperçu du paysage et du battage médiatique de NoSQL. Mais, et c’est la partie la plus importante, il est très utile de se poser les bonnes questions quand il s’agit de choisir entre SGBDR et NoSQL. Vaut le lire à mon humble avis.

Lien alternatif à l’article

Après deux ans d’utilisation de MongoDb pour une application sociale, j’ai été témoin de ce que cela signifie vraiment de vivre sans un SGBDR SQL.

  1. Vous finissez par écrire des travaux pour faire des choses comme joindre des données provenant de différentes tables / collections, ce que le SGBDR ferait automatiquement pour vous.
  2. Vos capacités d’interrogation avec NoSQL sont considérablement réduites. MongoDb est peut-être la chose la plus proche de SQL mais elle est toujours très loin derrière. Croyez-moi. Les requêtes SQL sont super intuitives, flexibles et puissantes. Les requêtes MongoDb ne le sont pas.
  3. Les requêtes MongoDb peuvent extraire des données d’une seule collection et tirer parti d’un seul index. Et MongoDb est probablement l’une des bases de données NoSQL les plus flexibles. Dans de nombreux scénarios, cela signifie plus d’allers-retours vers le serveur pour rechercher des enregistrements associés. Et puis, vous commencez à dé-normaliser les données, ce qui signifie des tâches en arrière-plan.
  4. Le fait qu’il ne s’agisse pas d’une firebase database relationnelle signifie que vous n’aurez pas (ou que certains pensent que les bases de données fonctionnent mal) des contraintes de clé étrangère pour garantir la cohérence de vos données. Je vous assure que cela finira par créer des incohérences de données dans votre firebase database. Soyez prêt. Vous commencerez probablement à écrire des processus ou des vérifications pour garder votre firebase database cohérente, ce qui ne fonctionnera probablement pas mieux que de laisser le SGBDR le faire pour vous.
  5. Oubliez les frameworks matures comme la mise en veille prolongée.

Je pense que 98% de tous les projets sont probablement bien meilleurs avec un SGBDR SQL typique qu’avec NoSQL.

stocker ces données non structurées

Comme vous l’avez dit, MongoDB est le mieux adapté pour stocker des données non structurées. Et cela peut organiser vos données au format de document. Ces altenants RDBMS appelés magasins de données NoSQL ( MongoDB , CouchDB , Voldemort ) sont très utiles pour les applications qui évoluent massivement et nécessitent un access plus rapide aux données à partir de ces magasins de données volumineuses.

Et la mise en œuvre de ces bases de données est plus simple que le SGBDR ordinaire. Comme ce sont des objects binarys de type clé ou document de type simple directement sérialisés en disque. Ces magasins de données n’appliquent pas les propriétés ACID et les schémas . Cela ne fournit aucune capacité de transaction . Cela peut donc être important et nous pouvons obtenir un access plus rapide (à la fois en lecture et en écriture).

En revanche, RDBM applique l’ACID et les schémas sur les données. Si vous souhaitez travailler avec des données structurées, vous pouvez aller de l’avant avec RDBM.

Je choisirais MySQL pour créer des forums pour ce genre de choses. Parce que ça ne va pas grossir. Et c’est une application très simple (commune) qui a structuré les relations entre les données.

Notez que Mongo stocke essentiellement JSON. Si votre application traite de nombreux objects JS (avec imbrication) et que vous souhaitez conserver ces objects, il existe un argument très fort pour utiliser Mongo. Il rend vos couches DAL et MVC ultra minces, car elles ne décompressent pas toutes les propriétés des objects JS et essaient de les ajuster dans une structure (schéma) dans laquelle elles ne s’intègrent pas naturellement.

Nous avons un système qui a plusieurs objects JS complexes en son cœur, et nous adorons Mongo parce que nous pouvons vraiment tout conserver, vraiment facilement. Nos objects sont aussi plutôt amorphes et non structurés, et Mongo absorbe cette complication sans cligner des yeux. Nous avons une couche de rapport personnalisée qui déchiffre les données amorphes pour la consommation humaine, et ce n’est pas si difficile à développer.

Je dirais utiliser un SGBDR si vous avez besoin de transactions complexes. Sinon, j’irais avec MongoDB – plus flexible pour travailler et vous savez qu’il peut évoluer lorsque vous en avez besoin. (Je suis partial cependant – je travaille sur le projet MongoDB)

Qui a besoin de forums dissortingbués et fragmentés? Peut-être que Facebook, mais à moins de créer un concurrent sur Facebook, utilisez simplement Mysql, Postgres ou tout ce qui vous convient le mieux. Si vous voulez essayer MongoDB, d’accord, mais ne vous attendez pas à faire de la magie pour vous. Il aura ses bizarreries et sa méchanceté générale, comme tout le rest, comme vous l’avez sans doute déjà découvert si vous y travailliez déjà.

Bien sûr, MongoDB peut sembler facile et facile, mais vous rencontrerez des problèmes que des produits plus matures ont déjà surmontés. Ne soyez pas attiré si facilement, mais attendez plutôt que “nosql” mûrit ou meure.

Personnellement, je pense que “nosql” va dépérir et mourir de la fragmentation, car il n’y a pas de normes établies (presque par définition). Je ne parierai donc pas personnellement pour des projets à long terme.

La seule chose qui puisse sauver “nosql” dans mon livre, est de savoir si elle peut s’intégrer de manière transparente dans Ruby ou des langages similaires, et rendre le langage “persistant”, presque sans aucune surcharge dans le codage et la conception. Cela peut arriver, mais je vais attendre jusque-là, pas maintenant, et bien sûr, il doit être plus mature.

Au fait, pourquoi créez-vous un forum à partir de zéro? Il y a des tonnes de forums open source qui peuvent être modifiés pour répondre à la plupart des besoins, à moins que vous ne créiez vraiment la nouvelle génération de forums (ce dont je doute).

Après avoir assisté à Devoxx 2011 et assisté à une présentation de 10Gen, j’ai écrit un petit blog comparant MongoDB à des bases de données SGBDR. MongoDB est l’un des populaires Nosql dbs. S’il vous plaît voir ci-dessous:

http://blog.iprofs.nl/2011/11/25/is-mongodb-a-good-alternative-to-rdbms-databases-like-oracle-and-mysql/

J’ai vu beaucoup d’entresockets utiliser MongoDB pour des parsings en temps réel à partir de journaux d’applications. Son absence de schéma correspond vraiment aux journaux d’application, où le schéma d’enregistrement a tendance à changer de temps en temps. De plus, sa fonctionnalité Capped Collection est utile car elle supprime automatiquement les anciennes données pour que les données restnt dans la mémoire.

Je pense que MongoDB convient parfaitement à ce domaine, mais MySQL / PostgreSQL est plus recommandé en général. Il existe de nombreuses documentations et ressources de développement sur le Web, ainsi que leurs fonctionnalités et leur robustesse.

Les deux principales raisons pour lesquelles vous pourriez vouloir préférer Mongo sont

  • Flexibilité dans la conception de schéma (magasin de documents de type JSON).
  • Évolutivité – Ajoutez simplement des nœuds et cela peut très bien évoluer horizontalement.

Il convient aux applications Big Data. Le SGBDR n’est pas adapté aux données volumineuses.

Vous savez, tout ce qui concerne les jointures et les «transactions complexes» – mais c’était Monty lui-même qui, il y a de nombreuses années, expliquait le «besoin» de COMMIT / ROLLBACK en disant que «tout ce qui se fait dans les classes logiques (et non la firebase database) de toute façon »- alors c’est la même chose encore une fois. Ce qu’il faut, c’est un moteur de stockage / récupération de données stupide, mais incroyablement bien rangé et rapide, pour 99% de ce que font les applications Web.

Comme dit précédemment, vous pouvez choisir parmi beaucoup de choix, jetez un coup d’œil à tous ces choix: http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis

Ce que je suggère, c’est de trouver votre meilleure combinaison: MySQL + Memcache est vraiment génial si vous avez besoin d’ACID et que vous souhaitez rejoindre certaines tables MongoDB + Redis est parfait pour le magasin de documents Neo4J est parfait pour la firebase database de graphes

Ce que je fais: je commence avec MySQl + Memcache parce que je suis habitué à utiliser, alors je commence à utiliser d’autres framework de firebase database. Dans un seul projet, vous pouvez combiner MySQL et MongoDB par exemple!