web-dev-qa-db-fra.com

Les bases de données relationnelles conviennent-elles mal à Node.js?

Récemment, j'ai joué un peu avec Node.js. Dans mon cas particulier, j'ai fini par utiliser MongoDB, en partie parce que cela avait du sens pour ce projet parce qu'il était très simple, et en partie parce que Mongoose semblait être un moyen extrêmement simple de commencer.

J'ai remarqué qu'il semble y avoir un certain degré d'antipathie envers les bases de données relationnelles lors de l'utilisation de Node.js. Ils semblent être mal pris en charge par rapport aux bases de données non relationnelles au sein de l'écosystème Node.js, mais je n'arrive pas à trouver une raison concise à cela.

Donc, ma question est, y a-t-il une raison technique solide pour laquelle les bases de données relationnelles sont plus adaptées pour travailler avec Node.js que des alternatives telles que MongoDB?

EDIT: Je veux juste clarifier certaines choses:

  • Je ne cherche spécifiquement pas de détails concernant une application spécifique que je construis
  • Je ne recherche pas non plus de raisons non techniques (par exemple, je ne suis pas à la recherche de réponses comme "Node et MongoDB sont tous deux nouveaux, donc les développeurs les utilisent ensemble")

Ce que je recherche, ce sont des raisons entièrement techniques, UNIQUEMENT. Par exemple, s'il y avait une raison technique pour laquelle les bases de données relationnelles fonctionnaient de manière inhabituellement médiocre lorsqu'elles étaient utilisées avec Node.js, alors ce serait le genre de chose que je recherche (notez que d'après les réponses jusqu'à présent, il ne semble pas que ce soit le cas). l'affaire)

57
Matthew Daly

Non, il n'y a pas de raison technique. Il s'agit principalement d'opinion et l'utilisation de NoSQL avec Node.js est actuellement un choix populaire.

Certes, l'écosystème de Node est largement piloté par la communauté . Tout au-delà de Node API principale nécessite la participation de la communauté. Et, certainement, les gens seront plus susceptibles de soutenir ce qui correspond à leurs préférences personnelles.

Mais, beaucoup utilisent et prennent toujours en charge les bases de données relationnelles avec Node.js. Certains projets notables incluent:

31
Jonathan Lonowski

J'adore Node.js, mais avec Node cela fait en fait plus de sens d'utiliser un RDBM, par opposition à une base de données non relationnelle. Avec une solution noSQL/non relationnelle, vous devez souvent effectuer des jointures manuelles dans votre code Node.js et parfois travailler avec un manque de transactions, une caractéristique technique des RDBM qui ont des fonctionnalités de validation/restauration. Voici quelques problèmes potentiels liés à l'utilisation de serveurs DB non relationnels + Node.js:

(a) les jointures sont plus lentes et les réponses sont plus lentes, car Node n'est pas C/C++

(b) les jointures coûteuses bloquent votre boucle d'événements, car la jointure se produit dans votre code Node.js et non sur un serveur de base de données

(c) l'écriture manuelle de jointures est souvent difficile et sujette aux erreurs; vos requêtes noSQL peuvent facilement être incorrectes ou votre code de jointure peut être incorrect ou sous-optimal; les jointures optimisées ont été effectuées auparavant par les maîtres des RDBM, et les jointures dans les RDBM se sont avérées correctes, mathématiquement dans la plupart des cas.

(d) Certaines bases de données non relationnelles, comme MongoDB, ne le faites pas prennent en charge les transactions - dans le cas de mon équipe, cela signifie que nous devons utiliser un verrou distribué externe afin que plusieurs requêtes puissent être regroupées dans une transaction atomique. Ce serait un peu plus facile si nous pouvions simplement utiliser des transactions et éviter les verrous au niveau de l'application.

avec un système de base de données relationnelle plus puissant qui peut effectuer des jointures optimisées en C/C++ sur le serveur de base de données plutôt que dans votre code Node.js, vous laissez votre serveur Node.js faire ce qu'il fait de mieux.

Cela étant dit, je pense qu'il est assez stupide que de nombreux fournisseurs noSQL majeurs ne prennent pas en charge les jointures (?) Une dénormalisation complète n'est qu'un rêve pour autant que je puisse le voir. Et le manque de transactions peut être un peu bizarre. Sans transactions, une seule requête est atomique, vous ne pouvez pas rendre plusieurs requêtes atomiques sans un mécanisme de verrouillage au niveau de l'application: /

À emporter:

Si vous voulez une persistance non relationnelle - pourquoi ne pas simplement dénormaliser une base de données relationnelle? Personne ne vous oblige à utiliser une base de données traditionnelle de manière relationnelle.

Si vous utilisez une base de données relationnelle avec Node.js, je recommande cet ORM: https://github.com/typeorm/typeorm

En passant, je préfère le terme "non relationnel" par opposition à "noSQL".

23
Alexander Mills

D'après mon expérience, le nœud a tendance à être populaire auprès des bases de données qui ont une API sans état, cela s'intègre très bien dans la nature asynchrone des nœuds. La plupart des bases de données relationnelles utilisent des connexions avec état pour les transactions, ce qui minimise les principaux avantages des E/S non-bloc asynchrones.

12
Alex Savenok

Pouvez-vous expliquer exactement quels problèmes spécifiques vous rencontrez avec la base de données que vous avez choisie et node.js?

Quelques raisons pour lesquelles MongoDB pourrait être plus populaire que les bases de données relationnelles:

  • MongoDB est essentiellement un magasin d'objets JSON, il se traduit donc très bien pour une application javascript. Les fonctions MongoDB sont des fonctions javascript.

  • Je ne fais que deviner ici, mais comme les bases de données NoSQL sont plus récentes et que des programmeurs plus enthousiastes l'expérimentent, vous êtes probablement plus impliqué dans ces modules NPM.

En dehors de cela, Node.js est techniquement un choix parfait pour tout type d'application de base de données. J'ai personnellement travaillé sur une petite application Node.js/MySQL et je n'ai rencontré aucun obstacle.

Mais revenons à mon point principal, nous pourrions en parler toute la journée, et ce n'est pas à cela que sert ce forum. Si vous avez des problèmes spécifiques avec n'importe quel code avec Node.js et la base de données de votre choix, veuillez plutôt poser ces questions.

Edit: Raisons strictement techniques, à part la compatibilité JSON des deux côtés: Il n'y en a pas.

10
Munim