我在一篇博客中读到,NoSQL数据库在在线货币交易方面并不是很好,即数据完整性最重要:原子性、一致性、隔离性和持久性。
可用性是否也会成为一个问题?
与NoSQL数据库相关的优缺点还有其他吗?MongoDB能满足数据完整性和可用性吗?
我在一篇博客中读到,NoSQL数据库在在线货币交易方面并不是很好,即数据完整性最重要:原子性、一致性、隔离性和持久性。
可用性是否也会成为一个问题?
与NoSQL数据库相关的优缺点还有其他吗?MongoDB能满足数据完整性和可用性吗?
NoSQL数据库主要用于解决以下几个问题:
(buzz) 大数据 => 想想TB,PB等等。
处理分布式系统 / 数据集 => 假设你有42个产品,其中13个位于芝加哥数据中心,21个位于纽约,另外8个则在日本其他地方。但是当你查询所有42个产品时,你不需要知道它们位于何处:NoSQL数据库会知道。这也允许使用更多的计算资源(服务器)来解决复杂的计算问题[似乎不适合您的用例,但这是一个有趣的事情要注意]
分区技术 => 使你的数据库易于分布,除了那些很酷的8个产品在日本之外,还可以进行轻松的数据复制,因此这些42个产品将被复制3倍,例如,这意味着每个产品都有3份副本。因此,如果出现问题,没有问题=>这里有一个可用的副本。这就是NoSQL数据库与RDBMS相比实际上表现出色的地方。当然,你可以分片、分区和集群Oracle/MySQL/PostgreSQL等等,但是这是一个几个数量级更复杂的过程,通常对于大多数人来说都是一个维护上的头疼。
(对于你的问题)
每天最少会有1000个用户
每天1000个用户是非常低的流量,除非你选择昨天凌晨3点编写的NoSQL解决方案作为概念证明,否则在这里不应该有任何问题。但如果你成功了,并且在几个月内拥有1亿用户,NoSQL将更简单地进行扩展。
可用性会成为问题吗?
坚实的NoSQL解决方案允许您指定所谓的quorum
:“在被视为成功之前,必须响应读取或写入请求的副本数量”。一些解决方案还执行所谓的hinted handoff
:“相邻节点暂时接管失败节点的存储操作”。通常,您应该能够根据您的需求控制可用性。(来自您的评论)
扩张
是一个非常相对的概念。 “金融行业已经相当扩张”,他们仍然主要使用关系型数据库进行日常操作。 Facebook使用MySQL。我曾为主要银行工作,他们使用Oracle/MySQL/PostgreSQL/DB2等,只有其中一些使用NoSQL,但不是针对需要始终保持100%一致性的数据。即使Facebook也仅将Cassandra用于“收件箱搜索”之类的东西。但如果扩展意味着更多的数据和用户(请求、连接等),则NoSQL将更容易扩展。再次强调,这并不意味着您无法扩展关系型数据库,只是更为繁琐/复杂。
根据我的经验,如果我构建的系统是优秀的,我总是需要考虑架构。 NoSQL数据库允许您对持久化的数据更加灵活,但这并不意味着您应该减少对架构的考虑。例如,请考虑对数据进行索引或将其分片到多个集群上,甚至可能向客户端公开的合同/接口等。
我并不认为这一般而言是正确的,除非我们在谈论大数据。以PostgreSQL为例,它是一款极其棒的软件,非常容易操作和维护。关系型数据库的另一个优点是,人们对SQL更加熟悉和舒适。比如,Cassandra发布了0.8版本的CQL
,这是SQL的一个非常有限的子集。类似于maintenance
这样的术语也应该与Talent
、Knowledge
、Expertise
等术语并驾齐驱。因为如果你使用Cassandra,那么她是一个非常需要"高维护"的女孩,但对于DataStax公司的男孩来说却不算什么,因为他们拥有专业知识,但你需要为此付出代价。
您的主要问题
如果不真正了解您的产品,很难判断NoSQL数据库是否适合。如果产品的主要目标是"在线交易",那么我建议不要使用NoSQL数据库(至少在2011年的今天是这样)。如果"在线交易"只是要求之一,而不是您产品的核心要素,那么根据"核心"是什么,您可以尝试使用NoSQL数据库,并使用外部服务(如Google Checkout等)来保证事务的一致性。
作为技术注释,如果您要解决的问题受益于分布式解决,我建议使用Erlang编写的数据库(如Riak、CouchDB等),因为作为一种语言,Erlang已经成功地解决了大多数分布式问题几十年。
MarkLogic是一种具有ACID事务的NoSQL数据库,用于管理游戏中的虚拟货币以及现实生活中的银行交易。