2010-02-19 49 views
23

我的脑海里紧紧裹着关系数据库,以及如何有效地对它们进行编码。我的大部分经验是使用MySQL和SQL。我喜欢我听到的关于基于文档的数据库的许多事情,尤其是当最近的播客中有人提到巨大的性能优势时。所以,如果我要走这条路,那么我必须采取哪些心理步骤才能从SQL转移到NO-SQL?开发人员必须采取什么“精神步骤”才能开始从SQL转移到NO-SQL(CouchDB,FathomDB,MongoDB等)?

如果它在你的答案中有所不同,我主要是C#开发人员(今天,无论如何)。我习惯于像EF和Linq到ORM的ORM。在ORM之前,我使用泛型和数据收集器来转换自己的对象。也许这很重要,也许不重要。

这里有一些更具体:

  1. 我怎么需要考虑加入?
  2. 如何在没有SELECT语句的情况下进行查询?
  3. 当我在代码中添加一个属性时,我现有的存储对象会发生什么?

(随意添加你自己在这里的问题)

回答

20

首先,每个NoSQL商店是不同的。所以它不像在Oracle或Sql Server或MySQL之间选择。它们之间的差异可能很大。

例如,使用CouchDB(如果你喜欢动态查询),你不能执行即席查询。它非常适合在线 - 离线场景,并且足够小,可在大多数设备上运行。它有一个RESTful接口,所以没有驱动程序,没有ADO.NET库。为了查询它,您可以使用MapReduce(现在这在NoSQL空间中非常普遍,但并非普遍存在)来创建视图,并且这些视图以多种语言编写,尽管大多数文档都是针对Javascript的。 CouchDB也被设计为崩溃,也就是说如果出现问题,它会重新启动进程(Erlang进程或一组链接进程,而不是整个CouchDB实例)。

的MongoDB的设计是具有高性能,有司机,并似乎少了很多的人在.NET世界,因为这是一个飞跃。我相信虽然在崩溃的情况下可能会丢失数据(它不提供与CouchDB相同的写入相同级别的事务保证)。

现在,这两个都是文件的数据库,因此他们共享他们的数据是非结构化的。没有表格,没有定义的模式 - 它们是无模式的。尽管他们并不像关键价值商店,但他们坚持认为,你所持有的数据对他们来说是可理解的。借助CouchDB,这意味着使用JSON,而对于MongoDB,这意味着使用BSON。

有MongoDB的和CouchDB的之间有许多其他方面的差异和这些在NoSQL的空间被认为是在他们的设计非常接近!

除了文档数据库,其是面向网络的解决方案,如Neo4j的,柱状店(面向列,而不是他们如何坚持数据行导向),等等。

除了MapReduce之外,大多数NoSQL解决方案中常见的东西是它们不是关系数据库,而且大多数不使用SQL样式语法。典型的查询遵循一种命令式的编程模式,而不是SQL的声明式风格。

另一个通常常见的特征是,通常由关系数据库提供的绝对一致性用于最终一致性模型的交易。我对任何希望使用NoSQL解决方案的人的建议是,首先要真正了解他们的要求,了解SLA(需要什么级别的延迟;当解决方案需要扩展时,必须保持多长时间的一致性;预计负载;负载是一致的还是会飙升的;用户对数据的看法如何一致,他们是否应该在查询时始终看到他们自己的写入,他们的写入是否应该立即对所有其他用户可见;等等。 ..)。了解到你无法拥有所有的东西,请阅读Brewers CAP论坛,它基本上说你不能拥有绝对的一致性,100%的可用性,并且是分区容错(当节点不能通信时应付)。然后查看各种NoSQL解决方案,并开始消除那些不符合您的要求的设计,了解从关系数据库迁移并非微不足道,并且与其相关的成本(我发现将组织迁移到就会议,讨论等方面而言,这一方向本身非常高,防止集中在其他潜在利益领域)。大多数情况下,你不需要ORM(该方程的R部分刚刚失踪),有时候只是二进制序列化可能是好的(比如DB4O或键值存储),像Newtonsoft JSON/BSON库可能会有帮助,可能会自动映射器。我发现使用C#3进行工作与使用像Python这样的动态语言相比,是一个明确的成本。在C#4中,这可能会略微改进,例如DLR中的ExpandoObject和Dynamic。

看你的3点特定的问题,所有这取决于你采用的NoSQL解决方案,所以没有一个答案是可能的,但与告诫,非常笼统:

  1. 如果坚持的对象(或更可能的聚合)作为一个整体,你的连接通常会在代码中,尽管你可以通过MapReduce来做一些这样的事情。

  2. 同样,它依赖于Couch,但您可以通过HTTP对特定资源或MapReduce视图执行GET GET。

  3. 很可能没有什么。只需注意序列化和反序列化情况。我发现的难点在于如何管理代码版本。如果该属性纯粹是为了推送到一个接口(GUI,Web服务),那么它往往不是一个问题。如果财产是一种行为依赖的内部状态,那么这会变得更加棘手。

希望它有帮助,祝你好运!

+0

感谢您投入您的时间在这个答案。你已经帮助弄清了几件事情。由于学习曲线,我一直在密切关注MongoDB。我非常期待进入MapReduce。听起来很好玩。 – 2010-02-20 21:25:35

+0

很高兴帮助,我在Twitter @NeilRobbins,有兴趣听到你如何得到:) – Neil 2010-02-20 21:35:49

5

只要停止思考的数据库。

想想你的域名建模。按照良好的模式和实践构建您的对象来解决手头的问题,而不必担心持久性。

+0

只是为了澄清,从关系思维转变为无sql思维方式所需的步骤是完全忽略持久性关注点? – 2012-08-21 20:09:13

相关问题