何时应该用NoSQL替换RDBMS/ORM

25

在使用ORM包装的关系型数据库(RDBMS)之外,哪些项目受益于使用NoSQL数据库?

例如:

  • 类似Stackoverflow的网站?
  • 社交社区?
  • 论坛?
2个回答

69

您的问题非常泛泛。NoSQL描述了一系列非常不同的数据库技术。大致上有以下几种类型:

  • 键值存储(Redis,Riak)
  • 三元组存储(AllegroGraph)
  • 列族存储(Bigtable,Cassandra)
  • 面向文档的存储(CouchDB,MongoDB)
  • 图形数据库(Neo4j)

在项目的开发阶段中使用文档数据库可以使您免于设计复杂的实体关系图或编写复杂的联接查询,因此在此阶段中可以从文档数据库中获益。我在这个答案中详细介绍了文档数据库的其他用途。

如果您的应用程序需要处理大量数据,则使用专门的NoSQL解决方案(例如Cassandra)可能会导致开发阶段更长。但是,当您的应用程序进入生产阶段时,Cassandra的性能和可伸缩性将极大地受益。

总的来说,如果一个应用程序具有以下要求:

  • 进行水平扩展
  • 使用数据模型X
  • 执行Y个操作

该应用程序将从使用针对存储数据模型X并在数据上执行Y个操作的NoSQL解决方案中受益。如果您需要更具体有关某种类型的NoSQL数据库的答案,您需要更新您的问题。

  1. 开发过程中的好处(例如比SQL更易于使用,没有许可证成本)?
  2. 性能上的优势(例如可以处理百万并发用户)?
  3. 使用哪种类型的NoSQL数据库?

更新

键值存储在大多数情况下只能通过键进行查询。它们适用于存储简单的数据,例如用户会话、简单的个人资料或预先计算的值和输出结果。尽管可能可以将更复杂的数据存储在键值对中,但这会使应用程序承担维护“手动”索引以执行更高级查询的责任。

三元存储用于存储资源描述元数据。我对这些存储不了解,除了维基百科告诉我的,所以您需要进行一些研究。

列族存储是为存储和处理大量数据而构建的。它们被谷歌搜索引擎和Facebook收件箱搜索使用。数据通过MapReduce函数进行查询。虽然刚开始理解MapReduce函数可能有些困难,但这个概念相当简单。以下是一个(希望)解释这个概念的比喻:

想象你有多个装满收据的鞋盒,并且你想计算你的总开销。你邀请一些朋友过来,为每个鞋盒分配一个人。每个人在他的鞋盒中写下每张收据的总额。这个选择所需数据的过程是Map部分。

当一个人记录了他的(一些)收据的总数时,他可以对这些总数进行求和。这是Reduce部分,可以重复多次,直到处理完所有收据。最后,你的所有朋友聚在一起,将他们的总和相加,给出你的总开销。这就是最终的Reduce步骤。

这种方法的优点是,您可以拥有任意数量的鞋盒,并且可以将任意数量的人分配给一个鞋盒,最终仍然得到相同的结果。 每个鞋盒都可以看作是数据库网络中的服务器。 每个朋友可以看作是服务器上的一个线程。 使用MapReduce,您可以将数据分布在许多服务器上,并使每个服务器处理查询的一部分,从而优化数据库的性能。

面向文档的存储此问题中有解释,因此我将不在此处讨论它们。

图数据库用于存储高度连接对象的网络,例如社交网络上的用户。 这些数据库针对图操作进行了优化,例如查找两个节点之间的最短路径或查找当前节点三个跳之内的所有节点。 在关系型数据库系统或其他NoSQL数据库上执行此类操作相当昂贵,但在图数据库上非常便宜。


2
+1 很好的回答。我会在有更多投票时给你点赞。 - NullUserException
非常具有讽刺意味的是,大多数大型社交网络网站并不使用图形数据库,而是使用像Cassandra或Voldemort这样的键值存储数据库。 - Joshua Partogi
1
@jpartogi:这主要是因为图形数据库的扩展性不如其他NoSQL解决方案。这是由于对象之间的高连接性,使得在单个服务器上存储所有相关数据以获得更好的性能几乎是不可能的。我相信Twitter仍然使用[FlockDB](http://github.com/twitter/flockdb#readme)。它是一个轻量级的图形数据库,注重性能而不是复杂的图形操作。 - Niels van der Rest
在Cassandra的官方网站上,他们更倾向于将他们的NoSQL技术类型定义为键值。哪一个才是正确的呢?http://planetcassandra.org/what-is-nosql/#nosql-database-types - Burak Karakuş

0

NoSQL在设计方法上有不同的方法,不仅仅是查询语言。它可以具有不同的特点。例如,列式数据库用于大量数据仓库,这可能会用于OLAP

与我的问题类似,您会发现许多资源。


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