3

如果您有一个基于 SQL Server 关系数据库的网店解决方案,那么迁移到 NoSQL 存储的原因是什么(如果有的话)?将严重依赖关系的数据存储迁移到 NoSQL 是否有意义?如果从头开始,您是否会为网店项目选择 NoSQL 解决方案而不是关系解决方案,一段时间后,这将再次以一堆表格结束,如文章、分类、TaxRates、价目表等,以及它们之间的关系大小?

.NET (4.0) 对 MongoDB 或 MongoDB 对 .NET 4.0 的支持是什么样的?我可以指望 MongoDB 的丰富代码生成工具,例如 EF 向导、L2SQL 向导等吗?

因为到目前为止我所读到的,NoSQL 最适合文档存储,更简单的对象模型。

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

更新:如果我围绕 ASP.NET MVC 开发我的解决方案并严重依赖模型类,那么选择 DB4o 来简单地序列化和反序列化与数据存储区之间的对象是否是最简单的方法?

4

2 回答 2

8

好吧,这是一个开放式的问题。

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

现有的关系技术通常有很多经验和知识。当您的应用程序运行良好时,它可能不值得付出努力。但是,当您对当前解决方案有无法解决的问题时,这是一种选择。

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

好吧,您必须考虑这三种技术(文档数据库、关系数据库管理系统、对象数据库)彼此之间非常不同。

  • 在关系世界中,您可以规范化数据并在运行时将它们连接在一起。只要数据量不大,这很好用。问题通常从这里开始:当您拥有大量规范化数据时,您需要进行大量连接,这会消耗大量性能。当然,对象和表之间的映射可能非常棘手。
  • 在对象数据库中,每个对象都是单独存储的,“关系”以指针的形式存储。因此,当对象 A 具有对对象 B 的引用时,对象数据库将存储此引用。因此,要检索“关系”,不需要连接操作。因此,“关系”是廉价的。总之,对象数据库非常擅长处理关系。
  • 在像 MongoDB 这样的文档数据库中,完整的对象图存储为文档。文档数据库与文档级别一起工作。所以这里没有真正的“关系”。您通常只存储/加载文档。因此,当您可以对场景进行建模以使您的大部分操作仅在单个文档上工作时,它会非常高效且简单。

这是一篇很好的博客文章,它比较了 MongoDB(文档数据库)和 db4o(对象数据库)的设计差异

最后,您的模型应该适合您的数据库。例如,不要尝试将模型用于关系数据库并将其 1:1 存储在文档数据库中。另请参阅Ayende 关于对象数据库建模的博客

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

盖茨副总裁已经为 MongoDB 回答了这个问题。.NET 4.0 版本的 db4o 正在开发中。同时 3.5 版本在 4.0 框架上也能正常工作。

我可以指望 MongoDB 的丰富代码生成工具,例如 EF 向导、L2SQL 向导等吗?

对于 MongoDB 和 db4o,您都不需要生成代码。你的类是模式。您只需存储对象,其余的由数据库处理。另请参阅盖茨副总裁的回答

因为到目前为止我所读到的,NoSQL 最适合文档存储,更简单的对象模型。

那么范围是相当大的。从真正简单的键值存储到更高级的文档数据库、面向列的数据库、图形数据库和对象数据库。

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

于 2010-05-26T20:02:20.950 回答
3

好的,问题太多了,让我们看看我能真正解决哪些问题。

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

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

如果从头开始,您会为网店项目选择 NoSQL 解决方案而不是关系解决方案吗?

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

.NET 4.0 支持?我可以指望 MongoDB 的丰富代码生成工具,例如 EF 向导、L2SQL 向导等吗?

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

Mongo 没有 L2SQL 或 EF 向导,但实际上不应该有。老实说,您可能最想念的是用于分析数据库的 Enterprise Manager。

MongoDB 并不真正需要 EF 向导。EF 是 MS 针对 DB 和对象之间“阻抗不匹配”的解决方案。MongoDB 没有“阻抗不匹配”,只需将对象填充到数据库中即可。L2SQL 也是如此。人们已经建立了一些 Linq 支持(只是一个快速的谷歌),但是加入之类的东西不起作用 b/c Mongo 不做加入。

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

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

于 2010-05-26T19:31:18.093 回答