我一直在听到有关 NoSQL 的消息,并且它最终可能成为 SQL DB 存储方法的替代品,因为 DB 交互通常是 Web 速度的瓶颈。
所以我只有几个问题:
它到底是什么?
它是如何工作的?
为什么它比使用 SQL 数据库更好?它好多少?
该技术是否太新而无法开始实施,还是值得研究?
NoSQL 是一个流行词。
几十年来,当人们谈论数据库时,他们指的是关系数据库。当人们谈论关系数据库时,他们指的是那些你用 Edgar F. Codd 的结构化查询语言控制的数据库。以其他方式存储数据?疯狂!其他任何东西都只是平面文件。
但在过去的几年里,人们开始质疑这个教条。人们想知道具有行和列的表是否真的是表示数据的唯一方式。人们开始思考和编码,并提出了许多如何组织数据的新概念。他们开始创建新的数据库系统,专为这些新的数据处理方式而设计。
所有这些数据库的理念都是不同的。但是所有这些数据库的一个共同点是结构化查询语言不再适合使用它们。所以每个数据库都用自己的查询语言代替了 SQL。因此,NoSQL 这个术语诞生了,作为所有违背经典关系数据库模型的数据库技术的标签。
其实,不多。
你经常听到这样的短语:
真的吗?好吧,对于一些通常称为 NoSQL 的数据库来说,其中一些陈述可能是正确的,但对于至少另一个数据库来说,每一个陈述也是错误的。实际上,NoSQL 数据库唯一的共同点是它们是不使用 SQL 的数据库。就是这样。定义它们的唯一因素是使它们彼此区分开来。
因此,我们明确表示,所有这些通常称为 NoSQL 的数据库都大相径庭,无法一起评估它们。它们中的每一个都需要单独评估,以确定它们是否适合解决特定问题。但是我们从哪里开始呢?值得庆幸的是,NoSQL 数据库可以分为适合不同用例的特定类别:
面向文档
示例:MongoDB、CouchDB
优势:异构数据、工作面向对象、敏捷开发
它们的优点是它们不需要一致的数据结构。当您的需求和数据库布局不断变化时,或者当您处理属于一起但看起来仍然非常不同的数据集时,它们很有用。当您有很多表,其中包含两个名为“key”和“value”的列,那么这些可能值得研究。
图数据库
示例:Neo4j、GiraffeDB。
优势:数据挖掘
虽然大多数 NoSQL 数据库放弃了管理数据关系的概念,但这些数据库比那些所谓的关系数据库更接受它。
他们的重点是通过数据与其他数据的关系来定义数据。当您有很多带有主键的表时,它们是另外两个表的主键(可能还有一些描述它们之间关系的数据),那么这些可能适合您。
键值存储
示例:Redis、Cassandra、MemcacheDB
优势:通过已知键快速查找值
它们非常简单,但这使它们快速且易于使用。如果您不需要存储过程、约束、触发器和所有这些高级数据库功能,而您只想快速存储和检索数据,那么这些就是您的理想之选。
不幸的是,他们假设您确切地知道您在寻找什么。您需要 User157641 的个人资料吗?没问题,只需要几微秒。但是,如果您想要所有年龄在 16 到 24 岁之间、将“华夫饼”作为他们最喜欢的食物并在过去 24 小时内登录的用户的姓名,该怎么办?倒霉。当您没有特定结果的明确且唯一的密钥时,您无法轻易将其从您的 KV 存储中取出。
一些 NoSQL 支持者声称他们最喜欢的 NoSQL 数据库是一种新的做事方式,而 SQL 已成为过去。
他们是对的吗?
不,他们当然不是。尽管存在 SQL 不适合的问题,但它仍然有其优势。许多数据模型最好简单地表示为相互引用的表的集合。尤其是因为大多数数据库程序员接受了数十年的培训,以一种关系方式来思考数据,并且试图将这种思维方式施加到一种并非为它而生的新技术上很少有好的结果。
NoSQL 数据库不是 SQL 的替代品——它们是替代品。
大多数围绕不同 NoSQL 数据库的软件生态系统还没有那么成熟。尽管取得了一些进步,但您仍然没有像流行的 SQL 数据库那样成熟和强大的补充工具。
此外,还有更多关于 SQL 的专业知识。几代计算机科学家在他们的职业生涯中花费了数十年的时间专注于关系数据库的研究,结果表明:关于 SQL 数据库和关系数据建模的文献,无论是实践的还是理论的,都可以填满多个图书馆。如何为您的数据构建关系数据库是一个经过充分研究的主题,很难找到一个没有公认的最佳实践的极端案例。
另一方面,大多数 NoSQL 数据库仍处于起步阶段。我们仍在寻找使用它们的最佳方式。
它到底是什么?
它是如何工作的?
每个标有通用名称的系统的工作方式都不同,但基本思想是通过使用不支持通用 RDBMS 的所有功能但仍有足够功能可用的 DB 模型来提供更好的可伸缩性和性能。在某种程度上,它就像 MySQL,它曾经缺乏对事务的支持,但正因为如此,它的性能优于其他数据库系统。如果您可以以不需要事务的方式编写您的应用程序,那就太好了。
为什么它比使用 SQL 数据库更好?它好多少?
当您的站点需要大规模扩展以致最好的 RDBMS 在您能负担得起的最好的硬件上运行并尽可能优化时,这会更好,根本无法跟上负载。它有多好取决于具体的用例(大量更新活动与大量连接在“传统”RDBMS 上非常困难)——在极端情况下可能是 1000 倍。
该技术是否太新而无法开始实施,还是值得研究?
主要取决于您要实现的目标。它当然已经足够成熟,可以使用了。但很少有应用程序真正需要大规模扩展。对于大多数人来说,传统的 RDBMS 就足够了。然而,随着互联网的使用变得越来越普遍,很可能会变得更加普遍(尽管可能不占主导地位)。
既然有人说我之前的帖子跑题了,我会尽力弥补 :-) NoSQL 不是,也从来不是,旨在替代更主流的 SQL 数据库,但有几句话是为了得到以正确的视角看待事物。
NoSQL 哲学的核心在于考虑,可能出于商业和可移植性的原因,SQL 引擎倾向于忽视 UNIX 操作系统及其衍生系统的巨大功能。
使用基于文件系统的数据库,您可以立即利用底层操作系统不断增长的功能和强大功能,根据摩尔定律,这些功能和功能多年来一直在稳步增长。通过这种方法,许多操作系统命令也自动成为“数据库操作符”(想想“ls”、“sort”、“find”和其他无数的 UNIX shell 实用程序)。
考虑到这一点,再加上一点创造力,你确实可以设计出一个基于文件系统的数据库,它能够克服许多常见 SQL 引擎的限制,至少对于特定的使用模式而言,这就是 NoSQL 哲学背后的全部要点,我的看法。
我经营着数百个网站,它们都或多或少地使用了 NoSQL。事实上,它们并不承载大量数据,但即使其中一些有,我也可能会想到创造性地使用 NoSQL 和文件系统来克服任何瓶颈。使用传统的 SQL“监狱”可能会更加困难。我敦促你在谷歌上搜索“unix”、“manis”和“shaffer”来理解我的意思。
如果我没记错的话,它指的是不一定遵循关系形式的数据库类型。想到文档数据库,没有特定结构的数据库,并且不使用 SQL 作为特定的查询语言。
它通常更适合依赖于数据库性能的 Web 应用程序,并且不需要关系数据库引擎的更高级功能。例如,通过 id 接口提供简单查询的 Key->Value 存储可能比相应的 SQL 服务器实现快 10-100 倍,同时开发人员维护成本更低。
一个例子是这篇关于OLTP Tuple Store 的论文,它为单线程处理牺牲了事务(没有并发问题,因为不允许并发),并将所有数据保存在内存中;与类似的RDBMS驱动系统相比,性能提高了 10-100 倍。基本上,它正在远离 SQL 和数据库系统的“一刀切”视图。
在实践中,NoSQL 是一个支持使用基于密钥的访问策略快速访问大型二进制对象(文档、jpg 等)的数据库系统。这与仅适用于字母数字值的传统 SQL 访问不同。不仅是内部存储和访问策略,而且显示格式的语法和限制都限制了传统 SQL。传统关系数据库的 BLOB 实现也受到这些限制的影响。
在幕后,它间接承认 SQL 模型无法支持任何形式的 OLTP 或支持新的数据格式。“支持”不仅意味着存储,还意味着完整的访问能力——使用标准模型进行编程和查询。
关系爱好者很快将 NoSQL 的定义从 Not-SQL 修改为 Not-Only-SQL,以使 SQL 保持不变!这并不好,尤其是当我们看到当今大多数 Java 程序都求助于底层关系模型的 ORM 映射时。一个新的概念必须有一个明确的定义。否则它最终会像 SOA 一样。
NoSQL 系统的基础在于随机键值对。但这并不新鲜。像 IMS 和 IDMS 这样的传统数据库系统确实支持散列随机密钥(不使用任何索引)并且它们仍然支持。事实上,IDMS 已经有一个关键字 NONSQL,它们支持 SQL 访问他们称为 NONSQL 的旧网络数据库。
就像按摩浴缸:既是品牌又是通用名称。它不仅仅是一种特定的技术,而是一种特定类型的技术,在这种情况下指的是大型(通常是稀疏的)“数据库”,例如 Google 的 BigTable 或 CouchDB。
NoSQL 是一种数据库系统,它不使用基于字符串的 SQL 查询来获取数据。
相反,您使用他们将提供的 API 构建查询,例如 Amazon DynamoDB 是 NoSQL 数据库的一个很好的例子。
NoSQL 数据库更适合可扩展性很重要的大型应用程序。
NoSQL 是指非关系型数据库吗?
是的,NoSQL 不同于 RDBMS 和 OLAP。它使用比传统关系数据库更松散的一致性模型。
一致性模型用于分布式系统,如分布式共享内存系统或分布式数据存储。
它在内部如何运作?
NoSQL 数据库系统通常针对检索和追加操作进行了高度优化,并且除了记录存储(例如键值存储)之外,通常提供的功能很少。与完整的 SQL 系统相比,运行时灵活性的降低可以通过某些数据模型的可扩展性和性能的显着提升来弥补。
它可以处理结构化和非结构化数据。它使用集合而不是表
你如何查询这样的“数据库”?
观看SQL 与 NoSQL:后端之战;它解释了一切。