使用NoSQL数据库有哪些优势?最近我读了很多关于它们的文章,但我仍然不确定为什么要实现这样一种数据库,并在什么情况下使用。
NoSQL解决方案通常旨在解决关系数据库不适用、使用成本过高(如Oracle)或需要实现破坏您数据库关系性质的东西的问题。
优势通常与您的使用情况有关,但是,除非您在关系数据库管理系统中建模数据存在问题,否则我认为您没有理由选择NoSQL。
我自己使用MongoDB和Riak解决一些关系型数据库不可行的特定问题,对于其他所有事情,我使用MySQL(或SQLite进行测试)。
如果您需要一个NoSQL数据库,您通常会知道原因,可能的原因是:
如果您不需要NoSQL解决方案,则请记住,这些解决方案并不是关系型数据库管理系统的替代品,而是在前者失败时提供的替代选择,更重要的是,它们相对较新,因此仍然存在许多错误和缺失的功能。
关于第二个问题,使用任何技术与其他技术结合使用都是可以的,所以根据我的经验,只要它们不在同一台机器上,MongoDB和MySQL一起工作得很好。
NoSQL是一种数据库系统,其中数据以文档(MongoDB)、键值对(MemCache, Redis)和图形结构形式(Neo4J)进行组织。
也许有可能的问题和答案可以看做是“何时使用NoSQL”:
需要灵活的架构或处理树状数据吗?
通常情况下,在敏捷开发中,我们开始设计系统时不会事先知道所有需求,而随着开发的进行,数据库系统可能需要适应频繁的设计更改,展示MVP (Minimal Viable Product)。
或者你正在处理一个动态的数据模式。
例如 AWS CloudTrail 日志非常精确。
数据集很大/广泛吗?
是的,NoSQL数据库是管理数百万甚至数十亿记录而不牺牲性能和可用性的应用程序的更好候选者,虽然在某些情况下可能会牺牲一致性(现代数据库在这里是例外,它允许可调整的一致性超过可用性,例如Cassandra,云提供商数据库CosmosDB,DynamoDB)。
在扩展和一致性之间权衡
与关系型数据库不同,NoSQL数据库可能使数据集在其他节点上最终保持一致,这是默认行为,但易于在性能和可用性方面进行扩展。
例如:这对于存储在线人员的即时通讯应用程序、API令牌在DB中和记录网站流量统计数据可能是有益的。
执行地理位置操作: MongoDB具有丰富的支持进行GeoQuerying和地理位置操作的哈希功能。我真的很喜欢MongoDB的这个特性。PostresSQL也是如此,但实施的简易程度取决于使用案例。
简而言之,MongoDB非常适合大规模存储动态结构化数据的应用程序。
编辑: 更新了关于数据库一致性的答案。
重要的是:SQL 已经存在了40多年,大型系统如Oracle或Microsoft SQL已经投入了数百万小时的开发。一些新数据库必须实现这一点。有时找到SQL管理员比找MongoDB管理员更容易。这就带来了维护和管理的问题。这个主题并不是很吸引人,但它是技术决策的一部分。
处理大量读写操作
在需要快速扩展时,可以考虑使用NoSQL数据库。一般情况下,何时需要快速扩展呢?当您的网站有大量读写操作或需要处理大量数据时,NoSQL数据库是最适合的选择。由于它们具有动态添加节点的能力,因此可以处理更多并发流量和大量数据,并且延迟最小。
数据建模灵活性
第二个提示是在开发的初始阶段,当您不确定数据模型、数据库设计以及预期变化速度时,NoSQL数据库为我们提供了更多的灵活性。
最终一致性优于强一致性
当我们不需要事务时,最好选择NoSQL数据库,允许最终一致性代替强一致性。
一个很好的例子是像Twitter这样的社交网络网站。当名人的推文走红,并且来自世界各地的人都在点赞和转推时,如果喜欢的数量短时间内稍微增加或减少一点,那又有什么关系呢?
如果系统显示的“喜欢”的计数从实际的550万减少到525万,名人肯定不会在意。
当一个大型应用程序部署在遍布全球的数百台服务器上时,地理分布式节点需要一些时间来达成全局共识。在它们达成共识之前,实体的值是不一致的。在短时间内,实体的值最终变得一致。这就是最终一致性。
尽管不一致并不意味着任何形式的数据丢失。它只是意味着数据需要经过一段短暂的时间通过海底互联网电缆在全球范围内传输以达到全球共识并变得一致。
我们经常会遇到这种情况,特别是在YouTube上。您经常会看到一个视频有10个观看次数和15个赞。这怎么可能呢?
实际上不可能。实际的观看次数已经超过了“喜欢”的数量。只是观看次数不一致,并且需要一段时间才能更新。
运行数据分析
NoSQL数据库也非常适合处理大量数据分析用例。
注意:上述内容仅适用于面向文档的NoSQL。还有其他类型的NoSQL需要考虑其他因素。