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

11
我们有一个高流量的新闻网站,架构通常是DB - Repo Layer - Services Layer - Asp.Net MVC。我们遇到的问题主要是读性能方面。事实证明,所有这些领域对象的DDD(领域驱动设计)理论对于业务规则非常有用,但在优化读性能方面会增加难度。
作为解决方案,我正在考虑一些全新的东西(对我们来说):使用noSQL。我想在我们的网站上使用noSQL数据库呈现数据。我们不能摆脱SQL Server(至少短期内不行),但对于所有新开发,使用Mongo作为查询数据库似乎是一个实际的步骤。
我的问题是是否可能同时使用SQL Server作为记录数据库和Mongo作为查询数据库,如果可以,您会使用什么技术/技术来更新更新?我希望每15分钟刷新Mongo。

1
这可能是一个适合 programmers.stackexchange.com 的问题,但我们对答案感兴趣,因为我们正在考虑做同样的事情。 - Brian Hoover
添加到StackExchange网站:http://programmers.stackexchange.com/questions/125980/can-sql-server-and-mongo-be-used-together - John
我认为使用真实的数据缓存比使用mongodb模拟缓存效果更好。 - Filip De Vos
也许可以使用CQRS(命令查询职责分离)来实现缓存层? - hellectronic
我的意思是,使用从缓存中读取而不是直接从数据库中读取的提供程序。 - hellectronic
显示剩余2条评论
2个回答

13

我建议查看 CQRS (命令查询职责分离) 模式,这最初由 Greg Young 引入。你还可以在这里读到更多信息。

这种方法涉及使用两个数据库:写和读。写数据库用作主要的写存储库,而读数据库用于查询。读数据库可以具有数据反规范化。例如,如果您有文章,可以将作者信息嵌入其中,以便快速显示在ui上。总体而言,nosql数据库非常适合读取存储。

在您的情况下,主要规范化数据库可以是sql,而读取数据库可以是mongodb。

通常,这种方法非常适合高流量系统。有一个开源实现--ncqrs

此外,这种方法在微软2012年的路线图中也被提及。

我个人使用这种方法已经超过一年,并给予它我的赞同。


CQRS是我正在尝试的内容,但在仍然使用现有遗留系统的情况下如何朝着这个方向前进仍然存在困难。nCQRS似乎需要进行大量重写。我试图从简单的事情开始:创建一个只读的MongoDB,并将其用于新的客户端页面。正如Udi所说的那样,“CQRS是一种方法,一种思维方式-而不是模板解决方案。” - John
@John:是的,Udi Dahan 的观点一如既往地正确。应用 CQRS 意味着需要进行大量重写,但将来会带来许多好处。不仅可以提高性能、可扩展性,还可以简化和逻辑分离应用程序代码。 - Andrew Orsich

0

将迁移到像MariaDB Enterprise(在本地或通过SkySQL云)这样的数据库可能是一个有趣的选项来评估。MariaDB具有多个可插拔、特定用途的存储引擎,每个表都配置了这些引擎,并支持跨引擎连接(连接使用不同存储引擎的表)。其中一些(但不是全部)引擎包括:

  • ColumnStore: 用于大数据和分析。这相当于在表的每一列上都有一个索引,但不需要处理索引的麻烦。它支持水平扩展,在实时中支持对数百亿行的即席查询。

  • Aria: 适用于不需要事务能力但读取性能至关重要的读取密集型工作负载(例如购物车、评论、评级等)。

  • MyRocks: 适用于需要比其他存储引擎或数据库更好的压缩和较少写放大的写入密集型工作负载。

  • InnoDB: 99%的情况下你所需要的。它支持压缩、加密、事务、即时模式更改、多主群集与同步复制等功能。

  • MEMORY: 用于将数据存储在内存而不是磁盘中。非常适合只读缓存和临时数据。

  • CONNECT: 允许MariaDB访问外部本地或远程数据(MED)。通过定义基于不同数据类型的表来实现,特别是各种格式的文件、从其他DBMS或产品(如Excel或MongoDB)提取的数据通过ODBC或JDBC,或从环境中检索的数据(例如DIR、WMI和MAC表)。

  • Spider: 支持分区和xa事务,并允许处理来自不同MariaDB实例的表,就像它们在同一个实例上一样。

在这里,您可以找到有关如何选择正确的存储引擎的建议:https://mariadb.com/kb/en/choosing-the-right-storage-engine/

此外,还有MariaDB Xpand,它几乎线性扩展读写能力,同时保持ACID兼容性;还有MaxScale,一个数据库代理,可以实现自动故障转移、读写分离、透明掩码、导入和导出数据库事件到Kafka(CDC),甚至可以将MariaDB用作MongoDB数据库(您可以连接使用MongoDB驱动程序的应用程序,并将数据存储在MariaDB中,而不是MongoDB本身,这样可以使用单个SQL语句将MongoDB应用程序中的数据与关系表中的数据进行关联)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接