将网上商店存储移动到NoSQL解决方案

时间:2010-05-26 12:59:01

标签: sql-server mongodb rdbms relational db4o

如果您有基于SQL Server关系数据库的网上商店解决方案,那么迁移到NoSQL存储的原因是什么?将依赖关系的数据存储迁移到NoSQL甚至是否有意义?如果从头开始,你会选择NoSQL解决方案而不是关系网络项目,这会在一段时间之后再次出现一堆表格,如文章,分类,税率,价目表等,以及它们之间的关系。 ?

.NET(4.0)对MongoDB或MongoDB对.NET 4.0的支持有什么支持?对于MongoDB,我可以依靠类似于EF向导,L2SQL向导等的丰富代码生成工具吗?

因为正如我迄今所读到的那样,NoSQL主要适用于文档存储,更简单的对象模型。

您对这个问题的回答将帮助我做出正确的基础设施设计决策。

更新:如果我正在围绕ASP.NET MVC开发我的解决方案并且严重依赖于Model类,那么选择DB4o来简单地将对象序列化和反序列化到数据存储区和从数据存储区中解析是不是最简单的方法?

2 个答案:

答案 0 :(得分:8)

这是一个非常开放的问题。

  

迁移到现有软件的NoSQL数据存储区

对于现有的关系技术,经常有很多经验和知识。当你的应用程序运行良好时,它可能不值得努力。但是,如果当前解决方案存在无法解决的问题,那么它就是一个选项。

  

将依赖关系的数据存储迁移到NoSQL甚至是否有意义?

那么你必须考虑到这三种技术(Document-DB,RDBMS,Object Database)彼此之间存在很大差异。

  • 在关系世界中,您将数据标准化并在运行时将它们连接在一起。只要数据大小不大,这种方法就可以正常工作。这里经常出现问题:当你有大量标准化数据时,你需要做很多连接,这会花费很多性能。当然,对象和表之间的映射可能非常棘手。
  • 在对象数据库中,每个对象都是单独存储的,“关系”以指针的形式存储。因此,当对象A具有对对象B的引用时,对象数据库存储此引用。因此,要检索“关系”,不需要连接操作。因此,“关系”很便宜。总之,对象数据库非常善于处理关系。
  • 在像MongoDB这样的文档数据库中,完整的对象图存储为文档。文档数据库与文档级一起使用。所以这里没有真正的“关系”。您通常只是存储/加载文档。因此,当您可以为场景建模以便大多数操作仅在单个文档上工作时,它非常高效且简单。

这是一个很好的blog-post,可以比较MongoDB(文档数据库)和db4o(对象数据库)的设计差异

最后,您的模型应该适合您的数据库。例如,不要尝试将模型用于关系数据库,并将其以1:1的形式存储在文档数据库中。另请参阅Ayende's blog about modeling for a object-database

  

.NET(4.0)对MongoDB或MongoDB对.NET 4.0的支持有什么支持?

Gates VP has already answered this for MongoDB。 .NET 4.0版本的db4o正在开发中。同时3.5版本也适用于4.0框架。

  

我可以依靠类似于EF向导,L2SQL向导等的MongoDB丰富的代码生成工具吗?

对于MongoDB和db4o,您不需要生成代码。您的类是架构。您只需存储对象,数据库将处理剩下的事情。另请参阅Gates VP answer

  

因为正如我迄今所读到的那样,NoSQL主要适用于文档存储,更简单的对象模型。

嗯,范围很大。从非常简单的键值存储到更高级的文档数据库,面向字体的数据库,图形数据库和对象数据库。

当然,当您拥有类似文档的数据(例如博客软件)时,文档数据库的工作非常出色。而图形和对象数据库擅长处理极端复杂的数据结构。

答案 1 :(得分:3)

好的,这是很多问题,让我们看看我能真正解决哪些问题。

  

迁移现有的关系数据存储是否有意义?

除非你有一个非常大的性能问题。这是交易,“网络规模”的性能问题通常通过非规范化来解决。 MongoDB是一个固有的非规范化数据库。

  

如果从头开始,你会为网店项目选择NoSQL解决方案而非关系型解决方案......

是。 MongoDB非常适合典型的基于Web的项目。但是,如果您有很多SQL经验,那么您可能会发现报告有点尴尬。

  

.NET 4.0支持?对于MongoDB,我可以依靠类似于EF向导,L2SQL向导等的丰富代码生成工具吗?

Mongo有一个可用于.NET的驱动程序。

Mongo没有L2SQL或EF向导,但确实不应该。老实说,你可能最想念的是用于分析数据库的企业管理器。

MongoDB实际上并不需要EF向导。 EF是MS针对DB和对象之间“阻抗不匹配”的解决方案。 MongoDB没有“阻抗不匹配”,只是填充数据库中的对象然后去。 L2SQL的情况大致相同。人们已经建立了一些Linq支持(只是一个快速的谷歌),但像连接这样的东西将无法工作b / c Mongo不会加入。

从“数据对象”的角度来看,Mongo只需要一个非常轻量级的框架。老实说,这就像将属性填充到数据库中一样简单。如果要“添加列”,只需将属性添加到对象中,它就会开始保存在数据库中。所以像L2SQL这样的东西开始变得非常不必要。

不要误会我的意思,有不同的查询范式,但在这方面,你处于新的领域。 (您将用于所有键值和面向文档的商店。)