SQL Server et Mongo peuvent-ils être utilisés ensemble?

14

Nous avons un grand site axé sur les nouvelles qui a un trafic Web élevé. L'architecture est votre DB souvent vue - Repo Layer - Services Layer - Asp.Net MVC. Le problème que nous avons vu concerne les performances de lecture. Il s'avère que toutes ces choses d'objets de domaine DDD sont idéales, en théorie, pour les règles métier, mais ont rendu la vie plus difficile lorsqu'il s'agit d'optimiser les performances de lecture.

Comme solution, j'envisage quelque chose de complètement nouveau (pour nous): utiliser noSQL. J'aimerais utiliser une base de données noSQL pour les données présentées sur notre site Web. Nous ne pouvons pas nous débarrasser de notre SQL Server (du moins pas de sitôt), mais il me semble qu'une étape pratique serait d'utiliser Mongo comme base de données de requêtes pour tout nouveau développement.

Ma question est de savoir s'il est possible d'utiliser SQL Server comme base de données d'enregistrement et Mongo comme base de données de requête ensemble ?

Ainsi, lorsque l'un de nos éditeurs met à jour un enregistrement, les données sont stockées dans SQL Server. Cela est nécessaire, car il y a trop de code hérité qui ne peut pas être réécrit du jour au lendemain.

Mais lorsqu'un internaute sur le site Web consulte un article ou une liste d'articles, j'aimerais profiter des performances de Mongo par rapport à SQL Server. Afin de garder les données quelque peu à jour, disons 15 minutes ou moins, les données SQL Server devraient actualiser Mongo. RDBMS a des outils de réplication pour des opérations comme celle-ci et je me demande s'il existe quelque chose pour faire la même chose de SQL Server à Mongo. Serveur Lync, peut-être?

John
la source
3
Possible? Bien sûr, il est possible, comme deux magasins de données distincts. Que demandez-vous exactement ici?
Oded
Mais pouvez-vous les utiliser ensemble? Avec la base de données Mongo agissant essentiellement comme un cache en lecture seule pour les données?
John
1
Encore une fois, bien sûr, vous pouvez "les utiliser ensemble". Mais ce n'est pas clair ce que cela signifie. Tant que vous avez une sorte de mécanisme de mise à jour pour mongo, vous êtes prêt à partir. Voir les articles d' Udi Dahan - mais c'est à vous de définir le mécanisme.
Oded
1
Nous n'avons jamais déménagé à MongoDB, mais il semble que l'année prochaine nous le pourrons. Une façon transitoire que nous avons fait est de stocker JSON dans les champs varchar. D'après tout ce que j'ai lu, il n'y a pas de bon moyen de déplacer les données entre NoSQL et SQL - tout cela devra être personnalisé, d'autant plus que les bases de données NoSQL qui existent là-bas varient considérablement dans la façon dont elles font les choses. .
John
1
@John si vous cherchez à vous en tenir au relationnel et à vous éloigner de SQL Server, vous voudrez peut-être regarder Postgresql et son intégration json . Ainsi, le stockage des données dans une colonne json qui peut ensuite être manipulée dans la base de données.

Réponses:

13

Vous avez rencontré un problème que beaucoup ont devant vous ... une base de données optimisée pour la lecture est rarement bonne pour l'efficacité d'écriture et vice versa. Une approche qui a évolué à partir de cet obstacle en lecture-écriture est CQRS (Command Query Responsibility Segregation). Malgré Wikipédia reliant les deux CQRS et CQS sont techniquement différents. CQS exige simplement qu'une méthode effectue une modification (commande) ou demande des informations (requête) jamais les deux.

CQRS va plus loin et spécifie que vous disposez d'un modèle distinct pour les requêtes et les commandes. Cette étape unique permet de séparer votre base de données de lecture et d'écriture. C'est ce que tu veux faire.

Je ne peux pas dire que je suis un expert de Mongo ou que je l'ai configuré pour fonctionner avec SQL Server. Mais d'après ma compréhension, les gens utilisent Mongo comme une vue dénormalisée de leur base de données transactionnelle. La mise à jour de Mongo à partir de la base de données transactionnelle peut se résumer à l'exécution d'un agent SQL. Ou avoir un service distinct pour interroger la base de données.

Une alternative encore meilleure serait que votre service de commandement déclenche un événement chaque fois qu'une mise à jour est effectuée. Vous auriez alors un service qui aurait écouté cet événement et mis à jour le MongoDB avec ces informations. C'est l'approche fondamentale du Event Sourcing (recherchez Event Sourcing sur la page).

Greg Young, l'un des leaders d'opinion dans le monde DDD, écrit actuellement un livre de la série Fowler Signature sur CQRS intitulé Event-Centric (il s'appelait auparavant CQRS). Fowler a écrit un post sur son bliki décrivant l'approche

Michael Brown
la source
+1 CQRS correspond bien ici. Utilisez des événements pour remplir et mettre à jour une base de données de documents utilisée pour créer vos vues, et laissez votre base de données SQL telle qu'elle est.
quentin-starin
Nous n'avons pas adopté de système CQRS, mais j'ai prêté attention à ce que Greg, Udi et d'autres ont écrit. Une grande partie de CQRS n'est pas une plate-forme spécifique, mais il suffit de penser aux commandes et aux requêtes séparément. Je ne pense pas que Greg ait fini par écrire un livre, bien que Microsoft Patterns and Practices en ait sorti un.
John
1
La seule chose que j'ajouterais à cette réponse est: si votre cas d'utilisation concerne spécifiquement l'utilisation de ceci avec MS SQL et MVC, avez-vous envisagé BrightstarDB au lieu de MongoDB pour la partie NoSQL? Il a la compatibilité Entity Framework et LINQ, ce qui pourrait faciliter la transition pour vous.
CrazyPyro
1

Oui. Sur mon projet actuel, nous obtenons des données et les stockons dans SQL Server, puis nous créons des indices de recherche à l'aide de Lucene / Solr et les stockons dans MongoDB. Le remplissage de MongoDB se fait avec un chargeur personnalisé, cependant - pas de réplication SQL Server ni d'actualisation automatique.

TMN
la source
D'accord, je suis juste curieux, pourquoi ne pas peupler directement le mongo? Êtes-vous sous la même contrainte de devoir utiliser les deux?
yati sagade
Notre serveur SQL existant ne peut pas être réécrit du jour au lendemain. Ma pensée est que c'est une petite étape bébé, mais utile.
John
@yatisagade: D'accord. Nous avons des rapports qui doivent s'exécuter sur SQL Server, mais nous avons une application de recherche globale qui utilise les index Lucene.
TMN