NoSQL简介
在大多数大型应用程序和服务中,核心都是高性能的数据存储解决方案。后端数据存储负责存储用户账户信息、产品数据、记账信息和博客等重要数据。优秀的应用程序要求能够准确、快速、可靠地存储和检索数据,因此选择的数据存储机制的性能必须能够满足应用程序的需求。 有多种数据存储解决方案可用于存储和检索应用程序所需的数据,其中最常见的有三种:文件系统直接存储、关系型数据库和NoSQL数据库。
NoSQL是什么
一种常见的误解是,以为术语NoSQL指的是“非SQL”,它实际上指的是“不仅仅是SQL”,这旨在强调这样一点:NoSQL数据库并非SQL的替代品,它实际上也可使用类似于SQL的查询概念。
NoSQL是个包罗万象的术语,涵盖了除传统关系型数据库管理系统(RDBMS)之外的所有数据库。NoSQL旨在简化设计、支持横向扩展以及更细致地控制数据的可用性。NoSQL数据库专用于存储特定类型的数据,因此在大多数情况下效率和性能都高于RDBMS服务器。
NoSQL试图放弃关系型数据库的传统结构,让开发人员能够以更接近系统数据流需求的方式实现模型。这意味着NoSQL数据库能够以传统关系型数据库不支持的方式组织数据。
当前有多种不同的NoSQL技术,其中包括HBase列结构、Redis键/值结构以及Virtuoso图结构。
文档存储数据库
文档存储数据库采用面向文档的方法来存储数据,其背后的理念是,可将单个实体的所有数据都存储在一个文档中,而文档可存储在集合中。
文档可包含描述实体的所有必要信息,包括子文档;而在RDBMS中,子文档通常存储为编码字符串或存储在独立的表中。集合中的文档是通过独一无二的键访问的。
键/值数据库
最简单的NoSQL数据库是键/值存储。这些数据库存储数据时不采用任何模式(schema),这意味着存储的数据无需遵循任何预定义的结构。键可指向任何数据类型,从对象到字符串值,再到编程语言的函数。
键/值存储的优点是易于实现和添加数据,因此非常适合用于提供基于键来存储和检索数据的简单存储,缺点是无法根据存储的值来查找元素。
列存储数据库
列存储数据库在键空间内以列的方式存储数据,其中的键空间基于独一无二的名称、值和时间戳。这类似于键/值数据库,但列存储数据库适合用于存储根据时间戳来区分有效内容和无效内容的数据。这提供了这样的优点,即能够让数据库中存储的数据过期。
图存储数据库
图存储数据库是为这样的数据设计的,即能够轻松将其表示为图。这意味着元素通过它们之间的关系相关联,而这些关系的数量是不确定的,就像家谱、社会关系、航线拓扑图或标准交通图那样。
选择RDBMS、NoSQL还是两者
研究NoSQL数据库时,在选择哪种数据库以及如何使用它们方面,应保持开放心态。对于高性能系统尤其应该如此。
您可能选择只使用RDBMS或NoSQL,也可能需要结合使用它们以提供最佳的解决方案。
在所有高性能数据库中,都必须在速度、准确性和可靠性之间进行折衷。下面列出了选择数据库时需要考虑的一些因素。
- 要存储的数据是什么样的? 要存储的数据可能适合采用RDBMS的表/行结构、文档结构或简单的键/值对结构。
- 当前是如何存储数据的? 如果数据当前存储在RDBMS数据库中,就必须进行评估,将其全部或部分迁移到NoSQL需要多少人力和物力。另外,还应考虑是否能够保留原来的数据不动,只使用NoSQL数据库来存储新增的数据。
- 确保数据库事务的准确性有多重要? NoSQL的一个缺点是,大多数解决方案在ACID(原子性、一致性、隔离性和持久性)方面都无法与广泛接受的RDBMS系统媲美。
- 数据库的速度有多重要? 如果对您的数据库来说,速度至关重要,那么使用NoSQL可能是合适的,因为它能够极大地提高性能。
- 数据不可用将导致什么后果? 考虑数据不可用对客户的影响有多大。别忘了,在客户看来,数据库响应太慢也属于不可用。包括MongoDB在内的很多NoSQL解决方案都使用复制和分片提供了良好的高可用性计划。
- 数据库将被如何使用? 具体地说,考虑大多数数据库操作都是写入还是读取的。您还可以据此确定数据分割边界,将主要被写入的数据和主要被读取的数据分开。 该将数据分开以充分利用 RDBMS和 NoSQL的优点吗? 考虑前述问题后,您可能想将有些数据(如关键交易)放在RDBMS数据库中,而将其他数据(如博客文章)放在NoSQL数据库中。