47 votes

Alors... ce truc NoSQL

Je me suis penché sur MongoDB et je suis fasciné. Il semble (bien que je doive me méfier) qu'en échange de l'organisation de ma base de données d'une manière légèrement différente, j'obtienne gratuitement autant de performances que j'ai de CPU et de RAM ? Cela semble élégant et flexible, mais je n'échange pas cela contre de la rapidité comme je le fais avec Rails. Alors, où est le piège ? Que m'apporte une base de données relationnelle que je ne peux pas faire aussi bien ou pas du tout avec Mongo ? En d'autres termes, pourquoi (en dehors de l'immaturité des systèmes NoSQL existants et de la résistance au changement) l'ensemble du secteur n'abandonne-t-il pas MySQL ?

Si j'ai bien compris, à mesure que l'on passe à la vitesse supérieure, MySQL alimente Memcache. Maintenant, il semble que je puisse commencer avec quelque chose d'aussi performant dès le début.

Je sais que je ne peux pas faire de transactions à travers les relations... quand est-ce que ça serait un gros problème ?

Je lis http://teddziuba.com/2010/03/i-cant-wait-for-nosql-to-die.html mais si je comprends bien, son argument est essentiellement que les entreprises réelles qui utilisent de vrais outils n'ont pas besoin d'éviter SQL, donc les gens qui ressentent le besoin de s'en débarrasser le font mal. Mais aucune "entreprise" n'a à gérer autant d'utilisateurs simultanés que Facebook ou Google, donc je ne vois pas vraiment où il veut en venir. (Walmart compte 1,8 million d'employés ; Facebook compte 300 millions d'utilisateurs).

Je suis sincèrement curieux à ce sujet... Je promets que je ne suis pas un troll.

66voto

Rex M Points 80372

Je suis également un grand fan de MongoDB. Cela étant dit, il ne s'agit absolument pas d'un remplacement total des SGBDR. Facebook compte 300 millions d'utilisateurs, mais si certains de vos amis n'apparaissent pas dans la liste une fois, ou si l'un des albums photo manque lors d'une demande occasionnelle, le remarquerez-vous ? Probablement pas. Si la mise à jour de votre statut n'est pas transmise à tous vos amis pendant quelques minutes, est-ce important ? Pas vraiment. Si les bilans de Wal-Mart ne sont pas synchronisés, quelqu'un perdrait-il la tête ? Certainement.

Les bases de données NoSQL sont excellentes dans les environnements "flous" où les relations ne sont pas strictes et où l'intégrité des données peut se permettre d'être désynchronisée. Les SGBDR restent importants lorsque les ensembles de données sont extrêmement complexes et relationnels (d'où leur nom), et qu'ils doivent rester purs.

La grande poussée vers NoSQL vient du fait que pendant les 30 dernières années, nous avons utilisé des systèmes RDMBS pour les deux scénarios. Nous disposons désormais d'un outil plus approprié pour de nombreuses situations. Certains diraient la plupart, en fait. Mais personne ne dira que c'est le cas pour toutes.

14voto

Blessed Geek Points 6930

J'écris ceci mais comme une contestation de la réponse de Rex.

Je conteste l'idée que le nosql est sans relation et flou.

J'avais travaillé avec CODASYL il y a de nombreuses années avec C et Cobol - les relations entre entités sont très étroites dans CODASYL.

En revanche, les systèmes de bases de données relationnelles ont une politique très libérale à l'égard des relations. Tant que vous pouvez identifier une clé étrangère, vous pouvez former une relation adhoc.

Il est souvent considéré comme acquis que SQL est synonyme de SGBDR, mais des personnes ont écrit des pilotes SQL pour CODASYL, XML, des ensembles inversés, etc.

RDBMS/SQL ne sont pas synonymes de précision des données ou des relations. En fait, les SGBDR ont été une cause constante d'imprécision et de mauvaise perception des relations. Je ne vois pas comment les SGBDR offrent une meilleure intégrité des données et des relations que hadoop, par exemple. Mettez une couche de JDO - et nous pouvons construire un réseau de bonnes et propres relations entre les entités dans hadoop.

Cependant, j'aime travailler avec SQL parce qu'il me donne la possibilité de script des relations adhoc, même si je réalise que les relations adhoc sont une cause constante d'adultération des relations et de problèmes.

Ayant l'occasion de travailler avec l'analyse statistique des processus commerciaux et industriels, SQL m'a donné la possibilité d'explorer des relations là où aucune relation n'avait été perçue auparavant. L'opportunité de travailler avec l'analyse statistique m'a donné la possibilité d'explorer des relations que les programmeurs SQL n'auraient normalement pas perçues.

Par exemple, vous concevrez et normaliserez votre schéma pour refléter un ensemble de processus. Ce dont vous ne vous rendez peut-être pas compte, c'est que les relations évoluent avec le temps. Les caractéristiques statistiques révéleraient qu'un schéma n'est peut-être plus aussi "correctement normalisé" qu'il l'était auparavant. Que les principales composantes des processus ont muté au fil du temps. Mais les programmeurs non statisticiens ne comprennent pas cela et continuent de vanter les mérites des SGBDR comme étant la solution parfaite pour l'intégrité des données et la précision des relations.

Cependant, dans une base de données de liens relationnels, vous pourriez lier les entités dans les relations au fur et à mesure qu'elles apparaissent. Lorsque les relations mutent, les liens mutent naturellement avec les données. Les relations et leur mutation sont documentées dans le système de base de données sans qu'il soit nécessaire de renormaliser le schéma, ce qui est coûteux. À ce stade, le SGBDR n'est bon qu'en tant que base de données temporaire.

Mais vous pourriez alors rétorquer que le SGBDR vous permet également de modifier vos relations de manière flexible, puisque c'est ce que SQL fait le mieux. C'est vrai, très vrai - tant que vous effectuez BCNF ou même 4NF. Sinon, vous commencerez à voir que vos requêtes et vos chargeurs de données effectuent des opérations répliquées. Mais vos nombreuses années d'expérience dans le domaine des SGBDR vous ont certainement fait prendre conscience que BCNF est très coûteux et inefficace d'un point de vue opérationnel et que nous sommes constamment coupables de 2,5 NFer nos schémas.

Dire que les SGBDR et le SQL favorisent l'intégrité des données et des relations est une erreur grossière. Soit vous travaillez dans une entreprise si minuscule, soit vous n'êtes pas resté à votre poste pendant plus de deux ans - vous ne verriez pas la quantité de données ou la mutation des informations et les problèmes causés par les SGBDR. L'abus des SGBDR est à l'origine du fait que les cadres sont limités dans leur vision par les applications informatiques et à l'origine des échecs financiers des entreprises qui ne voient pas les changements dans le comportement du marché parce que leur vision est limitée par les programmeurs dont la vision est limitée à leur vénération de leurs chers schémas de SGBDR.

C'est pourquoi les programmeurs SQL ne comprennent pas pourquoi le statisticien de votre entreprise refuse d'utiliser votre application, que vous avez conçue méticuleusement, alors qu'il a employé un stagiaire universitaire pour écrire du SQL afin de télécharger des données sur ses serveurs personnels, et que les cadres de votre entreprise apprennent à faire confiance aux feuilles de calcul des comptables et des statisticiens plutôt qu'à vos élégantes applications à plusieurs niveaux, en raison de l'incapacité de vos applications à évoluer avec les processus.

Ce n'est peut-être pas possible, mais je vous invite tout de même à acquérir quelques connaissances statistiques pour percevoir comment les processus évoluent dans le temps, afin de pouvoir prendre la bonne décision technologique.

La raison pour laquelle les gens ne passent pas au SQL-less est l'absence d'un bon environnement de script comme SQL pour effectuer des analyses de relations adhoc. Ce n'est pas parce que la technologie SQL-less manque de précision ou d'intégrité. L'analyse des relations adhoc est très importante aujourd'hui en raison des attitudes et stratégies de développement rapide et agile des applications que nous connaissons aujourd'hui.

10voto

Gates VP Points 26481

Laissez-moi aborder les questions une par une :

Je sais que je ne peux pas faire de transactions à travers les relations... quand est-ce que ça serait un gros problème ?

Suppression en cascade d'images. Ou même simplement l'intégrité référentielle de base. Le concept de "clés étrangères" ne peut pas vraiment être appliqué aux "collections" (le terme Mongo pour les tables). Vous ne pouvez effectuer des écritures atomiques que sur un seul "document" (alias enregistrement). Ainsi, si vous avez un problème de base de données, vous pouvez rendre les données orphelines dans la base de données.

J'obtiens gratuitement autant de performances que j'ai de CPU et de RAM ?

Ce n'est pas gratuit, mais les compromis à faire sont différents. Par exemple, Mongo est excellent pour exécuter des recherches de type clé/valeur dans un seul enregistrement. Cependant, Mongo est médiocre pour l'exécution de requêtes relationnelles. Vous devrez utiliser map-reduce pour beaucoup d'entre elles. Mongo est un "fou de RAM". En fait, Mongo exige une capacité de 64 bits pour tout ensemble de données significatif. Mongo consomme beaucoup d'espace sur le disque dur, chargez une base de données de 140 Go et vous pouvez finir par utiliser plus de 200 Go, car le fichier d'échange augmente pendant l'utilisation.

Et vous allez toujours vouloir un disque rapide.

En fait, je pense que l'on peut dire que MongoDB est vraiment un système de base de données qui s'adapte au matériel de pointe (64 bits, beaucoup de RAM, SSD). Je veux dire que toute la base de données est centrée sur la recherche de données d'index dans la RAM (bonjour le 64 bits), puis sur des recherches aléatoires ciblées sur le disque (bonjour le SSD).

pourquoi ... l'ensemble de l'industrie n'abandonne-t-elle pas MySQL ?

  1. C'est non conforme à la norme ACID . Probablement assez mauvais pour le système bancaire (bien sûr, la plupart d'entre eux traitent encore des fichiers plats, mais c'est un autre problème). Cependant, notez que vous pouvez forcer des écritures "sûres" avec Mongo et garantir que les données arrivent sur le disque, mais seulement un "document" à la fois.
  2. C'est encore très jeune . De nombreuses grandes entreprises utilisent encore d'anciennes versions de Crystal Reports sur leur application SQL Server 2000 écrite en VB6. Ou bien elles construisent des bus de services d'entreprise pour gérer les environnements hétérogènes qu'elles ont créés au fil des ans.
  3. C'est un paradigme très différent . Peut-être que 30% des questions que je vois régulièrement sur les listes de diffusion Mongo (et ici) sont fondamentalement liées à "comment faire la requête X ?" o "comment dois-je structurer ces données ?" . L'utilisation de MongoDB nécessite généralement que vous dénormalisiez à l'avance. Ce n'est pas seulement un peu difficile, c'est un manque de formation. La plupart des gens n'apprennent la "normalisation" qu'à l'école, personne ne nous enseigne comment dénormaliser pour améliorer les performances.
  4. C'est pas le bon outil pour tout . Honnêtement, je pense que MongoDB est un excellent outil pour lire et écrire des données transactionnelles. Ce simple CRUD "un par un" qui constitue la majeure partie des applications modernes. Cependant, MongoDB n'est pas vraiment génial pour la création de rapports. En fait, j'envisage honnêtement que la prochaine étape ne soit pas "Mongo pour tout" c'est "Mongo pour le transactionnel" y "MySQL pour les rapports" . Lorsque vos données sont suffisamment volumineuses pour que vous abandonniez le "reporting en temps réel", l'utilisation de Map-Reduce pour alimenter une base de données de reporting ne semble pas si mauvaise.

Si j'ai bien compris, à mesure que l'on passe à la vitesse supérieure, MySQL alimente Memcache. Maintenant, il semble que je puisse commencer avec quelque chose d'aussi performant dès le début.

Honnêtement, je travaille dans ce sens sur certains de mes projets. Encore une fois, je pense que MongoDB fait une couche de mise en cache valide. En fait, il fait une couche de mise en cache adossée à des fichiers. Ainsi, si vous êtes capable de pousser les changements MySQL vers Mongo, vous obtenez Memcached sans perte de cache. Il est également facile de "réchauffer le cache" sur un nouveau serveur, il suffit de copier les fichiers et de démarrer Mongo en pointant sur le bon dossier, c'est vraiment aussi simple que cela.

7voto

Logan Capaldo Points 22145

À votre avis, à quelle fréquence Facebook effectue-t-il des requêtes arbitraires sur son ou ses serveurs de données ? Tout n'est pas une application web et, inversement, tous les ensembles de données n'ont pas besoin d'être analysés en profondeur.

À mon avis, NoSQL est en grande partie une réponse réaction à ce qui se résume à l'utilisation de SGBDR pour des tâches pour lesquelles ils ne sont pas bien adaptés, parce que les gens n'ont pas pris de décision active en fonction de leurs besoins et ont choisi une solution par défaut. Abandonner MySQL (ou les SGBDR en général) à l'échelle du secteur reviendrait à refaire la même erreur et le pendule finirait par revenir dans l'autre sens.

Si MongoDB convient à votre cas d'utilisation, allez-y. Mais ne partez pas du principe que votre cas d'utilisation est le même pour tous les cas d'utilisation. Il n'existe pas de technologie adaptée à tous les scénarios. L'invention des jets supersoniques n'a pas éliminé l'utilisation des trains de marchandises.

2voto

Kalium Points 2895

Le grand retour de bâton contre NoSQL est enraciné dans la mentalité de nombreux défenseurs de NoSQL. Plus précisément, l'attitude qui se résume le mieux à "SQL est trop difficile, je ne devrais pas avoir à le faire". Je n'aime pas NoSQL parce qu'il semble dans de nombreux cas élever l'ignorance.

Je sais que je ne peux pas faire de transactions à travers les relations... quand est-ce que ça serait un gros problème ?

Plus souvent qu'on ne le pense. Il y a beaucoup de choses qui peuvent mal tourner lorsque vous ne pouvez pas supposer un ensemble de données cohérent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X