SQL Server和Mongo可以一起使用吗?


14

我们有一个大型的面向新闻的网站,具有很高的网络流量。该体系结构是您经常看到的DB-回购层-服务层-Asp.Net MVC。我们一直看到的问题与读取性能有关。事实证明,从理论上讲,所有这些DDD域对象对于业务规则来说都是很棒的,但是在优化读取性能方面却变得更加艰辛。

作为一种解决方案,我正在考虑(对我们而言)全新的事物:使用noSQL。我想使用noSQL数据库存储在我们网站上显示的数据。我们无法摆脱我们的SQL Server(至少不会很快),但是在我看来,一个实际可行的步骤是将Mongo用作所有新开发的查询数据库。

我的问题是,它是否可以使用SQL Server作为您的记录和蒙戈作为查询数据库的数据库一起

因此,当我们的一位编辑者更新记录时,数据将存储在SQL Server中。这是必要的,因为有太多的遗留代码无法在一夜之间重写。

但是,当网站上的查看者查看文章或文章列表时,我想利用Mongo与SQL Server的性能。为了使数据保持最新状态(例如15分钟或更短),SQL Server数据将需要刷新Mongo。RDBMS具有用于此类操作的复制工具,我想知道是否存在从SQL Server到Mongo的相同操作。Lync服务器,也许吗?


3
可能?当然,有可能作为两个单独的数据存储。您到底在问什么?
奥德

但是,您可以一起使用它们吗?Mongo DB基本上充当数据的只读缓存?
约翰

1
同样,您当然可以“一起使用”。但这尚不清楚。只要您具有mongo的某种更新机制,就可以使用。请参阅Udi Dahan的帖子-但您可以自行定义机制。
奥德

1
我们从未迁移到MongoDB,但是看起来可能明年。我们已经完成的一种过渡方式是将JSON存储在varchar字段中。从我阅读的所有内容来看,没有一种在NoSQL和SQL之间来回移动数据的好方法-所有这些都需要自定义,尤其是因为那里的NoSQL数据库在做事方式上有很大差异。
约翰

1
@John如果您希望坚持使用关系型并且愿意离开SQL Server,则可能要看看Postgresql及其json集成。因此,将数据存储在json列中,然后可以在数据库中对其进行操作。

Answers:


13

您已经遇到了许多人面临的问题……针对读取进行了优化的数据库很少会提高写入效率,反之亦然。从这种读写障碍发展而来的一种方法是CQRS(命令查询责任隔离)。尽管Wikipedia将两者链接在一起,但CQRS和CQS在技术上是不同的。CQS只是要求一种方法要么进行更改(命令),要么进行信息查询(查询),但不要两者都做。

CQRS更进一步,并指定您具有用于查询和命令的单独模型。这一步使您可以分离读写数据库。您要做什么。

我不能说我是Mongo专家或将其配置为可与SQL Server一起使用。但是据我了解,人们将Mongo用作其事务数据库的非规范化视图。从事务数据库更新Mongo可能归因于运行SQL Agent。或者具有单独的服务来轮询数据库。

更好的选择是让您的Command服务在进行更新时触发一个事件。然后,您将拥有一个监听该事件并使用该信息更新MongoDB的服务。这是事件来源的基本方法搜索(在页面上搜索事件搜索)。

DDD世界中的思想领袖之一格雷格·扬(Greg Young)目前正在以CQRS的Fowler签名丛书形式编写一本书,称为Event-Centric(以前称为CQRS)。福勒(Fowler)在他的bliki上发表了一篇描述这种方法的文章。


+1 CQRS非常适合这里。使用事件来填充和更新用于构建视图的文档数据库,并使sql数据库保持原样。
2011年

我们尚未采用CQRS系统,但是我已经关注了Greg,Udi和其他人所写的内容。CQRS的很大一部分不是特定的平台,而只是分别考虑命令和查询。我不认为Greg最终不会写一本书,尽管Microsoft Patterns and Practices确实发行了一本书。
约翰

1
我要添加到此答案中的唯一一件事是:如果您的用例专门用于与MS SQL和MVC一起使用,那么您是否考虑将BrightstarDB而不是MongoDB用于NoSQL部分?它具有Entity Framework和LINQ兼容性,这可能为您简化过渡。
CrazyPyro

1

是。在我当前的项目中,我们正在获取数据并将其存储在SQL Server中,然后使用Lucene / Solr构建搜索索引并将其存储在MongoDB中。不过,使用自定义加载器填充MongoDB的工作-无需SQL Server复制或自动刷新。


好吧,我很好奇,为什么不直接填充mongo?你的相同的约束下,同时使用?
yati sagade 2011年

我们现有的SQL Server不能在一夜之间重写。我的想法是,这是一个很小但有用的步骤。
约翰,

@yatisagade:对。我们有必须针对SQL Server运行的报告,但是我们有一个使用Lucene索引的全局搜索应用程序。
TMN
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.